aiuto per "errore exit status 1"

buongiorno, sto completando il mio programma ma quando faccio “verifica” l’ide mi dà un errore che non riesco a capire cos’è, mi potete gentilmente aiutare a capire??
l’errore è:
exit status 1
Errore durante la compilazione per la scheda Arduino/Genuino Uno.

questo è il codice:

#include <Adafruit_Sensor.h>
#include <DHT_U.h>
#include <DHT.h>
#include <Servo.h>

Servo servo_4;

#define DHTPIN 13 // pin di arduino a cui connetto il sensore
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
int stato; //per funzione relè
int val=18; // temperatura da mantenere
int ledstato = 2;
int ledmovimento = 3;
int rele = 4;
int startcentrale = 5;
int finecorsa = 6;
int riarmo = 7;
int termometro = 11;
int servo = 12;



bool blinking = false; //defines when blinking should occur
unsigned long blinkInterval = 700; // number of milliseconds for blink
unsigned long currentMillis; // variables to track millis()
unsigned long previousMillis;

void setup()
{
  pinMode(startcentrale, INPUT); //pulsante avvio sistema
  pinMode(finecorsa, INPUT); //pulsante lampeggio movimento/reset motore
  pinMode(riarmo, INPUT); //pulsante riarmo
  pinMode(ledstato, OUTPUT); // led stato sistema prenotato
  servo_4.attach(12);
  pinMode(rele, OUTPUT); //relè riscaldamento
  pinMode(ledmovimento, OUTPUT); //led lampeggio movimento
  stato=0; //per funzione relè
  pinMode(DHTPIN, INPUT); // sensore temperatura

Serial.begin(9600); // inizializzo la comunicazione seriale
Serial.println("Test Sensore DHTxx!");
Serial.println(""); 

dht.begin(); // inizializzo la comunicazione del sensore
  
}

void loop()
{
float h = dht.readHumidity(); 
float t = dht.readTemperature(); 

// controllo l'avvenuta comunicazione, ed avvio la scrittuta dei dati sulla seriale, ed in caso negativo scrito che è fallita
if (isnan(t) || isnan(h)) {
Serial.println("Errore lettura sensore DHT FALLITA");
} else {
Serial.print("Umidita': "); 
Serial.print(h); 
Serial.print(" %\t"); 
Serial.print("Temperatura: "); 
Serial.print(t); 
Serial.println(" *C"); 
}

Serial.println(""); 
  //prova
  // this code blinks the LED
 if (blinking) {
  currentMillis = millis(); // better to store in variable, for less jitter
  if ((unsigned long)(currentMillis - previousMillis) >= blinkInterval) { // enough time passed yet?
   digitalWrite((ledmovimento), !digitalRead((ledmovimento))); // shortcut to toggle the LED
   digitalWrite((ledstato), !digitalRead((ledmovimento))); //prova intermittenza
   previousMillis = currentMillis; // sets the time we wait "from"
  }
 } else {
  digitalWrite((ledmovimento), LOW); // force LED off when not blinking
 }
 int reading = digitalRead(finecorsa);
 delay(50); // crude de-bouncing
 
 if (reading==LOW) // buttons with pull-up are pressed when LOW
  blinking=true; // start blinking
 else
  blinking=false; // stop blinking
   //originale da qui in giu 
  if (digitalRead(startcentrale)==1 and stato==0) //funzione per effetto relè
  {
    stato=1;
  }
  else if (digitalRead(riarmo)==1 and stato==1)
  {
    stato=0;
  }
  if (stato==1) //accensione
  {
     if (digitalRead(finecorsa) == (HIGH && (stato == 1))) 
     {
     digitalWrite(ledstato, HIGH); //accensione led notifica
     }
    servo_4.write(90);
    if (t<val) //temperatura di mantenimento
    {
      digitalWrite (rele, HIGH); //accensione relè
    }
    else
    {
      digitalWrite (rele, LOW); //spegnimento relè
    }
  } 
  if (stato==0) //riarmo sistema
   {
     if (digitalRead(finecorsa) == (HIGH && (stato == 0))) 
     {
    digitalWrite(ledstato, LOW); //spegnimento led notifica
     }
    servo_4.write(0); //rotazione servo per blocco molla
    digitalWrite(rele, LOW); //spegnimento relè riscaldamento
  }
  
  delay(10); // Delay a little bit to improve simulation performance
  }

