Se sei già registrato           oppure    

Orario: 13/05/2024 00:15:23  

 

Energia Alternativa ed Energia Fai Da Te > Arduino

VISUALIZZA L'ALBUM

Pagine: (10)   [1]   2   3   4   5   6   7   8   9   10    (Ultimo Msg)


Controllo termocamino
FinePagina

dani9191

Avatar
GigaWatt


Gruppo:Utente
Messaggi:780

Stato:



Inviato il: 14/05/2017 18:36:31

Buongiorno a tutti!
Ragazzi ho bisogno del vostro aiuto per rendere stabile e affidabile questo codice.
Allora intanto provo a fare una piccola descrizione di quello che ho fatto. Ho utilizzato 2 microcontrollori uno deve gestire via seriale il display(nextion3.2) e le sonde, l'altro deve gestire aspiratore,coclea,ventola e allarmi.I problemi sono la lentezza del display quando aumento/diminuisco la temperatura di soglia e sopratutto quando arduino sta comunicando con il display ignora qualsiasi altro comando. Qualcuno esperto può gentilmente controllare questi codici?

micro1

#include "DHT.h"     
#include "Nextion.h"
#include <SoftwareSerial.h>
#include <OneWire.h>   //libreria per ds18b20
#include <DallasTemperature.h>   //libreria per conversione valore
#include "max6675.h"

int ktcSO = 4;
int ktcCS = 5;
int ktcCLK = 6;

MAX6675 ktc(ktcCLK, ktcCS, ktcSO);

#define ONE_WIRE_BUS 12  // Il terminale data del sensore è connesso alla porta 13 di Arduino
#define DHTPIN 0
#define DHTTYPE DHT22  // DHT 22  
#define pwm 9 //imposto il pin 3 come segnale per il micro 2
#define variabile 7 //imposto il pin come segnale acceso/spento per il micro 2

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);   // LED pins

int txh2o;         //temperatura di soglia termocamino
int Tfumi;
int umidita;
int tempamb;       //temperatura rilevata ambiente
int temph2o;           //temperatura acqua rilevata
int allTempFumi=150; //allarme temperatura fumi
int percentuale; //percentuale aspiratore
int var;
int segnale; //variabile per il segnale pwm micro 2
int stato;//stato acceso =1 / spento =0

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 n300PopCallback(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, 14, "t8"); 
NexText t9 = NexText(0, 18, "t9"); 
NexNumber n0 = NexNumber(0, 1, "n0");// ambiente
NexNumber n1 = NexNumber(0, 9, "n1");// fumi
NexNumber n2 = NexNumber(0, 2, "n2");//bagno
NexNumber n3 = NexNumber(0, 4, "n3");//acqua
NexNumber n4 = NexNumber(0, 12, "n4");//acqua
NexNumber n5 = NexNumber(0, 14, "n5");//UMIDITA


NexNumber n30 = NexNumber(3, 3, "n30"); //acqua
NexButton b31 = NexButton(3, 1, "b31");
NexButton b32 = NexButton(3, 2, "b32");

char buffer[100] = {0};

NexTouch *nex_listen_list[] = 
{
    &t8,
    &t9,
    &n0,
    &n1,
    &n3,
    &n4,
    &n5,
    &n2,
    &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
{
    var=1;
    dbSerial.flush();
    txh2o -= 1;
    n30.setValue(txh2o);
    delay(500);
    var=0;
    
}


void b32PopCallback(void *ptr)//h2o termocamino
{
    var=1;
    dbSerial.flush();
    txh2o += 1;
    n30.setValue(txh2o);
    delay(500);
    var=0;    
}


void setup(void)
{
    attachInterrupt(0, interruptPwm, RISING);
    attachInterrupt(1, interruptStato, RISING);
    
    HMISerial.begin(9600);
    
    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);
    
    dht.begin();
    sensors.begin();
   
    pinMode(pwm, OUTPUT);   //assegno il modo uscita digitale al pin 8
    pinMode(variabile, OUTPUT);   //assegno il modo uscita digitale al pin 8
    
    digitalWrite(variabile,LOW);
    var=0;
    segnale=0;
    txh2o=60;   //temperatura di soglia acqua termocamino
    delay(1000);
}

