Codice errato per come ho impostato i collegamenti

Salve, sono riuscito a ingranare il meccanismo di Arduino dopo varie letture del manuale e come primo programmino da solo ho voluto provare a modificare e ampliare il progetto 03 del manuale.
Ho aggiunto un altro led e un "cicalino"( il coso che fa rumore).
Il codice originario è:

const int sensorPin = A0;
const float baselineTemp = 20.0;
void setup() {
  Serial.begin(9600); //apri una porta seriale
  for(int pinNumber = 2; pinNumber<=8; pinNumber++){
    pinMode(pinNumber, OUTPUT);
    digitalWrite(pinNumber, LOW);
  }
}
void loop(){
 int sensorVal = analogRead(sensorPin);
 Serial.print("Sensor Value: ");
 Serial.print(sensorVal);
 // converti la lettura ADC in tensione
 float voltage = (sensorVal/1024.0) * 5.0;
 Serial.print(", Volts: ");
 Serial.print(voltage);
 Serial.print(", degrees C: ");
 // converti la tensione in temperatura
 float temperature = (voltage - .5) * 100;
 Serial.println(temperature);
 if(temperature < baselineTemp){
   digitalWrite(2, LOW);
   digitalWrite(3, LOW);
   digitalWrite(4, LOW);
   }else if(temperature >= baselineTemp+2 &&
   temperature < baselineTemp+4){
   digitalWrite(2, HIGH);
   digitalWrite(3, LOW);
   digitalWrite(4, LOW);
   }else if(temperature >= baselineTemp+4 &&
   temperature < baselineTemp+6){
   digitalWrite(2, HIGH);
   digitalWrite(3, HIGH);
   digitalWrite(4, LOW);
   }else if(temperature >= baselineTemp+6 &&
   temperature < baselineTemp+8){
   digitalWrite(2, HIGH);
   digitalWrite(3, HIGH);
   digitalWrite(4, HIGH);
   }
   delay(1000);
}

e questo questo quello modificato da me:

int sensorValue;
int sensorLow = 1023;
int sensorHigh = 0;
const int sensorPin = A0;
const int ledPin = 13;
const float baselineTemp = 20.0;
void setup() {
  Serial.begin(9600); //apri una porta seriale
  for(int pinNumber = 2; pinNumber<=8; pinNumber++){
    pinMode(pinNumber, OUTPUT);
    digitalWrite(pinNumber, LOW);
  }
  while (millis() < 5000) {
    sensorValue = analogRead(A0);
    if (sensorValue > sensorHigh){
      sensorHigh = sensorValue;
    }
    if (sensorValue < sensorLow) {
      sensorLow = sensorValue;
    }
  }
}
void loop(){
 int sensorVal = analogRead(sensorPin);
 Serial.print("Sensor Value: ");
 Serial.print(sensorVal);
 // converti la lettura ADC in tensione
 float voltage = (sensorVal/1024.0) * 5.0;
 Serial.print(", Volts: ");
 Serial.print(voltage);
 Serial.print(", degrees C: ");
 // converti la tensione in temperatura
 float temperature = (voltage - .5) * 100;
 Serial.println(temperature);
 if(temperature < baselineTemp){
   digitalWrite(2, LOW);
   digitalWrite(3, LOW);
   digitalWrite(4, LOW);
   digitalWrite(5, LOW);
   digitalWrite(8, LOW);
   }else if(temperature >= baselineTemp+2 &&
   temperature < baselineTemp+4){
   digitalWrite(2, HIGH);
   digitalWrite(3, LOW);
   digitalWrite(4, LOW);
   digitalWrite(5, LOW);
   digitalWrite(8, LOW);
   }else if(temperature >= baselineTemp+4 &&
   temperature < baselineTemp+6){
   digitalWrite(2, HIGH);
   digitalWrite(3, HIGH);
   digitalWrite(4, LOW);
   digitalWrite(5, LOW);
   digitalWrite(8, LOW);
   }else if(temperature >= baselineTemp+6 &&
   temperature < baselineTemp+8){
   digitalWrite(2, HIGH);
   digitalWrite(3, HIGH);
   digitalWrite(4, HIGH);
   digitalWrite(5, LOW);
   digitalWrite(8, LOW);
   }else if(temperature >= baselineTemp+8){
   digitalWrite(2, HIGH);
   digitalWrite(3, HIGH);
   digitalWrite(4, HIGH);
   digitalWrite(5, LOW);
  sensorValue = analogRead(A0);
  int pitch =
    map(sensorValue,sensorLow,sensorHigh, 400, 4000);
  tone(8, pitch,20);
   }
   delay(1000);
}

