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
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 sconsiglia caldamente l'uso.
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 (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
{
// 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"
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