Ciao a tutti,
sto affrontando una problematica a cui non riesco a venire a capo malgrado innumerevoli tentativi fatti.
Ho realizzato un piccolo sistema che accende per un tempo preimpostato una lampada a 220V (assorbimento: 400W) ed al raggiungimento della temperatura impostata accende anche delle ventoline (tipo computer) a 12V.
Fin qui tutto bene: calcola il tempo, visualizza la temperatura, accende la lampada e le ventoline alla temperatura desiderata ...ma, assolutamente random, ogni tanto si resetta interrompendone il funzionamento.
Oltretutto la sonda invia ogni tanto dei dati errati che ho dovuto eliminare perché sul display creavano casini vari.
Sono disperato!!!
Grazie mille in anticipo,
Sergio
Allego:
-codice
-schema elettrico (i simboli possono essere errati ma sono quelli che ho trovato ;-))
#include <EEPROM.h>
#include <core_build_options.h>
#include <secTimer.h>
#include <genieArduino.h>
//librerie per gestione sonda temperatura
#include <OneWire.h>
#include <DallasTemperature.h>
//Crea un'istanza della libreria Timer
secTimer myTimer;
#define lampPin 5 //pin uscita Accensione Lampada
#define ONE_WIRE_BUS 6 // pin ingresso dati sonda temperatura
#define ventolePin 7 //pin uscita Accensione ventole
// Definisco l'istanza di comunicazione OneWire
// (valida non solo per il modulo di temperatura Maxim/Dallas)
OneWire oneWire(ONE_WIRE_BUS);
// passo da oneWire a Dallas Temperature.
DallasTemperature sensors(&oneWire);
int temperatureSet = EEPROM.read(0);; //variabile temperatura impostata
int temperatureRead; // temperatura letta
int tempoOre = EEPROM.read(1);
int tempoMin = EEPROM.read(2);
long tempo = (tempoOre * 60) + (tempoMin); //tempo impostato
long tempoAtt = 0; //tempo attuale decrescente
long timer = 0;
int tempoAttOre = 0;
int tempoAttMin = 0;
int flagTempoLamp = 0;
int tempoTotLamp = 0;
int counterSondaAvaria = 0;
int tempoTotOreLamp = (EEPROM.read(4) * 100) + EEPROM.read(5); //Tempo totale di utilizzo della lampadina
int sicurezzaState; // variabile sicurezza
int flagSic = 0;
int flag = 0; //mantiene il valore del "Buttone premuto"
void setup() {
// baud rate di comunicazione porta seriale
genieBegin (GENIE_SERIAL, 9600); //Serial0
// Start libreria sonda
sensors.begin();
//Tutti i segnali dai pulsanti vengono inviati alla funzione myGenieEventHandler
genieAttachEventHandler(myGenieEventHandler);
//Resetta il Display
pinMode(4, OUTPUT);
digitalWrite(4, 1);
delay(1000);
digitalWrite(4, 0);
delay (3500);
pinMode(lampPin, OUTPUT);
pinMode(ventolePin, OUTPUT);
//metto il sistema in attesa
digitalWrite(lampPin, 0); //spengo resistenza riscaldamento
digitalWrite(ventolePin, 0); //spengo le ventole
genieWriteObject(GENIE_OBJ_LED, 0x01, 0); //spengo il led RUN TEST
genieWriteObject(GENIE_OBJ_LED, 0x00, 0); //spengo il led fine ciclo
genieWriteObject(GENIE_OBJ_LED_DIGITS, 0x05, temperatureSet);
genieWriteObject(GENIE_OBJ_LED_DIGITS, 0x04, temperatureSet);
genieWriteObject(GENIE_OBJ_LED_DIGITS, 0x02, tempoMin);
//genieWriteObject(GENIE_OBJ_LED_DIGITS, 0x06, tempoMin);
genieWriteObject(GENIE_OBJ_LED_DIGITS, 0x07, tempoMin);
//genieWriteObject(GENIE_OBJ_LED_DIGITS, 0x00, tempoOre);
genieWriteObject(GENIE_OBJ_LED_DIGITS, 0x01, tempoOre);
genieWriteObject(GENIE_OBJ_LED_DIGITS, 0x08, tempoOre);
genieWriteObject(GENIE_OBJ_STRINGS, 0x00, 0);
genieWriteObject(GENIE_OBJ_USER_LED, 0x00, 0);
}
void loop() {
genieDoEvents(); //gli eventi dal touch sono ricevuti ed incolonnati qui.
if (flag == 1) {
timer = myTimer.readTimer();
//tempoAtt = tempo - timer/60; conteggio da tempo impostato a zero
tempoAtt = timer/60; //conteggio da 0 a tempo impostato
tempoAttOre = (tempoAtt / 60); //converto i secondi in ore
tempoAttMin = (tempoAtt % 60); //converto i secondi in minuti
genieWriteObject(GENIE_OBJ_LED_DIGITS, 0x06, tempoAttMin);
genieWriteObject(GENIE_OBJ_LED_DIGITS, 0x00, tempoAttOre);
//tempo decrementale
//if ((tempoAttOre == 0) && (tempoAttMin == 0))
// flag = 3;
//tempo incrementale
if ((tempoAttOre == tempoOre) && (tempoAttMin == tempoMin)) {
flag = 3;
}
}
if (flag == 3) { //Stop
digitalWrite(lampPin, 0); //spengo resistenza
genieWriteObject(GENIE_OBJ_LED, 0x01, 0); //spengo il led RUN TEST
genieWriteObject(GENIE_OBJ_LED, 0x00, 1); //accendo il led fine cilco
myTimer.stopTimer();
// tempoAtt = 0;
// timer = 0;
// genieWriteObject(GENIE_OBJ_LED_DIGITS, 0x06, 0);
// genieWriteObject(GENIE_OBJ_LED_DIGITS, 0x00, 0);
flag = 0;
genieWriteObject(GENIE_OBJ_SOUND, 0x00, 0);
}
// chiamo sensors.requestTemperatures() per richiedere la temperatura
// a tutti i sensori
sensors.requestTemperatures();
temperatureRead = sensors.getTempCByIndex(0);
// uso "byIndex" perchè posso avere più sensori
// 0 è il primo, 1 il secondo ...
if (temperatureRead > 1 && temperatureRead < 100) {
genieWriteObject(GENIE_OBJ_LED_DIGITS, 0x03, temperatureRead);
if (temperatureRead >= 76) {
flag = 3;
}
if ((temperatureRead >= temperatureSet) && (temperatureRead < 76)) {
digitalWrite(ventolePin, 1); //Accendo ventole
}
else {digitalWrite(ventolePin, 0);} //spengo ventole
counterSondaAvaria = 0;
}
// Conteggio il tempo della sonda in avaria per determinare
// se è rotta o se si tratta di una lettura anomala
else {
counterSondaAvaria = counterSondaAvaria + 1;
delay(1000);
if (counterSondaAvaria == 20) {
genieWriteObject(GENIE_OBJ_LED_DIGITS, 0x03, 000);
digitalWrite(ventolePin, 0); //spengo ventole
flag = 3;
}
}
} // *** Fine LOOP ***
//Ho tolto tutte le funzioni in quanto eccedevo il numero max di caratteri ...oltretutto le funzioni sono solo per impostare tempi e temperature