dani9191
| Inviato il: 17/05/2017 11:36:00
|
Bene una buona notizia, ho testato il firmware è sembra funzionare tutto,testate tutte le uscite, temperature e gl'interrupt(quando si aziona l'interrupt pero bisogna spegnere e accendere la scheda).Ho risolto anche con la libreria per arduino uno e il problema della lentezza del display era dovuta a while,lo eliminitato è va benissimo. Per il discorso dei delay(500) se li elimino o uso millis il sistema si rallenta(cioè aumenta/diminuisce in piu tempo),se lascio il delay invece va bene.
Questo un piccolo videoLINK il led giallo è l'accenditore quello rosso è la coclea.
Questo è il codice
#include "DHT.h" // DHT & AM2302 library
#include "Nextion.h" //librearia nextion
#include <SoftwareSerial.h> //libreria seriale
#include <OneWire.h> //libreria per ds18b20
#include <DallasTemperature.h> //libreria per conversione valore
#include "max6675.h"
int ktcSO = 44; //sonda fumi max6675
int ktcCS = 45;
int ktcCLK = 46;
MAX6675 ktc(ktcCLK, ktcCS, ktcSO);
#define ONE_WIRE_BUS 12 // Il terminale data del sensore è connesso alla porta 12 di Arduino
#define DHTTYPE DHT22 // DHT 22 (AM2302)
#define aspiratore 4 //imposto il pin 4 per l'aspiratore
#define coclea 5 //imposto il pin 5 per la coclea
#define circolatore 6 //imposto il pin 6 per il circolatore
#define ventola 7 //imposto il pin 7 per la ventola
#define accenditore 8 //imposto il pin 8 per l'accenditore
#define DHTPIN 9
#define stato 13
SoftwareSerial HMISerial(10, 11);// Nextion TX to pin 10 and RX to pin 11 of Arduino`
OneWire oneWire(ONE_WIRE_BUS); // Imposto la comunicazione oneWire per il ds18b20 h2o
DallasTemperature sensors(&oneWire);
DHT dht(DHTPIN, DHTTYPE);
int txh2o; //temperatura di soglia termocamino
int Tfumi; //temperatura rilevata fumi
int umidita; //umidità rilevata
int tempamb; //temperatura rilevata ambiente
int temph2o; //temperatura acqua rilevata
int allTempFumi=150; //allarme temperatura fumi
int percentuale; //percentuale aspiratore
int pwmfumi; //variabile per l'aspiratore
int Vcoclea=LOW; //variabile velocita coclea
int Vstato; //lettura stato interrutore ON/OFF
int Tcoclea; //variabile per mandata pellet
unsigned long OldStartCoclea = 0;
unsigned long VarMillis = 0;
unsigned long OldStartAccenditore = 0;
unsigned long DeltaRestartMillis = 0;
boolean PrimoCicloON = true;
void t8PopCallback(void *ptr); //ambiente page home 0
void t9PopCallback(void *ptr); //ambiente page home 0
void n0PopCallback(void *ptr); //ambiente page home 0
void n1PopCallback(void *ptr); //fumi page home 0
void n4PopCallback(void *ptr); //fumi page home 0
void n2PopCallback(void *ptr); //bagno page home 0
void n3PopCallback(void *ptr); //acqua page home 0
void n5PopCallback(void *ptr); //UMIDITA page home 0
void n30PopCallback(void *ptr); //bagno page bagno 2
void b31PopCallback(void *ptr); //bagno - page bagno 2
void b32PopCallback(void *ptr); //bagno + page bagno 2
NexText t8 = NexText(0, 11, "t8");
NexText t9 = NexText(0, 14, "t9");
NexNumber n0 = NexNumber(0, 1, "n0"); // ambiente
NexNumber n1 = NexNumber(0, 6, "n1"); // fumi
NexNumber n3 = NexNumber(0, 3, "n3"); //acqua temp rilevata
NexNumber n4 = NexNumber(0, 9, "n4"); //aspiratore
NexNumber n5 = NexNumber(0, 12, "n5");//UMIDITA
NexNumber n30 = NexNumber(1, 3, "n30");//acqua temp impostata
NexButton b31 = NexButton(1, 1, "b31");//set acqua
NexButton b32 = NexButton(1, 2, "b32");//set acqua
char buffer[100] = {0};
NexTouch *nex_listen_list[] =
{
&t8,
&t9,
&n0,
&n1,
&n3,
&n4,
&n5,
&n30,
&b31,
&b32,
NULL
};
void t8PopCallback(void *ptr)
{
}
void t9PopCallback(void *ptr)
{
}
void n0PopCallback(void *ptr)
{
}
void n1PopCallback(void *ptr)
{
}
void n3PopCallback(void *ptr)
{
}
void n4PopCallback(void *ptr)
{
}
void n5PopCallback(void *ptr)
{
}
void n30PopCallback(void *ptr)
{
}
void b31PopCallback(void *ptr) //h2o termocamino
{
dbSerial.flush();
txh2o -= 1;
n30.setValue(txh2o);
delay(500);
}
void b32PopCallback(void *ptr) //h2o termocamino
{
dbSerial.flush();
txh2o += 1;
n30.setValue(txh2o);
delay(500);
}
void setup(void)
{
attachInterrupt(0, interruptPressostato, RISING);
attachInterrupt(1, interruptTermostato, RISING);
HMISerial.begin(9600);
dht.begin();
sensors.begin();
txh2o=30; //temperatura di soglia acqua termocamino
nexInit();
t8.attachPop(t8PopCallback);
t9.attachPop(t9PopCallback);
n0.attachPop(n0PopCallback);
n1.attachPop(n1PopCallback);
n3.attachPop(n3PopCallback);
n4.attachPop(n4PopCallback);
n5.attachPop(n5PopCallback);
n30.attachPop(n30PopCallback);
b31.attachPop(b31PopCallback);
b32.attachPop(b32PopCallback);
pinMode(aspiratore,OUTPUT);
pinMode(coclea,OUTPUT);
pinMode(circolatore,OUTPUT);
pinMode(ventola,OUTPUT);
pinMode(accenditore,OUTPUT);
pinMode(stato,INPUT);
delay(1000);
}
void loop(void){
Vstato=digitalRead(stato); //variabile pin 12 per conoscere lo stato di acceso/spento
nexLoop(nex_listen_list);
Tfumi=ktc.readCelsius();
umidita = dht.readHumidity(); //leggo umidita ambiente
tempamb = dht.readTemperature(); //leggo temperatura ambiente
sensors.requestTemperatures();
temph2o =sensors.getTempCByIndex(0); //leggo il sensore dell'acqua del termocamino
/////////////////////////////////////////////////////////////////////////////////////////////////////
if(Vstato==HIGH){
if(Tfumi<allTempFumi){ // verifica se le condizioni sono vere procedo con:
t9.setText("ON");
VarMillis = millis();
if(PrimoCicloON){ // se è la prima volta che entro nello stato ON
PrimoCicloON = false;
OldStartAccenditore = VarMillis;
DeltaRestartMillis = 0;
}
if(OldStartAccenditore > VarMillis){ // se millis si resetta (dopo circa 50 gg)
DeltaRestartMillis = 4294967295 - OldStartAccenditore;
OldStartAccenditore = 0;
}
if(VarMillis + DeltaRestartMillis - OldStartAccenditore < 180000){ // se non sono trascorsi 3 minuti
digitalWrite(accenditore, HIGH);
}
else{
digitalWrite(accenditore, LOW);
}
if (temph2o<txh2o){
pwmfumi=255;
}
else{
pwmfumi=127,5;
}
percentuale = map(pwmfumi,0,254,0, 100);
digitalWrite(circolatore,HIGH);
digitalWrite(ventola,HIGH);
analogWrite(aspiratore,pwmfumi);
if (temph2o<txh2o){
Tcoclea=600;
}
else{
Tcoclea=1800;
}
///////////////////////////////////////////////////////////////////////////////////////////
if (VarMillis + DeltaRestartMillis - OldStartCoclea > Tcoclea ){
OldStartCoclea = VarMillis; //Tiene in memoria l'ultima accensione
if (Vcoclea == LOW){
Vcoclea = HIGH;
}else{
Vcoclea = LOW;
}
digitalWrite(coclea, Vcoclea);
}}
else{
t9.setText("ALLARME TEMP FUMI");
digitalWrite(aspiratore,LOW);
digitalWrite(circolatore,HIGH);
digitalWrite(ventola,LOW);
digitalWrite(accenditore,LOW);
digitalWrite(coclea,LOW);
percentuale =0;
}}
else if(Vstato==LOW){
if(Tfumi<40){
t9.setText("OFF");
digitalWrite(aspiratore,LOW);
digitalWrite(circolatore,LOW);
digitalWrite(ventola,LOW);
digitalWrite(accenditore,LOW);
digitalWrite(coclea,LOW);
PrimoCicloON = true;
percentuale=0;
}
else{
if(coclea==HIGH){
digitalWrite(coclea,LOW);
}
t9.setText("SPEGNIMENTO");
PrimoCicloON = true;
digitalWrite(accenditore,LOW);
digitalWrite(circolatore,HIGH);
digitalWrite(ventola,HIGH);
analogWrite(aspiratore,255);
percentuale=100;
}}
n0.setValue(tempamb);
n5.setValue(umidita);
n1.setValue(Tfumi);
n4.setValue(percentuale);
n3.setValue(temph2o);
n30.setValue(txh2o);
dbSerial.flush();//pulisci la seriale
delay(500);
}
void interruptPressostato(){
t9.setText("MANCA DEPRESSIONE");
digitalWrite(coclea, LOW);
digitalWrite(aspiratore, LOW);
digitalWrite(circolatore, LOW);
digitalWrite(ventola, LOW);
digitalWrite(accenditore, LOW);
}
void interruptTermostato(){
t9.setText("ALLARME TEMPERATURA");
digitalWrite(coclea, LOW);
digitalWrite(aspiratore, LOW);
digitalWrite(circolatore, LOW);
digitalWrite(ventola, LOW);
digitalWrite(accenditore, LOW);
}
--------------- Non è impossibile se è fattibile!
|