Arduino, stai fresco!

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();

}

9 risposte a “Arduino, stai fresco!”

    1. bello switch case, però non posso usarlo per la variabile maggiore di X o minore di Y, giusto? oppure come si fa?

      1. 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

        1. eh, ci avevo provato anch’io ma all’Arduino non gli piace quel “case (temp >=)”, lui vuole solo “case 30”

          1. 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

          2. 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.

          3. 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;

          4. @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.

I commenti sono chiusi.