Il caldo è ormai dietro l’angolo e mi troverà pronto: ho collegato all’Arduino un ventilatore e l’ho programmato perché si accenda da solo oltre una certa temperatura. Ho aggiunto anche una luce che cambia colore a seconda della temperatura rilevata. Ingedienti:
- Breadboard
- Ventilatore
- Arduino 2009
- Sensore temperatura
- Relè
- Led RGB tipo anodo comune
- Connettori assortiti
Prossimo passo: impostare la temperatura di accensione da una interfaccia web, e regolare la luce del led a seconda della luce ambiente.
Se è vero che code is poetry, quanto segue dopo il salto si colloca abbastanza sotto a capolavori come “La Vispa Teresa”. Sicuramente esistono altri dieci modi più eleganti per gestire le combinazioni di colori da associare alle diverse temperature, ma la mia ignoranza enciclopedica per ora non mi permette altro.
Se puoi e vuoi illuminarmi, ne sarò felice.
int greenPin = 5; int redPin = 6; int bluePin = 4; int tPin = A2; // Temperature sensor pin int lPin = A1; // Light sensor pin int temp; // Temperature in C° int outPin = 9; // fan relais pin int luce; // light in Lux; not used void setup() { pinMode(redPin, OUTPUT); pinMode(greenPin, OUTPUT); pinMode(bluePin, OUTPUT); pinMode(outPin, OUTPUT); analogWrite(redPin, 255); analogWrite(greenPin, 255); analogWrite(bluePin, 255); // Serial.begin(9600); } void loop() { // from V to °C temp = ( 5.0 * analogRead(tPin) * 100.0) / 1024.0; // from V to Lux, not used luce = (analogRead(lPin) * 10000.0) / 1024.0; if(temp <= 18) { analogWrite(bluePin, 0); analogWrite(greenPin,255); analogWrite(redPin,255); } else if(temp == 19) { analogWrite(bluePin, 51); analogWrite(greenPin,255); analogWrite(redPin,255); } else if(temp == 20) { analogWrite(bluePin, 102); analogWrite(greenPin,255); analogWrite(redPin,255); } else if(temp == 21) { analogWrite(bluePin, 153); analogWrite(greenPin,153); analogWrite(redPin,255); } else if(temp == 22) { analogWrite(bluePin, 204); analogWrite(greenPin,102); analogWrite(redPin,255); } else if(temp == 23) { analogWrite(bluePin, 255); analogWrite(greenPin,51); analogWrite(redPin,255); } else if(temp == 24) { analogWrite(bluePin, 255); analogWrite(greenPin,0); analogWrite(redPin,255); } else if(temp == 25) { analogWrite(bluePin, 255); analogWrite(greenPin,51); analogWrite(redPin,255); } else if(temp == 26) { analogWrite(bluePin, 255); analogWrite(greenPin,102); analogWrite(redPin,204); } else if(temp == 27) { analogWrite(bluePin, 255); analogWrite(greenPin,153); analogWrite(redPin,153); } else if(temp == 28) { analogWrite(bluePin, 255); analogWrite(greenPin,204); analogWrite(redPin,102); } else if(temp == 29) { analogWrite(bluePin, 255); analogWrite(greenPin,255); analogWrite(redPin,51); } else if(temp >= 30) { analogWrite(bluePin, 255); analogWrite(greenPin,255); analogWrite(redPin,0); } if(temp > 27) { digitalWrite(outPin, HIGH); } else { digitalWrite(outPin, LOW); } delay(10000); // Serial.println(temp); // Serial.println(); }
Non che conosca il C++, ma al posto di quei fastidiosi if-elseif, forse potresti usare lo switch che è un po’ più chiaro.
http://programmazione.html.it/guide/lezione/1165/le-istruzioni-switch/
bello switch case, però non posso usarlo per la variabile maggiore di X o minore di Y, giusto? oppure come si fa?
Vediamo se non sono troppo rincoglionito farei così, però non ti assicuro che funzioni (fai un backup del tuo script che almeno funziona), di solito programmo in php:
void loop()
{
// from V to °C
temp = ( 5.0 * analogRead(tPin) * 100.0) / 1024.0;
// from V to Lux, not used
luce = (analogRead(lPin) * 10000.0) / 1024.0;
switch(temp) {
case (temp == 20)
analogWrite(bluePin, 102);
analogWrite(greenPin,255);
analogWrite(redPin,255);
break;
case (temp == 21)
analogWrite(bluePin, 153);
analogWrite(greenPin,153);
analogWrite(redPin,255);
break;
case (temp == 22)
analogWrite(bluePin, 204);
analogWrite(greenPin,102);
analogWrite(redPin,255);
break;
case (temp == 23)
analogWrite(bluePin, 255);
analogWrite(greenPin,51);
analogWrite(redPin,255);
break;
case(temp == 24)
analogWrite(bluePin, 255);
analogWrite(greenPin,0);
analogWrite(redPin,255);
break;
case(temp == 25)
analogWrite(bluePin, 255);
analogWrite(greenPin,51);
analogWrite(redPin,255);
break;
case(temp == 26)
analogWrite(bluePin, 255);
analogWrite(greenPin,102);
analogWrite(redPin,204);
break;
case(temp == 27)
analogWrite(bluePin, 255);
analogWrite(greenPin,153);
analogWrite(redPin,153);
break;
case(temp == 28)
analogWrite(bluePin, 255);
analogWrite(greenPin,204);
analogWrite(redPin,102);
break;
case(temp == 29)
analogWrite(bluePin, 255);
analogWrite(greenPin,255);
analogWrite(redPin,51);
break;
case(temp >= 30)
analogWrite(bluePin, 255);
analogWrite(greenPin,255);
analogWrite(redPin,0);
break;
} // Chiude lo switch
eh, ci avevo provato anch’io ma all’Arduino non gli piace quel “case (temp >=)”, lui vuole solo “case 30”
per i casi specifici usi il case, per gli altri il default…
es caso temp=27 case (temp==27)
per i casi maggiori di 30 usa default
ovviamente nel default differenzi altri due casi:
if temp>30 fai questo else if temp<18 fai quest'altro.
L'if-else di norma riduce le prestazioni del codice quando i casi sono + di due, ergo quando hai + di due casi usa lo switch.
switch(temp) {
case (temp == 20)
analogWrite(bluePin, 102);
analogWrite(greenPin,255);
analogWrite(redPin,255);
break;
case (temp == 21)
analogWrite(bluePin, 153);
analogWrite(greenPin,153);
analogWrite(redPin,255);
break;
case (temp == 22)
analogWrite(bluePin, 204);
analogWrite(greenPin,102);
analogWrite(redPin,255);
break;
case (temp == 23)
analogWrite(bluePin, 255);
analogWrite(greenPin,51);
analogWrite(redPin,255);
break;
case(temp == 24)
analogWrite(bluePin, 255);
analogWrite(greenPin,0);
analogWrite(redPin,255);
break;
case(temp == 25)
analogWrite(bluePin, 255);
analogWrite(greenPin,51);
analogWrite(redPin,255);
break;
case(temp == 26)
analogWrite(bluePin, 255);
analogWrite(greenPin,102);
analogWrite(redPin,204);
break;
case(temp == 27)
analogWrite(bluePin, 255);
analogWrite(greenPin,153);
analogWrite(redPin,153);
break;
case(temp == 28)
analogWrite(bluePin, 255);
analogWrite(greenPin,204);
analogWrite(redPin,102);
break;
case(temp == 29)
analogWrite(bluePin, 255);
analogWrite(greenPin,255);
analogWrite(redPin,51);
break;
default
if (temp<18)
bla bla bla
else
bla bla bla
break;
@paki: http://arduino.cc/en/Reference/SwitchCaseda quello che ho capito e provato, lo switch case di Arduino non supporta la parentesi e non supporta il segno di uguale. Devi scrivere “case 27” e basta.
d’accordo la sintassi è sbagliata, ma la logica è quella.