void loop(void)
     {
       
    nexLoop(nex_listen_list);
   
    while (var==0){
    
    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
    
    switch (stato){ 
      
    case 0: //se stato è 0 (spento)
    digitalWrite(variabile,LOW); //indica lo stato 0 a micro 2
    t9.setText("OFF");
    if(Tfumi<40){
    segnale=0;
    percentuale=0;
  }else {
    segnale=125;
    percentuale=50;
  }
    break;
    
    case 1: //se stato è 1 (acceso)
      digitalWrite(variabile,HIGH); //indica lo stato 1 a micro 2
      if(Tfumi<allTempFumi){ // verifica se le condizioni sono vere procedo con:
       segnale =map(temph2o, 0, 100, 0, 255);
       percentuale = map(segnale, 0, 255, 0, 100);
       t9.setText("ON");
       }
      else if (Tfumi>=allTempFumi){
       t9.setText("ALLARME TEMP FUMI");
       segnale=0;
       percentuale =map(segnale, 0, 255, 0, 100);
     }
    
     break;
    }
     analogWrite(pwm, segnale);  // spin the fan at the fanSpeed speed
    
     
     
    n0.setValue(tempamb);
    n5.setValue(umidita);
    n1.setValue(Tfumi);
    n4.setValue(percentuale);
    n3.setValue(temph2o);
    n30.setValue(txh2o);
    
    
    dbSerial.flush();//pulisci la seriale
    delay(1000);// aspetta un secondo
    break;//chiudi
    }
    
}
void interruptStato()
{
  stato=1;
}
void interruptPwm()
{
  digitalWrite(pwm, LOW);
  stato=0;
}




micro2
#define aspiratore 5 //imposto il pin 5 per l'aspiratore
#define coclea 6 //imposto il pin 6 per la coclea
#define circolatore 8 //imposto il pin 8 per il circolatore
#define ventola 9 //imposto il pin 9 per la ventola
#define accenditore 10 //imposto il pin 10 per l'accenditore
#define abilita 13//imposto il pin 13 per il abilitare/disabilitare micro1

const int stato= 12;//leggo lo stato acceso/spento dal micro1
const int segnale=0;//segnale pwm proveniente da micro1 collegato al pin A0

int Vstato;
int Vsegnale;//variabile 
int pwmfumi;//variabile per l'aspiratore
int Tcoclea=10000;//variabile per mandata pellet
int Vcoclea=LOW;

unsigned long timeraccenditore;
unsigned long timercoclea;

void setup(void){
attachInterrupt(0, interruptPressostato, RISING);
attachInterrupt(1, interruptTermostato, RISING);
pinMode(aspiratore,OUTPUT);
pinMode(coclea,OUTPUT);
pinMode(circolatore,OUTPUT);
pinMode(ventola,OUTPUT);
pinMode(accenditore,OUTPUT);
pinMode(stato,INPUT);
pinMode(abilita,OUTPUT);
Vstato=0;
Vsegnale=0;
digitalWrite(abilita, LOW);
}

void loop(void){
 Vstato=digitalRead(stato);//variabile pin 12 per conoscere lo stato di acceso/spento
  Vsegnale=analogRead(segnale);
  
  switch (stato){
    
    case 0:
    digitalWrite(coclea,LOW);
    if(segnale==0){
       digitalWrite(aspiratore,LOW);
       digitalWrite(circolatore,LOW);
       digitalWrite(ventola,LOW);
       digitalWrite(accenditore,LOW);
       timercoclea=0;
       timeraccenditore=0;
    }else if(segnale>0){
       digitalWrite(aspiratore,125);
       digitalWrite(circolatore,HIGH);
       digitalWrite(ventola,HIGH);
       digitalWrite(accenditore,LOW);  
    }
    break;
    
    case 1:
    digitalWrite(accenditore,HIGH);
    if(millis()-timeraccenditore > 300000){ //se sono trascorsi 3 minuti
    digitalWrite(accenditore,LOW);
    }
    pwmfumi =map(segnale, 0, 1023, 0, 255);
    digitalWrite(circolatore,HIGH);
    digitalWrite(ventola,HIGH);
    analogWrite(aspiratore,pwmfumi);
    
    if (millis() -  timercoclea > Tcoclea ){
        timercoclea = millis();  //Tiene in memoria l'ultima accensione

        if (Vcoclea == LOW)
             Vcoclea = HIGH;
        else
             Vcoclea = LOW;

        digitalWrite(coclea, Vcoclea);
     }
    break;
      
  }}
    
    void interruptPressostato()
{
  digitalWrite(abilita, HIGH);
  digitalWrite(pwmfumi, LOW);
  digitalWrite(circolatore, HIGH);
  digitalWrite(ventola, LOW);
  digitalWrite(accenditore, LOW);
}

 void interruptTermostato()
{
  digitalWrite(abilita, HIGH);
  digitalWrite(pwmfumi, LOW);
  digitalWrite(circolatore, HIGH);
  digitalWrite(ventola, LOW);
  digitalWrite(accenditore, LOW);
}


