### 5.6 Sistema di Alimentazione Intelligente #### 5.6.1 Sportello della cabina di alimentazione Aprire il codice **5.6.1Servo** con Arduino IDE. ```c #include //Import the library of servo Servo myservo; // create servo object to control a servo // 16 servo objects can be created on the ESP32 int pos = 0; // variable to store the servo position // Recommended PWM GPIO pins on the ESP32 include 2,4,12-19,21-23,25-27,32-33 int servoPin = 26; void setup() { Serial.begin(9600); myservo.attach(servoPin); // attaches the servo on pin 26 to the servo object myservo.write(180); delay(2000); } void loop() { for (pos = 80; pos <= 179; pos += 1) { // goes from 0 degrees to 80 degrees // in steps of 1 degree myservo.write(pos); // tell servo to go to position in variable 'pos' delay(15); // waits 15ms for the servo to reach the position } for (pos = 180; pos >= 81; pos -= 1) { // goes from 80 degrees to 0 degrees myservo.write(pos); // tell servo to go to position in variable 'pos' delay(15); // waits 15ms for the servo to reach the position } } ``` Scegliere la scheda **ESP32 Dev Module** e la porta **COM**, quindi caricare il codice. ![5458448](../media/5458448.png) **Risultato del test:** Lo sportello della cabina di alimentazione si apre lentamente e poi si chiude. **NOTA:** Il servo SG90 può ruotare di 180°. Poiché la scatola di alimentazione è piccola, una rotazione di 100° è sufficiente per chiudere completamente la scatola. 80°: completamente aperto 120°: semiaperto 180°: chiuso ![cou63](../media/cou63.gif) **ATTENZIONE** Non mettere le dita nella scatola per evitare di pizzicarsi! Non bloccare lo sportello con qualcosa per evitare di danneggiare il servo! Lo sportello è controllato da un servo. **Struttura interna:** ![cou61](../media/cou61.png) ① Segnale (S): Riceve il segnale di controllo dal microcontrollore. ② Potenziometro: la parte di feedback del Servo. Misura la posizione dell'albero di uscita. ③ Scheda incorporata (Controller interno): il cuore del Servo. Elabora il segnale di controllo esterno e il segnale di feedback della posizione e aziona il Servo. ④ Motore DC: la parte di esecuzione. Fornisce velocità, coppia e posizione. ⑤ Sistema di ingranaggi: Scala le uscite dal motore all'angolo di uscita finale secondo un certo rapporto di trasmissione. **Azionare il Servo:** Il segnale (S) riceve il PWM per controllare l'uscita del Servo, e la posizione dell'albero di uscita dipende direttamente dal duty cycle del PWM. **Per esempio:** A. Se inviamo un segnale con larghezza di impulso di 1.5ms al Servo, il suo albero (corno) ruoterà nella posizione centrale (90°); B. Se la larghezza di impulso = 0.5ms, l'albero ruota al suo minimo (0°); C. Se la larghezza di impulso = 2.5ms, l'albero ruota al suo massimo (180°). **NOTA: L'angolo massimo varia a seconda del tipo di Servo. Alcuni sono 170° mentre altri sono solo 90°. Nonostante ciò, i Servo di solito si muoveranno della metà (del massimo) se ricevono un segnale con larghezza di impulso di 1.5ms.** #### 5.6.2 Sensore Ultrasonico ![cou65](../media/cou65.png) ![couy61](../media/couy61.png) Aprire il codice **5.6.2 Ultrasonic-Sensor** con Arduino IDE. ```c #define Trigpin 12 //connect trig to io12 #define Echopin 13 //connect echo to io13 int duration,distance; void setup(){ Serial.begin(9600); //Set the baud rate to 9600 pinMode(Trigpin,OUTPUT); //set trig pin to output mode pinMode(Echopin,INPUT); //set echo pin to input mode } void loop(){ digitalWrite(Trigpin,LOW); delayMicroseconds(2); digitalWrite(Trigpin,HIGH); delayMicroseconds(10); //Trigger the trig pin via a high level lasting at least 10us digitalWrite(Trigpin,LOW); duration = pulseIn(Echopin,HIGH); //the time of high level at echo pin distance = duration/58; //convert into distance(cm) delay(50); Serial.print("distance:"); //Serial monitor prints the value Serial.print(distance); Serial.println("cm"); } ``` Scegliere la scheda **ESP32 Dev Module** e la porta **COM**, quindi caricare il codice. ![5458448](../media/5458448.png) **Risultato del test:** In questo kit, il raggio di rilevamento è compreso tra 3 e 8 cm. Aprire il monitor seriale e impostare la velocità di trasmissione a 9600, il monitor seriale visualizzerà la distanza tra il modulo ultrasonico e l'ostacolo di fronte. ![image-20250417140529545](../media/image-20250417140529545.png) #### 5.6.3 Sistema di Alimentazione Intelligente Aprire il codice **5.6.3Intelligent-Feeding-System** con Arduino IDE. ```c #include //Import the library of servo on ESP32 board Servo myservo; // create servo object to control a servo // 16 servo objects can be created on the ESP32 #define TrigPin 12 //connect trig to D12 #define EchoPin 13 //connect echo to D13 #define ServoPin 26 int duration,distance; void setup(){ Serial.begin(9600); //Set the baud rate to 9600 pinMode(TrigPin,OUTPUT); //set trig pin to output mode pinMode(EchoPin,INPUT); //Set echo pin to input mode myservo.attach(ServoPin); // attaches the servo on pin 26 to the servo object } void loop(){ Serial.println(getDistance()); //When the distance is detected within 2~7cm, open the feeding box. Or else, close. if (getDistance() >= 2 && 7 >= getDistance()) { //Servo rotates to 80° to open the box myservo.write(80); delay(500); } else{ myservo.write(180); delay(500); } } //Put the gotten distance in a function float getDistance() { digitalWrite(TrigPin,LOW); delayMicroseconds(2); digitalWrite(TrigPin,HIGH); delayMicroseconds(10); //Trigger the trig pin via a high level lasting at least 10us digitalWrite(TrigPin,LOW); duration = pulseIn(EchoPin,HIGH); //the time of high level at echo pin distance = duration/58; //convert into distance(cm) delay(50); return distance; } ``` Scegliere la scheda **ESP32 Dev Module** e la porta **COM**, quindi caricare il codice. ![5458448](../media/5458448.png) **Risultato del test:** Il sistema di alimentazione intelligente nutre il pollame domestico in modo efficiente grazie a un modulo a ultrasuoni e un servomotore. Il modulo rileva la distanza dagli animali, mentre il servomotore controlla l'apertura e la chiusura della mangiatoia. Quando viene rilevato un animale nelle vicinanze, il servomotore apre la mangiatoia per consentirne l'alimentazione.