secondo me il problema stà nella gestione della temperatura col sensore dht11 perchè è l’ultima coa che ho aggiunto

Prima di quella frase viene scritto l’errore.

Hai la libreria #include <Adafruit_Sensor.h> ?

if (digitalRead(startcentrale)==1 and stato==0) questo è un errore, ce ne sono altri così "and" non esiste si scrive "&&" ... senza virgolette

Patrick_M: if (digitalRead(startcentrale)==1 and stato==0) questo è un errore, ce ne sono altri così "and" non esiste si scrive "&&" ... senza virgolette

Non è esatto ... le ultime versioni di GCC accettano anche "and" ed "or" anche se, per ovvie ragioni di compatibilità con l'ANSI C e con gli altri compilatori ... se ne [u]sconsiglia[/u] caldamente l'uso.

Guglielmo

grazie Guglielmo ... ne ho imparata un'altra

if (digitalRead(finecorsa) == (HIGH && (stato == 0)))

anche questa linea non so se ti da il risultato che vorresti...

risolto il problema, non mi ero accorto che c'erano altre righe di errore sopra a quelle. praticamente il problema è che avevo inserito 3 librerie diverse per lo stesso sensore, eliminate 2 il compilatore mi dà ok! le avevo inserite tutte e 3 come suggerito in un videotutorial su yuotube, ma non è corretto.

tutto il resto del codice lo avevo provato su simulatore e funzionava... quindi mi consigliate di sostituire tutti gli and con && ?

Patrick_M: grazie Guglielmo ... ne ho imparata un'altra

if (digitalRead(finecorsa) == (HIGH && (stato == 0)))

anche questa linea non so se ti da il risultato che vorresti...

questa riga compilata così mi ha risolto un problema ai led perchè con 2 led devo fare 2 funzioni distinte e ci sono 4 condizioni di stato diverse che possono accavallarsi o A e B spenti o A e B che lampeggiano alternati (ma un'altra funzione richiederebbe A spento e B acceso) o A e B che lampeggiano alternati (ma un'altra funzione richiederebbe A e B spenti) o A spento e B acceso

prima mi inserire la modifica a quella riga i led lampegiavano in modo "casuale"

acuplush: ... questa riga compilata così mi ha risolto un problema ai led perchè con 2 led devo fare 2 funzioni distinte e ci sono 4 condizioni di stato diverse che possono accavallarsi o A e B spenti o A e B che lampeggiano alternati (ma un'altra funzione richiederebbe A spento e B acceso) o A e B che lampeggiano alternati (ma un'altra funzione richiederebbe A e B spenti) o A spento e B acceso

prima mi inserire la modifica a quella riga i led lampegiavano in modo "casuale"

però in questo caso è equivalente a scriverla così...

mannaggia, è la seconda volta che ricontrollo e sbaglio a scriverla :))

if (digitalRead(finecorsa) == (1 && 1));

ora dovrebbe essere giusta ;)

Patrick_M: però in questo caso è equivalente a scriverla così...

if (digitalRead(finecorsa) == (1 && stato));

ma "finecorsa" può essere sia HIGH che LOW e anche "stato" può essere sia 0 che 1, così come scritto da te non lo capisce

sto andando in confusione, io devo dirgli: esegui il codice se il "pulsante finecorsa" è premuto e la funzione "stato" è uguale a 1

scritta così come l'hai messa tu come fa a capirlo? if (digitalRead(finecorsa) == (1 && 1));

la funzione stato può essere sia 0 che 1, la utilizzo per fare un "effetto interruttore" con 2 pulsanti, uno accende e uno spegne