è questo è lo schema. Risolti questi problemi vorrei implementare un interfaccia grafica anche al pc,sempre se si puo fare.(io non so da dove partire)



Immagine Allegata: Schema.png
 
ForumEA/Q/Schema_3.png



---------------
Non è impossibile se è fattibile!

 

dani9191

Avatar
GigaWatt


Gruppo:Utente
Messaggi:780

Stato:



Inviato il: 14/05/2017 18:41:02

Questa è l'interfaccia



Immagine Allegata: Display.PNG
 
ForumEA/Q/Display_1.PNG



---------------
Non è impossibile se è fattibile!

 

BellaEli

Avatar
GigaWatt


Gruppo:MODERATORE
Messaggi:3286

Stato:



Inviato il: 14/05/2017 20:57:10

Sto col tel e mi è impossibile controllare il codice ma perché usi 2 micro ??? Tra loro come si palano ? Se non sai da dove partire perché hai sisegnato una ipotetica interfacca grafica ?



---------------
C'è un limite al fai da te ???
Si, ma lo stabiliamo noi !!!

 

dani9191

Avatar
GigaWatt


Gruppo:Utente
Messaggi:780

Stato:



Inviato il: 14/05/2017 22:15:27

Ciao Bellaeli, inizialmente utilizzavo un solo micro per gestire tutto,ma secondo la mia ignoranza è meglio utilizzarne 2 perche uno lo utilizzo per la comunicazione con il display e la lettura dei sensori. Invece l'altro è dedicato solo per pilotare la ventola,accenditore,aspiratore,coclea e per la sicurezza(termostato meccanico e depressostato collegati sull'interrupt di arduino).
La comunicazione tra i 2 micro inizialmente la volevo fare seriale,ma poi andava in conflitto con quella del display e poi lo impostata cosi, il micro 1 quando è in stato on (quindi ho acceso la stufa) mando a livello alto il pin 7 che è collegato con il pin 12 del micro 2 e servirà solo per dare il consenso di tutto il lavoro.
Poi micro 1 legge la temperatura rilevata la confronta con quella impostata e aumenta/dimunisce il segnale pwm 0/255 del pin 9 e lo leggo con il pin A0 del micro 2 e in base a questo segnale aumento o diminuisco la velocita dell'aspiratore e della coclea.
La sicurezza invece se per ipotesi il termostato chiude il contatto a +5v scatta l'interrupt che porta a livello alto il pin 13 e blocca tutto a parte la pompa.
L'interfaccia lo creata con nextion è funziona(sicuramente da migliorare),non so dove partire per creare un interfaccia per il pc.

Tengo a precisare che sono autodidatta quindi non sono sicuro se come sto facendo è giusto.Se lo dovresti fare tu come lo imposteresti il tutto?



---------------
Non è impossibile se è fattibile!

 

BellaEli

Avatar
GigaWatt


Gruppo:MODERATORE
Messaggi:3286

Stato:



Inviato il: 15/05/2017 00:45:14

Premetto che di termo camini ne capisco molto poco...

Concettualmente utilizzare 2 micro per svolgere un solo compito (ovvero controllare il termocamino) è errato. Sarai sempre più lento che utilizzare un solo micro, avrai sempre difficoltà a condividere le informazioni ed è tutto più complicato.
È preferibile prendere un micro più potente che non 2 su cui condividere i lavori.

Per il discorso sicurezza il concetto madre è la ridondanza: cioè devi realizzare 2 sistemi che lavorano in modo completamente indipendente tra loro, ovvero se uno salta l'altro continua a funzionare comunque e viceversa.

La ridondanza la si fa anche con un semplice termointerruttore meccanico, l'importante è che se per qualsiasi motivo il sistema che normalmente dovrebbe funzionare non lo fa interviene il piano B !