La mia idea consisteva nel rendere il termometro proposto dal libro più accurato e aggiungere più led e un sensore sonoro. Qui sotto allego la foto di come dovrebbe essere il circuito; ho solo un problema con il codice da usare

Scusate se ho sbagliato categoria e per il titolo poco chiaro.

Non aprire in Megatopics, questa sezione è per progetti finiti e che il forum ha deciso di rendere meritevoli.
Apri in Generale.

P.S. ancora per questa volta l'admin te lo sposta, la prossima ti cancella il thread

ok grazie

te sapresti aiutarmi col codice?

  1. a cosa serve quel while millis nella setup ?
  2. cosa non funziona ?

non saprei, ho copiato il codice che da nel libro.
Il cicalino suona sempre e non quando la temperatura supera i 30 gradi e poi cambia sempre tonalita in base alla temperatura

  1. se crei delle costanti per i pin usa quelli e NON usare il numero del pin in giro, esempio sensorPin vale A0, se leggi in altre parti del programma usa SEMPRE sensorPin e non A0, altrimenti NON ha senso creare i nomi costanti.
  2. io ti suggerisco di usare sempre i nomi costanti, anche per i vari led e NON mi piace quel sistema del for che spara i pin in OUTPUT da 2 a 8 quando poi 6 e 7 non li usi
  3. quel ciclo while sinceramente NON capisco a che serve e cosa fa. Buttalo.
  4. nel loop hai gia letto il sensore con int sensorVal = analogRead(sensorPin);
    inutile poi rileggerlo per il tone.
  5. per me la tone devi accenderla quando serve (ma ti manca l'if del >30 gradi
    ed usare notone() dove deve rimanere spento

sapresti aiutarmi a scrivere un codice decente che funzioni ?

Per semplificare mettiamo le variabili e le costanti tutte ad inizio programma:
Uso byte invece di int, perchè byte accetta numeri da 0 a 255 mentre int da 0 a 65535. Byte basta.
Per la nota uso la #define, un diverso modo di dichiarare una costante

#define NOTE_A3  220
const float baselineTemp = 20.0;
const byte pinSensor = A0;
const byte pinLed0 = 2;
const byte pinLed1 = 3;
const byte pinLed2 = 4;
const byte pinLed3 = 5;
const byte buzPin = 8;
int sensorVal;
float temperature,voltage;
1 Like

"byte" cosa sarebbe?
Scusa ma non ci capisco ancora molto, sto ancora imparando.

e perche il buzPin è sul pin 8?

Perchè nel tuo disegno è sul 7 ma nel codice fai tone(8 !!! o sbagli disegno o nel codice

"byte - Arduino Reference"

Per caso posso contattarti tipo su discord o telegram?

a ok, ho sbagliato nel disegno

void setup() 
{ delay(1000);                // ritardo partenza 
  Serial.begin(9600);         //apri una porta seriale
  Serial.println("Avvio programma");
  pinMode(pinLed0, OUTPUT);
  pinMode(pinLed1, OUTPUT);
  pinMode(pinLed2, OUTPUT);
  pinMode(pinLed3, OUTPUT);
  digitalWrite(pinLed0, LOW);
  digitalWrite(pinLed1, LOW);
  digitalWrite(pinLed2, LOW);
  digitalWrite(pinLed3, LOW);
  noTone(buzPin);
}

Se ti va dopo mi spiegheresti nel dettaglio come funzionano le varie linee?

Hai copiato il seguente codice:

while (millis() < 5000) {
    sensorValue = analogRead(A0);
    if (sensorValue > sensorHigh){
      sensorHigh = sensorValue;
    }
    if (sensorValue < sensorLow) {
      sensorLow = sensorValue;
    }
  }

dal progetto 06 light theremin.

Perché lo hai fatto visto che non hai capito a cosa serve?

Prova cosi:

#define NOTE_A3  220
const float baselineTemp = 20.0;
const byte pinSensor = A0;
const byte pinLed0 = 2;
const byte pinLed1 = 3;
const byte pinLed2 = 4;
const byte pinLed3 = 5;
const byte buzPin = 8;
int sensorVal;
float temperature, voltage;

void setup() 
{ 
  delay(1000);                // ritardo partenza 
  Serial.begin(9600);         //apri una porta seriale
  Serial.println("Avvio programma");
  pinMode(pinLed0, OUTPUT);
  pinMode(pinLed1, OUTPUT);
  pinMode(pinLed2, OUTPUT);
  pinMode(pinLed3, OUTPUT);
  digitalWrite(pinLed0, LOW);
  digitalWrite(pinLed1, LOW);
  digitalWrite(pinLed2, LOW);
  digitalWrite(pinLed3, LOW);
  noTone(buzPin);
}

void loop() 
{
  sensorVal = analogRead(pinSensor);
  voltage = (sensorVal / 1024.0) * 5.0;      // converti la lettura ADC in tensione
  temperature = (voltage - 0.5) * 100.0;     // converti la tensione in temperatura
  Serial.print("Sensor Value: "); Serial.print(sensorVal);
  Serial.print(", Volts: ");      Serial.print(voltage); 
  Serial.print(", degrees C: ");  Serial.println(temperature);
  if (temperature < baselineTemp) 
  {
    digitalWrite(pinLed0, LOW);
    digitalWrite(pinLed1, LOW);
    digitalWrite(pinLed2, LOW);
    digitalWrite(pinLed3, LOW);
    noTone(buzPin);
  } else if (temperature >= baselineTemp + 2 &&
             temperature < baselineTemp + 4) 
  {
    digitalWrite(pinLed0, HIGH);
    digitalWrite(pinLed1, LOW);
    digitalWrite(pinLed2, LOW);
    digitalWrite(pinLed3, LOW);
    noTone(buzPin);
  } else if (temperature >= baselineTemp + 4 &&
             temperature < baselineTemp + 6) 
  {
    digitalWrite(pinLed0, HIGH);
    digitalWrite(pinLed1, HIGH);
    digitalWrite(pinLed2, LOW);
    digitalWrite(pinLed3, LOW);
    noTone(buzPin);
  } else if (temperature >= baselineTemp + 6 &&
             temperature < baselineTemp + 8) 
  {
    digitalWrite(pinLed0, HIGH);
    digitalWrite(pinLed1, HIGH);
    digitalWrite(pinLed2, HIGH);
    digitalWrite(pinLed3, LOW);
    noTone(buzPin);
  } else if (temperature >= baselineTemp + 8) &&
             temperature < baselineTemp + 10) 
  {
    digitalWrite(pinLed0, HIGH);
    digitalWrite(pinLed1, HIGH);
    digitalWrite(pinLed2, HIGH);
    digitalWrite(pinLed3, HIGH);
    noTone(buzPin);
  } else if (temperature >= baselineTemp + 10) 
  {
    digitalWrite(pinLed0, HIGH);
    digitalWrite(pinLed1, HIGH);
    digitalWrite(pinLed2, HIGH);
    digitalWrite(pinLed3, HIGH);
    tone(buzPin, NOTE_A3, 200);   // 220=nota 200=durata
  }
  delay(1000);
}

Per il codice, cerca con google "Arduino Marsella"
trovi 2 pdf gratuiti scritti da una prof.

  • Programmare Arduino di Tiziana Marsella
  • Elementi base del linguaggio di programmazione di Arduino

perche senza quello non riuscivo a far suonare il piezo.

questo ? Programmare Arduino di Tiziana Marsella - PROGETTI ARDUINO

questo? http://www.angeloangeletti.it/PLS/2017-2018/Tiziana%20Marsella%20-%20Programmare%20Arduino.pdf