Problemi sul software per un progetto!

Il programma funziona come volevo finalmente!!! Grazie!!!
Solo che adesso ho riscontrato un nuovo problema...
Quando si attivano il led,il servo e il buzzer la temperatura sale da 25° a 35°....
Questo è un problema dovuto all'alimentazione oppure a qualcos'altro???
(all'alimentazione intendo adesso perchè devo comprare una batteria che sia utile solo al buzzer e al servo, adesso sono alimentati con arduino)

acca90:
Il programma funziona come volevo finalmente!!! Grazie!!!
Solo che adesso ho riscontrato un nuovo problema...
Quando si attivano il led,il servo e il buzzer la temperatura sale da 25° a 35°....
Questo è un problema dovuto all'alimentazione oppure a qualcos'altro???
(all'alimentazione intendo adesso perchè devo comprare una batteria che sia utile solo al buzzer e al servo, adesso sono alimentati con arduino)

...guarda che non ci hai detto come hai collegato le cose... in particolare si alza la temperatura di che? del nocciolo? dell'incubatrice? cosa è che fa abbassare ed alzare la temperatura di questa cosa? barre di uranio arricchito? :grin:
... e soprattutto quando hai testato il tuo display e l'lm35 li hai testati approfonditamente per verificare che la temperatura fosse corretta e stabile?
... comunque devi stare all'occhio alle isteresi che non hai gestito per nulla.

altra cosa:

void lcdlm35() {
  lcd.clear();
  lcd.print( "Temperatura...");
  tempC = analogRead(sensore);
  tempC = (5.0 * tempC * 100.0)/1024.0;
  lcd.setCursor(0, 1);
  lcd.print(tempC);
  lcd.print( (char) 223);                                    // <-------------------- perchè???
  lcd.print(" Celsius ");
  delay(1500);//delay(750)   ;                             // <--------------------QUI DIREI PERCHE' PERCHE' PERCHE'???
  lcd.clear();                                                     // <-------------------- perchè???
}

Ma quanti perchè!!! :smiley:
Allora...quando ho testato lcd e lm35 soli la temperatura la calcolava bene!!!
Ora come ora sono tutte collegate(lm35, lcd, i 3 led, buzzer e servo) tramite i 5V di arduino, quindi ho comprato una batteria da 9V per alimentare a parte servo e buzzer.
La temperatura che si alza è quella dell' lcd, per esempio se la temperatura è di 22°, basta che si accenda il led giallo che la temperatura sale di 2 gradi. I led sono collegati ai 5V di arduino tramite resistori.
Cosa non ho gestito???
Ripeto sono alle prime armi con Arduino...quindi non ti sorprenderà sapere che io non sappia cosa siano le isteresi!!!!

 lcd.print( (char) 223);                                    // <-------------------- perchè???
  lcd.print(" Celsius ");
  delay(1500);//delay(750)   ;                             // <--------------------QUI DIREI PERCHE' PERCHE' PERCHE'???
  lcd.clear();                                                     // <-------------------- perchè???

Il primo perchè è quello legato al simbolo °;
il secondo perchè il mio intento era quello di rilevare la temperatura ogni tot di tempo e non continuamente;
il terzo perchè il prof mi aveva consigliato di mettere lcd.clear() all'inizio e alla fine per pulire l' lcd.....
Spero di aver risposto ai tanti perche :D!!!

acca90:
Ma quanti perchè!!! :smiley:
Allora...quando ho testato lcd e lm35 soli la temperatura la calcolava bene!!!
Ora come ora sono tutte collegate(lm35, lcd, i 3 led, buzzer e servo) tramite i 5V di arduino, quindi ho comprato una batteria da 9V per alimentare a parte servo e buzzer.
La temperatura che si alza è quella dell' lcd, per esempio se la temperatura è di 22°, basta che si accenda il led giallo che la temperatura sale di 2 gradi. I led sono collegati ai 5V di arduino tramite resistori.
Cosa non ho gestito???
Ripeto sono alle prime armi con Arduino...quindi non ti sorprenderà sapere che io non sappia cosa siano le isteresi!!!!

 lcd.print( (char) 223);                                    // <-------------------- perchè???

lcd.print(" Celsius ");
  delay(1500);//delay(750)   ;                             // <--------------------QUI DIREI PERCHE' PERCHE' PERCHE'???
  lcd.clear();                                                     // <-------------------- perchè???



Il primo perchè è quello legato al simbolo °;
il secondo perchè il mio intento era quello di rilevare la temperatura ogni tot di tempo e non continuamente;
il terzo perchè il prof mi aveva consigliato di mettere lcd.clear() all'inizio e alla fine per pulire l' lcd.....
Spero di aver risposto ai tanti perche :D!!!

Se i consumi sono grossi potrebbe crollarti la tensione di riferimento e non leggerti più giusta la temperatura correttamente...con l'alimentazione separata dovrebbe risolversi....anche staccando il servo e basta...il buzzer... be ho messo una capsula piezo e problemi non ne ho avuti.

il delay non va bene perchè blocca su tutto come sempre quindi blocca lampeggi e tutto... lascia che vada veloce sto arduino che ti frega di azzopparlo.
non va bene dare il clear a fine lettura perchè se togli il delay come dovrai noterai solo un lampeggio...lascialo solo all'inizio prima della lettura poi scrivi e lascia scritto.
quel carattere da me non esce come zerino dato che hai scritto celsius insomma si capisce che sono gradi.

Se tolgo il delay non si legge più l' lcd....

acca90:
Se tolgo il delay non si legge più l' lcd....

Per forza che fa così. Ti abbiamo spiegato perché e per come non va bene la logica che stai usando.
Chiami dal loop() la funzione void lcdlm35() continuamente e dentro a questa funzione cosa c'è? lcd.clear().
Devi aggiornare il display ogni tot oppure solo quando cambi qualcosa altrimenti sfarfallerà sempre.

Ti offendi se ti dico che fai di testa tua, ma poi continui a farlo. Sbagliando. E qsecofr che sta scrivendo il programma al posto tuo. Ma se te lo fai scrivere da qualcun altro, così non imparerai mai.

Ma a te chi lo dice che io non abbia modificato i parametri secondo come mi ha suggerito qsecofr!!!
Non mi arrabbio per queste sciocchezze e figurati se me la prendo!!!
Del resto qsecofr mi ha fatto capire dove sbagliavo indicandomi esattamente gli errori!!!
Non penso che ogni volta che modifico qualcosa come mi viene suggerito devo riscrivere il programma in forum!!!
Ho capito l'errore, tanto è vero che il secondo lcd.clear() l'avevo già cancellato, poi mi ha suggerito di cancellare il delay(), ma facendolo mi creava questo nuovo problema e l'ho scritto!!!

#include <Servo.h>
#include <LiquidCrystal.h> 

LiquidCrystal lcd(12, 11, 5, 4, 3, 2); 
float tempC;      
int sensore = A1; 
int val = 0;                    
int vecchio_val = 0;            
int stato = 0;
int valore;
int angolo = 0;
Servo mioservo;


const byte tempOttima = 0;
const byte tempOttimaMax = 20;
const byte tempCritica = 25;
const byte ledgreen = 10;
const byte ledyellow = 9;
const byte ledred = 8;

bool green=false;
bool yellow=false;
bool red=false;
bool buzzer=false;
bool servo=false;

void setup() {                  
  lcd.begin(16, 2);
  pinMode(13, INPUT);
  pinMode(10, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(8, OUTPUT);
  mioservo.attach(6);
  pinMode(7, OUTPUT);
}
void loop() {
  lcdlm35();

  if ((tempC >= tempOttima) && (tempC <= tempOttimaMax))
  {
    green = true;
  }
  else { 
    green = false;
  };

  if ((tempC >tempOttimaMax) && (tempC <= tempCritica))
  {
    yellow = true; 
  }
  else { 
    yellow = false; 
  };

  if (tempC > tempCritica)
  {
    red = true;
  }
  else {
    red = false;
  }

  aggiornacolori();
}

void lcdlm35() {
  lcd.clear();
  lcd.print( "Temperatura...");
  tempC = analogRead(sensore);
  tempC = (5.0 * tempC * 100.0)/1024.0;
  lcd.setCursor(0, 1);
  lcd.print(tempC);
  lcd.print( (char) 223);
  lcd.print(" Celsius ");
  delay(750);-------------------->se cancello questo non si legge più il display, nel senso che come fosse aggiornato in continuazione!!!
  
}

void aggiornacolori() {
  if (green == true) {
    digitalWrite(ledgreen, HIGH);
  }
  else {
    digitalWrite(ledgreen, LOW);
  };
  if (yellow == true) {
    if(( millis() % 1000) > 500)
    {
      digitalWrite(ledyellow, HIGH);
    }
    else {
      digitalWrite(ledyellow, LOW);
    }
  }
  else {
    digitalWrite(ledyellow, LOW);
  }
  if (red == true) {
    mioservo.write(90);

    if(( millis() % 1000) > 500) {
      tone(7, 1000);   
      digitalWrite(ledred, HIGH);
    }
    else {
      tone(7, 2000);   
      digitalWrite(ledred, LOW);

    }
  }
  else {
    noTone(7);
    digitalWrite(ledred, LOW);
    mioservo.write(0);   
  }
}

Ho risolto il problema dell'alimentazione, solo che ancora ogni tanto ho un salto di temperatura!!!
Come posso sostituire quel delay???

ps
Il fatto che la mia logica non funzionava l'avevo capito dall'altro ieri, tanto è vero che mi sono scusato con qsecofr perchè il programma non funzionava per un mio errore di distrazione e per il frainteso che si era creato!!!
Come puoi notare, come avevi suggerito tu, ho usato la funzione tone, solo che io avevo capito male dove scriverla e qsecofr mi ha fatto vedere il modo corretto di usarla!!!

acca90:
Ma a te chi lo dice che io non abbia modificato i parametri secondo come mi ha suggerito qsecofr!!!

Se il codice è quello che alleghi, stai usando il modo sbagliato, come ti ho detto. Senza il delay il tuo loop chiama continuamente la funzione lcdlm35() che ha la funzione di svuotamento del display.

(.....)
void loop() {
lcdlm35();
(.....)
}

void lcdlm35() {
lcd.clear();
(.....)
delay(750);-------------------->se cancello questo non si legge più il display, nel senso che come fosse aggiornato in continuazione!!!

}

togli quell'lcd.clear(), rivedi la logica e stampa a video le informazioni solo ogni tot, ad esempio ogni 500 ms per esempio oppure ogni secondo, altrimenti ti sfarfallerà sempre. Non so se mi sono spiegato.

se stacchi il servo hai il salto lo stesso?

qui serve il famoso serial.print che ti dicevo di usare prima...DEBUG!!!!

sul ciclo loop devi fare una cosa del tipo

while (1)
cicillo = analogread (pintemperatura);
serial.print cicillo;
delay 100;
questo ti blocchera in un ciclo infinito l'arduino: non funzioneranno più led ne null'altro però poi con il serial monitor potrai monitorare per bene la situazione... quando va lo togli e ricarichi il programma..

picchigna il sensore con le mani: varia? hai messo una resistenza di pulldown? quanti ohm?
finquando non è stabile questo programma non si ha da andare avanti... nota che più che un programma stavolta ti ho messo uno pseudocodice manca di tutto e di più...colpa di leo:c'ha ragione: se te lo faccio io tu non impari... :smiley: :grin:

per il rimpallo dell'lcd... devi fare come ti ha detto leo qualche post fa: aggiornare solo quando serve... usi una variabile "oldTemp" e aggiorni il display (ed oldtemp) con il clear e con il print solo quando olttemp è diverso dalla temperatura appena letta.... sarebbe poi cosa abbastanza comune fare un ciclo di accumulo di letture su analogread e poi farne una media.

l'isteresi che dicevo prima è il palleggio che può accadere quando si passa da una fascia all'altra... e qua te la devi vedere da solo perchè se no leo si incazza :smiley:

Ciao e scusatemi per il ritardo!
Ho tolto i delay e lcd.clear() e li ho sostituiti con millis();
Inoltre mi ha riferito il prof che il servo deve fare un singolo movimento e basta.
Come posso impartergli questo comando???
Penso che facendo questo(cioè far attivare solo una volta il servo)non dovrei avere sbalzi di temperatura!!!!
Se vi serve qualche altra info chiedete pure!!!

acca90:
Ciao e scusatemi per il ritardo!
Ho tolto i delay e lcd.clear() e li ho sostituiti con millis();
Inoltre mi ha riferito il prof che il servo deve fare un singolo movimento e basta.
Come posso impartergli questo comando???
Penso che facendo questo(cioè far attivare solo una volta il servo)non dovrei avere sbalzi di temperatura!!!!

millis-->quindi hai fatto come ti ha detto Leo con il ritardo... va bene (anzi ha molta molta più esperienza di me). ti funziona vero?
il servo già si sposta di 90gradi avanti e quando l'allarme cessa torna in posizione di origine...in un unico movimento... secondo me già va bene così solo che tu non l'hai provato.
L'isteresi ce l'hai comunque... non centra come apri la saracinesca ma come passi da una zona all'altra... se hai per esempio zona critica a 30 gradi il programma prima di raggiungere i 30 gradi stabili ti passerà 200 volte da led giallo a led rosso con tutto quello che ci sta dietro per gestire l'isteresi devi attivare quando sale sopra i 30 e disattivare quando scende sotto i 28 per esempio stando fermi senza cambiare stato quando sei sui 29 e stessa cosa devi fare per il passaggio da verde a giallo.
... ma 'sto benedetto sensore va??? ti rimbalzava da 20 a 30 gradi...

Se vi serve qualche altra info chiedete pure!!!

se prendi 8 paghi ci paghi da bere? :grin: :smiley:
comunque io di domande nel precedente thread te ne ho poste parecchie per capire se sta temperatura funzionava o meno... ma... permango nel mio dubbio... stasera starò tutto preoccupato per questa cosa e sicuramente dovrò prendere un Tavor prima di andare a dormire. :grin:

Ma vi pago anche una cena!!!comunque è un esame universitario....e il prof in pratica ci ha fatto comprare il pacchetto e ha detto semplicemente a voi le belle cose :D!!!!
comunque la temperatura non salta più come faceva prima!!!
Scusa se te lo faccio ripetere...ma devo fare??? Ho tentato di mettere ulteriori condizioni ma fa sempre così!!!!

acca90:
Ma vi pago anche una cena!!!comunque è un esame universitario....e il prof in pratica ci ha fatto comprare il pacchetto e ha detto semplicemente a voi le belle cose :D!!!!
comunque la temperatura non salta più come faceva prima!!!
Scusa se te lo faccio ripetere...ma devo fare??? Ho tentato di mettere ulteriori condizioni ma fa sempre così!!!!

... ma per gestire l'isteresi di cui parlavo prima? spiegati meglio di cosa vuoi.

per la cena io mangio solo pesce perchè ho avuto un problema cardiaco qualche anno fa... e vedi di non presentarti con i bastoncini findus :grin: (...ps c'è "karma" a lato)

no invece per quanto concerne la temperatura: DEVE essere stabile se non è stabile mi devi assolutamente dire che tipo di sensore usi e come l'hai attaccato.

il sensore è un LM35 collegato direttamente ad arduino!!!
Intendevo come stabilizzare il più possibile la temperatura per evitare concomitanze di varie azioni(es accensione dei led giallo/rosso)

acca90:
il sensore è un LM35 collegato direttamente ad arduino!!!
Intendevo come stabilizzare il più possibile la temperatura per evitare concomitanze di varie azioni(es accensione dei led giallo/rosso)

è te l'ho detto: il metodo giusto è avere una temperatura di on diversa da quella di off... se hai per esempio una temperatura critica di 30° accendi il rosso quando superi i 30° e spegni il rosso quando scendi sotto i (30°- la soglia di isteresi... per esempio 29°) questo perchè le temperature bene o male cambiano continuamente di qualche mezzo grado...
si può inoltre nella procedura di lettura dell'lm leggere più volte l'analogica e fare una media dei valori letti...
sum =0;
for (i = 0; i < 10; i ++)
sum = sum + analogread(pintemperatura);

valore= sum /10;

non mi hai detto che cosa regola questo arduino.

ps: l'lm35 è ottimo e molto facile da usare: non deve darti sbalzi strani di temperatura ma è bene controllare che la varia circuiteria che hai sparso (...servo) non beva tutti gli ampere dall'arduino determinandoti cadute di tensione. Se vuoi puoi "aumentare" la risoluzione del sensore con questo metodo che imposta una divera tensione di riferimento sull'analogica

in che senso cosa regola?

si può inoltre nella procedura di lettura dell'lm leggere più volte l'analogica e fare una media dei valori letti...
sum =0;
for (i = 0; i < 10; i ++)
sum = sum + analogread(pintemperatura);

valore= sum /10;

Mi puoi spiegare cosa significa il passaggio nella parentesi?
Nel senso mettendo questo passaggio, se ho capito, fa la media di 10 letture???
Inoltre il sensore l'ho collegato così come nel link che mi hai postato!!!!

acca90:
in che senso cosa regola?

si può inoltre nella procedura di lettura dell'lm leggere più volte l'analogica e fare una media dei valori letti...
sum =0;
for (i = 0; i < 10; i ++)
sum = sum + analogread(pintemperatura);

valore= sum /10;

Mi puoi spiegare cosa significa il passaggio nella parentesi?
Nel senso mettendo questo passaggio, se ho capito, fa la media di 10 letture???
Inoltre il sensore l'ho collegato così come nel link che mi hai postato!!!!

cosa regola nel senso di cosa c'è attaccato a questo arduino... una serra, un frigorifero, una centrale nucleare... è curiosità più che altro...

si è il ciclo "for" è uno dei metodi per fare un ciclo principali, l'altro metodo è il ciclo while ed il do-while

il for così scritto inizializza a zero la variabile i, poi ripete il blocco (che verrà riportato tra parentesi graffe o nel caso di una sola istruzione può essere sottointeso come ho fatto io) fintanto che è vera la condizione e ogni volta che il ciclo è terminato viene eseguita la terza parte (i++) che incrementa il contatore del ciclo... in pratica quel ciclo fa 10 volte l'istruzione sum= sum + analogread incrementado da 0 a 10 il valore di i (che in questo caso serve solo da contatore e non è usato nel ciclo)
L'istruzione sum= sum + analogread somma ogni volta il valore di analog read a sum quindi alla fine sum è uguale alla somma di 10 letture... poi c'è la divisione e quindi si fa una media.
E' fondamentale che tu ti studi i cicli di controllo for e while: è alle basi della programmazione e non c'è praticamente linguaggio che non li contempli (eventualmente con altre sintassi).
bon allora adesso cerca di integrare il ciclo che ti ho spiegato nel tuo programma sostituendo la lettura "semplice" (analogread) con questa lettura multipla, non mettere solo il sum = sum + analogread ma ci metti le graffe e ci metti anche un'istruzione di delay (direi un 10 millisecondi può bastare).... e vediamo se le letture diventano più affidabili.

il sistema non è collegato a niente!!!nel senso che è formato solo da arduino e board!!!