Nell'automazione industriale, ad esempio, il sistema più gettonato è il WatchDog: immaginalo come un micro che conta da 1000 mS a 0, a 0 mS stacca l'alimentazione a tutto l'impianto quindi il PLC, almeno una volta al secondo, deve resettare il WatchDoc per riportarlo a 1000 mS.
Il WatchDog lavora con alimentazioni separate dal PLC, è un sistema totalmente autonomo.

L'esempio del WatchDog serve per farti comprendere il discorso della ridondanza più che orientarti a come implementarla, vasi di espansione aperti, termostati di sicurezza, valvole di sicurezza sono tutti esempi pratici di ridondanza.

Devo guardare il codice con un PC per poterti dare qualche consiglio in più...

Elix



---------------
C'è un limite al fai da te ???
Si, ma lo stabiliamo noi !!!

 

dani9191

Avatar
GigaWatt


Gruppo:Utente
Messaggi:780

Stato:



Inviato il: 15/05/2017 07:41:47

Ok quindi sarebbe meglio usare un solo micro. Tu quale mi consigli? Me ne serve uno dip perche smd con l'attrezzatura che ho è impossibile usare smd.



---------------
Non è impossibile se è fattibile!

 

dani9191

Avatar
GigaWatt


Gruppo:Utente
Messaggi:780

Stato:



Inviato il: 15/05/2017 13:40:49

Sono indeciso se creare una scheda con i relativi rele è la slot per ospitare la scheda di arduino mega 2560 o creare una scheda da zero con il microcontrollore atmega1284. Tra le due opzioni qual'è megliore?



---------------
Non è impossibile se è fattibile!

 

BellaEli

Avatar
GigaWatt


Gruppo:MODERATORE
Messaggi:3286

Stato:



Inviato il: 15/05/2017 13:53:51

Sicuramente la seconda, più stabile e personalizzabile, ma anche più complicata !

Il fatto è che realizzare un'automazione per un termocamino non è una cosa semplicissima... la scheda deve essere estremamente affidabile e sicura, nonchè svolgere correttamente il suo ruolo.

Credo sia impossibile che, a primo colpo, riesci a realizzare esattamente ciò di cui hai bisogno, quindi in questa prima fase di sperimentazioni opta per la prima soluzione, poi col tempo dopo che avrai raggiunto un progetto abbastanza definnitivo potresti fare il passo di realizzare tutto su una scheda.

Ho dato un'occhiata molto veloce al codice ma è molto vasto, ci va troppo tempo analizzarlo tutto...

Fai delle domande più circoscritte in modo che possa concentrarmi su un singolo problema per volta...

In ogni caso non ho visto da nessuna parte la necessità di 2 micro.

Mi parli un po' del display ? Cos'è Nextion ?

Elix



---------------
C'è un limite al fai da te ???
Si, ma lo stabiliamo noi !!!

 

dani9191

Avatar
GigaWatt


Gruppo:Utente
Messaggi:780

Stato:



Inviato il: 15/05/2017 14:29:08


CITAZIONE

Sicuramente la seconda, più stabile e personalizzabile, ma anche più complicata !

Il fatto è che realizzare un'automazione per un termocamino non è una cosa semplicissima... la scheda deve essere estremamente affidabile e sicura, nonchè svolgere correttamente il suo ruolo.


Ma cosa intendi per piu complicata la programmazione o l'assemblaggio della scheda?

CITAZIONE
Credo sia impossibile che, a primo colpo, riesci a realizzare esattamente ciò di cui hai bisogno, quindi in questa prima fase di sperimentazioni opta per la prima soluzione, poi col tempo dopo che avrai raggiunto un progetto abbastanza definnitivo potresti fare il passo di realizzare tutto su una scheda.


Senz'altro tra la teoria è la pratica passero notti insogne..

CITAZIONE
Fai delle domande più circoscritte in modo che possa concentrarmi su un singolo problema per volta...