if (stato == 1) //accensione                                                 // qui stato =1
  {
    // qui fai un and tra 1 (HIGH) e la condizione stato==1
    // siccome siamo sicuri che stato = 1 la condizione è vera per cui 1 and 1
    if (digitalRead(finecorsa) == (HIGH && (stato == 1)))      
    {
      digitalWrite(ledstato, HIGH); //accensione led notifica
if (stato == 0) //riarmo sistema                                         // qui stato = 0
  {
    // qui fai un and tra 1 (HIGH) e la condizione stato==0
    // siccome siamo sicuri che stato = 0 la condizione è vera per cui 1 and 1
    if (digitalRead(finecorsa) == (HIGH && (stato == 0)))
    {
      digitalWrite(ledstato, LOW); //spegnimento led notifica

quindi quello che tu fai è

se lo stato è =1 se il finecorsa manca (==1) accendi il led di stato

se lo stato è =0 se il finecorsa manca (==1) spegni il led di stato

Patrick_M: if (stato == 1) //accensione                                                 // qui stato =1  {    // qui fai un and tra 1 (HIGH) e la condizione stato==1    // siccome siamo sicuri che stato = 1 la condizione è vera per cui 1 and 1    if (digitalRead(finecorsa) == (HIGH && (stato == 1)))          {      digitalWrite(ledstato, HIGH); //accensione led notifica

if (stato == 0) //riarmo sistema                                         // qui stato = 0
  {
    // qui fai un and tra 1 (HIGH) e la condizione stato==0
    // siccome siamo sicuri che stato = 0 la condizione è vera per cui 1 and 1
    if (digitalRead(finecorsa) == (HIGH && (stato == 0)))
    {
      digitalWrite(ledstato, LOW); //spegnimento led notifica

ho provato a modificare le due stringhe sul simulatore mettendo if (digitalRead(finecorsa) == (1 && 1)); if (digitalRead(finecorsa) == (1 && 0));

e i led lampegginano in modo casuale. forse perchè il codice che gestisce il lampeggi è esterno alle altre condizioni?

acuplush: sto andando in confusione, io devo dirgli: esegui il codice se il "pulsante finecorsa" è premuto e la funzione "stato" è uguale a 1

scritta così come l'hai messa tu come fa a capirlo? if (digitalRead(finecorsa) == (1 && 1));

la funzione stato può essere sia 0 che 1, la utilizzo per fare un "effetto interruttore" con 2 pulsanti, uno accende e uno spegne

per fare questo devi controllare quando il finecorsa è LOW come dice qui

  int reading = digitalRead(finecorsa);
  delay(50); // crude de-bouncing

  if (reading == LOW) // buttons with pull-up are pressed when LOW
    blinking = true; // start blinking
  else
    blinking = false; // stop blinking
  //originale da qui in giu

quindi devi modivivare le dui if in if ((digitalRead(finecorsa) == LOW) && (stato == 1))

if ((digitalRead(finecorsa) == LOW) && (stato == 0))

Patrick_M: per fare questo devi controllare quando il finecorsa è LOW come dice qui

  int reading = digitalRead(finecorsa);
  delay(50); // crude de-bouncing

  if (reading == LOW) // buttons with pull-up are pressed when LOW     blinking = true; // start blinking   else     blinking = false; // stop blinking   //originale da qui in giu



quindi devi modivivare le dui if in
if ((digitalRead(finecorsa) == LOW) && (stato == 1))

if ((digitalRead(finecorsa) == LOW) && (stato == 0))

esatto, così funziona (mettendo HIGH invece che LOW) che è quello che avevo scritto io all'inizio solo sbagliando una parentesi

acuplush: ho provato a modificare le due stringhe sul simulatore mettendo if (digitalRead(finecorsa) == (1 && 1)); if (digitalRead(finecorsa) == (1 && 0));

e i led lampegginano in modo casuale. forse perchè il codice che gestisce il lampeggi è esterno alle altre condizioni?

il lampeggio viene deciso qui

 int reading = digitalRead(finecorsa);
  delay(50); // crude de-bouncing

  if (reading == LOW) // buttons with pull-up are pressed when LOW
    blinking = true; // start blinking
  else
    blinking = false; // stop blinking
  //originale da qui in giu

e questo dice che se c'è il finecorsa (reading==LOW) allora lampeggia altrimenti no inoltre dentro a blinking nella if lampeggiano i due led (movimento e stato) ma nella else viene spento solo il led movimento

acuplush: esatto, così funziona (mettendo HIGH invece che LOW) che è quello che avevo scritto io all'inizio solo sbagliando una parentesi

mettendo HIGH controlli che NON ci sia il finecorsa premuto

quindi il contrario di quello che hai detto prima:" io devo dirgli: esegui il codice se il "pulsante finecorsa" è premuto e la funzione "stato" è uguale a 1"

Patrick_M: il lampeggio viene deciso qui

 int reading = digitalRead(finecorsa);
  delay(50); // crude de-bouncing

 if (reading == LOW) // buttons with pull-up are pressed when LOW    blinking = true; // start blinking  else    blinking = false; // stop blinking  //originale da qui in giu




e questo dice che se c'è il finecorsa (reading==LOW) allora lampeggia
altrimenti no
inoltre dentro a blinking nella if lampeggiano i due led (movimento e stato)
ma nella else viene spento solo il led movimento

LOW lampeggia quando il finecorsa (al punto di riposo) non è premuto (perchè appunto il lampeggio mi serve come avviso che il motore è in movimento)

in else spengo solo il led movimento perchè il led stato è gestito dalle due funzioni di cui si parlava prima.

quindi la priorità su tutto cè l'ha il lameggio che mi avvisa se il motore è in movimento, poi quando và a riposo verrà gestito il led di stato che mi indica se il resto del ciclo è in funzione o no.

forse ora non ti tornano i conti perchè sto facendo le prove con un servo ma poi devo sostituirlo con un motore passo-passo che allo start (dove ora il servo fà solo +90) farà andata e ritorno da solo per poi stare fermo al punto 0

acuplush:
LOW lampeggia quando il finecorsa (al punto di riposo) non è premuto (perchè appunto il lampeggio mi serve come avviso che il motore è in movimento)

in else spengo solo il led movimento perchè il led stato è gestito dalle due funzioni di cui si parlava prima.

quindi la priorità su tutto cè l’ha il lameggio che mi avvisa se il motore è in movimento, poi quando và a riposo verrà gestito il led di stato che mi indica se il resto del ciclo è in funzione o no.

forse ora non ti tornano i conti perchè sto facendo le prove con un servo ma poi devo sostituirlo con un motore passo-passo che allo start (dove ora il servo fà solo +90) farà andata e ritorno da solo per poi stare fermo al punto 0

attento! ti sbagli
se hai costruito il circuito secondo le indicazioni date dallo sketch…

  int reading = digitalRead(finecorsa);
  delay(50); // crude de-bouncing

  if (reading == LOW) // buttons with pull-up are pressed when LOW  <----- qui

qui dice chiaramente che il pulsante con pull-up (la resistenza collegata al positivo o la resistenza interna del pin) è premuto quando va allo stato LOW

se in else non azzeri il led stato questo potrebbe in quel momento essere sia acceso che spento per effetto del lampeggio precedente

Patrick_M:
attento! ti sbagli
se hai costruito il circuito secondo le indicazioni date dallo sketch…

  int reading = digitalRead(finecorsa);

delay(50); // crude de-bouncing

if (reading == LOW) // buttons with pull-up are pressed when LOW  <----- qui




qui dice chiaramente che il pulsante con pull-up (la resistenza collegata al positivo o la resistenza interna del pin) è premuto quando va allo stato LOW

se in else non azzeri il led stato questo potrebbe in quel momento essere sia acceso che spento per effetto del lampeggio precedente

ecco dove non mi tornavano i conti, io nel simulatore ho fatto il collegamento standard con resistenza da 100k sul negativo

il led stato verrà mantenuto acceso o spento da una delle due condizioni (o stato=1 o stato=0) che una delle due è sempre vera

;)