Ciao a tutti, ho recentemente realizzato un controller per il mio acquario con arduino uno, un display HD44780 4x20 green, un sensore di temperatura DS18B20 e una pcb con relè 5v autocostruita. Il controller, controlla la temperatura della vasca, accende le luci in base all'orario e accende riscaldatore e ventola in base alla temperatura.
Momentaneamente ho caricato il programma e lo sto testando a vuoto senza pcb a relè collegata e funziona tutto a meraviglia.
Ho però un piccolo problema. durante il funzionamento del programma, a volte spariscono i caratteri dal display e si presenta solamente con la retroilluminazione. Se tolgo l'alimentazione alla scheda arduino e la reinserisco tutto riprende a funzionare e i caratteri vengono visualizzati.
Questo problema succede random cioè: a volte capita dopo 2 ore, a volte dopo 10 e altre dopo anche 20 ore.
Secondo voi a cosa può essere dovuto? Al software o all'hardware?
Preciso che arduino è alimentato solamente con un alimentatore esterno a 5v dedicato.
Potrebbe essere che il programma vada in palla quando attiva le uscite digitali che io ho collegato ma ho lasciato per il momento senza relè e cioè senza carico??
Grazie a tutti quelli che cercheranno di aiutarmi
Riguardo al problema software, potrebbe aiutarti questa:
Una sfera di cristallo per favore.
simonfe come pensi che Ti potremmo aiutare se non ci dai ne il circuito ne lo sketch del Tuo progetto?
Dalle informazioni che ho a disposizione non posso valutare se é piú probabile che il problema sia SW o HW.
Ciao Uwe
Ha ragione uwefed, però se come tu dici, alimenti l' arduino con solo 5v, allora sono troppo pochi.
Arduino deve essere alimentato con una tensione da 7 a 12. Questo per varie ragioni... poi dipende anche come alimenti tutto il resto... relè compresi.
Quindi se posti uno schema e maggiori dettagli, anche noi potremo essere più precisi.
Ciao a tutti. Grazie per le risposte. Avete ragione. Senza schema e sketch non è sicuramente possibile aiutarmi.
Purtroppo sono alle prime armi con la programmazione e non so se tutto quello che ho scritto va bene o può creare dei conflitti.
Provo a postarvelo:
Per lo schema devo buttarlo giu ma ho collegato tutto diretto ad arduino (nessuna seriale)
#include <DallasTemperature.h>
#include <OneWire.h>
#include <Wire.h>
#include "RTClib.h"
#include <LiquidCrystal.h>
#define ONE_WIRE_BUS 2
#define Luce1 10
#define Luce2 11
#define Risc 12
#define Vent 13
const int Luce1oraacc = 13 ;
const int Luce1minutiacc = 30 ;
const int Luce2oraacc = 13 ;
const int Luce2minutiacc = 50 ;
const int Luce1oraspe = 23 ;
const int Luce1minutispe = 50 ;
const int Luce2oraspe = 23 ;
const int Luce2minutispe = 30 ;
const int Temprisc = 26 ;
const int Tempvent = 28 ;
//------------------------------------------------------------------------
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
float temperatura;
char buffer[10];
RTC_DS1307 RTC;
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
byte oldSecond =0;
byte richiestaTemperatura=0;
long oldMillis;
void setup () {
sensors.begin();
Wire.begin();
RTC.begin();
lcd.begin(20, 4);
digitalWrite( Luce1,LOW );
digitalWrite( Luce2,LOW );
digitalWrite( Risc,LOW );
digitalWrite( Vent,LOW );
if (! RTC.isrunning()) {
RTC.adjust(DateTime(__DATE__, __TIME__));
}
sensors.setWaitForConversion(false);
}
void loop () {
DateTime now = RTC.now();
if (oldSecond != now.second()) {
if ((now.hour() >= Luce1oraacc) && (now.minute() >=Luce1minutiacc) || (now.hour() > Luce1oraacc) && (now.minute() < Luce1minutiacc)){
lcd.setCursor(0, 2);
lcd.print F("Luce1:");
lcd.print F("[");
lcd.print F("X");
lcd.print F("]");
digitalWrite(Luce1, HIGH);}
else
{
lcd.setCursor(0, 2);
lcd.print F("Luce1:");
lcd.print F("[");
lcd.print F(" ");
lcd.print F("]");
digitalWrite(Luce1, LOW);}
if ((now.hour() >= Luce1oraspe) && (now.minute() >=Luce1minutispe) || (now.hour() > Luce1oraspe) && (now.minute() < Luce1minutispe)){
lcd.setCursor(0, 2);
lcd.print F("Luce1:");
lcd.print F("[");
lcd.print F(" ");
lcd.print F("]");
digitalWrite(Luce1, LOW);}
if ((now.hour() >= Luce2oraacc) && (now.minute() >=Luce2minutiacc) || (now.hour() > Luce2oraacc) && (now.minute() < Luce2minutiacc)){
lcd.setCursor(0, 3);
lcd.print F("Luce2:");
lcd.print F("[");
lcd.print F("X");
lcd.print F("]");
digitalWrite(Luce2, HIGH);}
else
{
lcd.setCursor(0, 3);
lcd.print F("Luce2:");
lcd.print F("[");
lcd.print F(" ");
lcd.print F("]");
digitalWrite(Luce2, LOW);}
if ((now.hour() >= Luce2oraspe) && (now.minute() >=Luce2minutispe) || (now.hour() > Luce2oraspe) && (now.minute() < Luce2minutispe)){
lcd.setCursor(0, 3);
lcd.print F("Luce2:");
lcd.print F("[");
lcd.print F(" ");
lcd.print F("]");
digitalWrite(Luce2, LOW);}
if (sensors.getTempCByIndex(0)<=Temprisc){
lcd.setCursor(11, 2);
lcd.print F("Risc.:");
lcd.print F("[");
lcd.print F("X");
lcd.print F("]");
digitalWrite(Risc, HIGH);}
else {
lcd.setCursor(11, 2);
lcd.print F("Risc.:");
lcd.print F("[");
lcd.print F(" ");
lcd.print F("]");
digitalWrite(Risc, LOW);
}
if (sensors.getTempCByIndex(0)>=Tempvent){
lcd.setCursor(11, 3);
lcd.print F("Vent.:");
lcd.print F("[");
lcd.print F("X");
lcd.print F("]");
digitalWrite(Vent, HIGH);}
else {
lcd.setCursor(11, 3);
lcd.print F("Vent.:");
lcd.print F("[");
lcd.print F(" ");
lcd.print F("]");
digitalWrite(Vent, LOW);
}
if (richiestaTemperatura == 0) {
sensors.requestTemperatures();
richiestaTemperatura = 1;
oldMillis = millis();
}
}
long ciccio = millis();
if (richiestaTemperatura == 1)
{
if (ciccio-oldMillis > 750) {
{
richiestaTemperatura = 0;
lcd.setCursor(0, 1);
lcd.print F("Temp. H2o: ");
lcd.print (sensors.getTempCByIndex(0));
lcd.write (0b11011111);
lcd.print F("C");
}
//stampa data ed ora
sprintf(buffer, "%02d/%02d/%d", now.day(), now.month(), now.year());
lcd.setCursor(0, 0);
lcd.print( buffer );
char buffer[10] = "";
sprintf(buffer, "%02d:%02d:%02d", now.hour(), now.minute(), now.second());
lcd.setCursor(12, 0);
lcd.print( buffer );
}
}
}
edit by mod: per favore includi il codice negli appositi tag, grazie
Devi trasformare tutti i print da così:
lcd.print F("Luce1:");
a così
lcd.print(F("Luce1:"));
Hai dimenticato una coppia le parentesi.
Scusatemi per non aver incluso il codice negli appositi tag. Sto imparando.
Grazie infinite a tutti per gli aiuti.
Grazie anche a te PaoloP. Cambierò le stringhe come da te suggerito.
Per voi il resto del codice è accettabile o esiste una maniera per renderlo più leggero?
Ciao a tutti, sono di nuovo qui a rompre.
Ho corretto il codice come suggerito da PaoloP ma purtroppo niente.
il sistema non è stabile. dopo un ora che avevo caricato lo sketch è sparito tutto dal display.
E rimasta solo la retroilluminazione.
simonfe:
Ciao a tutti, sono di nuovo qui a rompre.
Ho corretto il codice come suggerito da PaoloP ma purtroppo niente.
il sistema non è stabile. dopo un ora che avevo caricato lo sketch è sparito tutto dal display.
E rimasta solo la retroilluminazione.
Fai un po’ di debug sulla seriale. Metti cioè dei Serial.print e spedisci un po’ di messaggi al PC per vedere se il codice continua a girare regolarmente oppure se si pianta tutto l’Arduino.