Allora diciamo che il problema principale è risolvere appunto la comunicazione del display, praticamente quando aumento/diminuisco la temperatura di set devo premere molte volte,questo secondo me è dovuto perche il micro sta eseguendo altre operazioni è ignora la pressione del tasto,guarda questo videoLINK. Io pensavo,ma non so se si puo fare,quando premo un tasto vorrei che quell'input rimanga in memoria. Io ho risolto diciamo questo problema aggiungeno while, quando il micro sta ricevendo istruzioni dal display porto una variabile a 1 è blocca tutte le altre operazioni,ma ignorando tutto il resto se per ipotesi nello stesso momento deve fare un'altra operazione piu importante viene ignorata.
Un'altra cosache non sono sicuro che funziona finche non assemblo il termo è l'accenditore che voglio che si accenda per 3 minuti quando lo stato è ON e rimane spento fino alla prossima accensione.Come anche per la coclea voglio che in base alla temperatura set aumenta o diminuisce il tempo di mandata pellet. Ho usato l'istruzione millis,ma non sono sicuro che lo impostata bene. Altrimenti come si potrebbe fare?

CITAZIONE
In ogni caso non ho visto da nessuna parte la necessità di 2 micro.

Si mi hai fatto riflettere bene, tra pwm,letture ecc... si perde molto piu tempo...

CITAZIONE
Mi parli un po' del display ? Cos'è Nextion ?


Nextion lo conoscuto da poco e ha mio avviso qualità/prezzo è un ottimo display.
è un display programmabile con il suo editor,ha un display resistivo di varie misure,16M flash e 2kbyte di ram.Piu non so dirti purtroppo perche come dicevo anche lui come arduino lo iniziati a praticare da poco è li sto studiando con l'aiuto di youtube



---------------
Non è impossibile se è fattibile!

 

dani9191

Avatar
GigaWatt


Gruppo:Utente
Messaggi:780

Stato:



Inviato il: 15/05/2017 14:45:02

LINK
Per la scheda se riesco ha ottimizzare questo cnc non dovrei avere problemi altrimenti vado con il vecchio sistema bomografo..



---------------
Non è impossibile se è fattibile!

 

BellaEli

Avatar
GigaWatt


Gruppo:MODERATORE
Messaggi:3286

Stato:



Inviato il: 15/05/2017 17:16:00

Come comunicano micro e display ?
Quali sono le istruzioni che leggono/scrivono sul display ?
Come funziona il touch ? Ovvero premi il pulsante "+" e cosa succede ? Quale variabile viene incrementata ? Arduino come capisce che è stato premuto ? Come accede alla variabile incrementata ?
Chi aggiorna la scritta sul display incrementantola di 1 ?

Perdona le tante domande, non conosco Nextion e non ho tempo di studiarlo, faccio prima a chiedere a te !

Elix



---------------
C'è un limite al fai da te ???
Si, ma lo stabiliamo noi !!!

 

dani9191

Avatar
GigaWatt


Gruppo:Utente
Messaggi:780

Stato:



Inviato il: 15/05/2017 17:58:42


CITAZIONE

Come comunicano micro e display ?

Con la seriale tx rx

CITAZIONE
Quali sono le istruzioni che leggono/scrivono sul display ?
Come funziona il touch ? Ovvero premi il pulsante "+" e cosa succede ? Quale variabile viene incrementata ? Arduino come capisce che è stato premuto ? Come accede alla variabile incrementata ?
Chi aggiorna la scritta sul display incrementantola di 1 ?


Allora con questo (NexText t8 = NexText(0, 14, "t8")) dichiaro che ho una casella testo alla pagina 0 con ID 14 e si chiama t8, è sono dei valori che assegni con l'editor di nextion.
Stessa cosa per il pulsante +( NexButton b32 = NexButton(1, 2, "b32"))gli do un nome ha questi byte

Poi quando premi ad esempio il tasto + nextion scrive nella seriale dei byte 0x65 0x01 0x02(0x01 è la pagina dove si trova il tasto + e 0x02 è il nome del tasto),arduino che è in ascolto lo legge cosi

void b32PopCallback(void *ptr)//h2o termocamino
{

dbSerial.flush();
txh2o += 1;
t8.setValue(txh2o);
delay(500);

}
(svuoto la seriale incremento di uno la texbox e scrivo lo stesso valore nella variabile txh2o).

CITAZIONE
Chi aggiorna la scritta sul display incrementantola di 1 ?

Questo lo puoi fare sia sul display stesso (si possono usare le variabili)e poi scrivere il numero tramite seriale ad arduino,oppure fare la cosa contraria,lasciare ad arduino il compito di memorizzare i numeri e visualizzarli nella textbox di nextion senza memorizzarli.(io ho fatto cosi per non appesantire troppo il display,lo sto usando piu che altro per la visualizzazione dei dati)

Nella mia testa il discorso c'e lo abbastanza chiaro,ma non sono bravo a spiegare

questo è il codice solo per arduino mega cosi almeno abbiamo fissato gia dei paletti
#include "DHT.h"     // DHT & AM2302 library
#include "Nextion.h"
#include <SoftwareSerial.h>
#include <OneWire.h>   //libreria per ds18b20
#include <DallasTemperature.h>   //libreria per conversione valore
#include "max6675.h"

int ktcSO = 44;
int ktcCS = 45;
int ktcCLK = 46;

MAX6675 ktc(ktcCLK, ktcCS, ktcSO);


#define ONE_WIRE_BUS 12  // Il terminale data del sensore è connesso alla porta 13 di Arduino
#define DHTTYPE DHT22  // DHT 22  (AM2302)
#define aspiratore 4 //imposto il pin 5 per l'aspiratore
#define coclea 5 //imposto il pin 6 per la coclea
#define circolatore 6 //imposto il pin 8 per il circolatore
#define ventola 7 //imposto il pin 9 per la ventola
#define accenditore 8 //imposto il pin 10 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);   // LED pins

int txh2o;         //temperatura di soglia termocamino
int Tfumi;
int umidita;
int tempamb;       //temperatura rilevata ambiente
int temph2o;           //temperatura acqua rilevata
int allTempFumi=150; //allarme temperatura fumi
int percentuale; //percentuale aspiratore
int var; 
int pwmfumi;//variabile per l'aspiratore
int Tcoclea;//variabile per mandata pellet
int Vcoclea=LOW;
int Vstato;

unsigned long timeraccenditore;
unsigned long timercoclea;

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, 14, "t8"); 
NexText t9 = NexText(0, 18, "t9"); 
NexNumber n0 = NexNumber(0, 1, "n0");// ambiente
NexNumber n1 = NexNumber(0, 9, "n1");// fumi
NexNumber n2 = NexNumber(0, 2, "n2");//bagno
NexNumber n3 = NexNumber(0, 4, "n3");//acqua
NexNumber n4 = NexNumber(0, 12, "n4");//acqua
NexNumber n5 = NexNumber(0, 14, "n5");//UMIDITA


NexNumber n30 = NexNumber(3, 3, "n30"); //acqua
NexButton b31 = NexButton(3, 1, "b31");
NexButton b32 = NexButton(3, 2, "b32");

char buffer[100] = {0};

NexTouch *nex_listen_list[] = 
{
    &t8,
    &t9,
    &n0,
    &n1,
    &n3,
    &n4,
    &n5,
    &n2,
    &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
{
    var=1;
    dbSerial.flush();
    txh2o -= 1;
    n30.setValue(txh2o);
    delay(500);
    var=0;
    
}


void b32PopCallback(void *ptr)//h2o termocamino
{
    var=1;
    dbSerial.flush();
    txh2o += 1;
    n30.setValue(txh2o);
    delay(500);
    var=0;    
}


void setup(void)
{
    attachInterrupt(0, interruptPressostato, RISING);
    attachInterrupt(1, interruptTermostato, RISING);
    
    HMISerial.begin(9600);
    
    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);
    
    dht.begin();
    sensors.begin();
   
    pinMode(aspiratore,OUTPUT);
    pinMode(coclea,OUTPUT);
    pinMode(circolatore,OUTPUT);
    pinMode(ventola,OUTPUT);
    pinMode(accenditore,OUTPUT);
    pinMode(stato,INPUT);
    

    var=0;
    txh2o=60;   //temperatura di soglia acqua termocamino
    delay(1000);
}

void loop(void){
    Vstato=digitalRead(stato);//variabile pin 12 per conoscere lo stato di acceso/spento 
    nexLoop(nex_listen_list);
   
    while (var==0){
    
    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
    
    switch (Vstato){ 
      
    case 0: //se stato è 0 (spento)
    if(Tfumi<=40){
      t9.setText("OFF");
      digitalWrite(aspiratore,LOW);
      digitalWrite(circolatore,LOW);
      digitalWrite(ventola,LOW);
      digitalWrite(accenditore,LOW);
      digitalWrite(coclea,LOW);
    percentuale=0;
    timercoclea=0;
    timeraccenditore=0;
  }else if (Tfumi>40) {
      t9.setText("SPEGNIMENTO");
      digitalWrite(aspiratore,255);
      digitalWrite(circolatore,HIGH);
      digitalWrite(ventola,HIGH);
      digitalWrite(accenditore,LOW);
      digitalWrite(coclea,LOW);
      percentuale=100;
  }
    break;
    
    case 1: //se stato è 1 (acceso)
      if(Tfumi<allTempFumi){ // verifica se le condizioni sono vere procedo con:
       t9.setText("ON");
       digitalWrite(accenditore,HIGH);
       if(millis()-timeraccenditore > 300000){ //se sono trascorsi 3 minuti
       digitalWrite(accenditore,LOW);
    }
     pwmfumi =map(temph2o, 0, 100, 0, 255);
     percentuale = map(pwmfumi, 0, 255, 0, 100);
     digitalWrite(circolatore,HIGH);
     digitalWrite(ventola,HIGH);
     analogWrite(aspiratore,pwmfumi);
     
     if (temph2o<txh2o){
       Tcoclea=10000;
     }else{
       Tcoclea=30000;
     }
     
     if (millis() -  timercoclea > Tcoclea ){
        timercoclea = millis();  //Tiene in memoria l'ultima accensione

        if (Vcoclea == LOW)
             Vcoclea = HIGH;
        else
             Vcoclea = LOW;

        digitalWrite(coclea, Vcoclea);
     }
    break;
    
       
  }else if (Tfumi>=allTempFumi){
       t9.setText("ALLARME TEMP FUMI");
       digitalWrite(aspiratore,LOW);
       digitalWrite(circolatore,HIGH);
       digitalWrite(ventola,LOW);
       digitalWrite(accenditore,LOW);
       digitalWrite(coclea,LOW);
       percentuale =0;
     }
    
     break;
    }
    }
     
    n0.setValue(tempamb);
    n5.setValue(umidita);
    n1.setValue(Tfumi);
    n4.setValue(percentuale);
    n3.setValue(temph2o);
    n30.setValue(txh2o);
    
    dbSerial.flush();//pulisci la seriale
    delay(1000);// aspetta un secondo
    
    }
    
    
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!

 

dani9191

Avatar
GigaWatt


Gruppo:Utente
Messaggi:780

Stato:



Inviato il: 15/05/2017 18:04:52

Per comprendere bene il funzionamento sarebbe da studiare bene la libreia nextion, ma purtroppo io non ci capisco un granchè. La parte del display lo semplicemente modificata al mio scopo (lo copiata dal sito ufficiale),ma il reale funzionamento vero è proprio lo conosco poco.



---------------
Non è impossibile se è fattibile!

 

BellaEli

Avatar
GigaWatt


Gruppo:MODERATORE
Messaggi:3286

Stato:



Inviato il: 15/05/2017 18:29:04

Si, in effetti se non ti studi bene nextion non è facile cercare gli errori...

Così a occhio sembra che quando premi un pulsante venga richiamata la funzione relativa che esegue ciò che ti pare.

Se è così allora c'è un errore grave che hai commesso, questa istruzione:
delay(500);

La funzione delay non va usata mai a meno che non debba usare arduino per far lampeggiare un solo Led !

Se usi delay blocchi tutto, toglilo di mezzo !

Un'alternativa al Delay(500), ad esempio, è la seguente sequenza:

OldTime = Millis();
if (Millis() - OldTime > 500) { ...

Perchè c'è quel Delay(500) ??? A cosa serve ?



---------------
C'è un limite al fai da te ???
Si, ma lo stabiliamo noi !!!

 

dani9191

Avatar
GigaWatt


Gruppo:Utente
Messaggi:780

Stato:



Inviato il: 15/05/2017 18:46:44


CITAZIONE

Così a occhio sembra che quando premi un pulsante venga richiamata la funzione relativa che esegue ciò che ti pare.

Si in parole semplici è proprio cosi!


Il problema è che senza delay quando premo ad esempio il tasto piu non funziona niente,non so il perche.. Invece da quando ho usato il delay funziona, ecco la tua potrebbe essere una buona soluzione
OldTime = Millis();
if (Millis() - OldTime > 500) { ...

cosi tutto il resto del pogramma non si dovrebbe bloccare rispetto al delay, giusto?



---------------
Non è impossibile se è fattibile!

 
 InizioPagina
 

Pagine: (10)   [1]   2   3   4   5   6   7   8   9   10    (Ultimo Msg)

Versione Mobile!

Home page       TOP100-SOLAR      Home page forum