Sto creando un MOSTRO

Multi Output System for Termal Operation - Prima Puntata

« Older   Newer »
 
  Share  
.
  1. masterlegnano
     
    .

    User deleted


    Stasera sono andato un po' avanti

    Confermo che la stufa non risponde alla scrittura

    Reagisce ai comandi, ma non risponde sulla seriale
    Ho riscritto la funzione di scrittura, adesso per avere conferma di effettuata scrittura faccio una lettura esplicita

    Adesso sono esausto, la prossima puntata posto il codice di scrittura commentato


    Rinnovo comunque la domanda: nessuno sa come leggere l'accensione della pompa?

    Edited by masterlegnano - 6/4/2017, 07:01
     
    Top
    .
  2. masterlegnano
     
    .

    User deleted


    Eccomi qui

    come promesso il codice corretto e commentato
    per prima cosa ho revisionato la parte di interrogazione della stufa
    CODICE
    byte doma_nda(byte msb , byte lsb)
    {

     byte stringa[3];

     // trasmette alla stufa il codice e restituisce il risultato//
     // non esegue il test di integrità
     // step 2 esegue il test di integrità

     //un ciclo, prova tre volte, se ricevuto OK fa break, altrimente restituisce default
     for (int j = 0; j < 3; j++)
     {
       ser1.write(msb);
       ser1.write(lsb);
       ser1.listen();
       //ok adesso tempo di ascolto

       delay(50);

       for (int i = 0 ; ser1.available() > 0 ; i++)
       {
         stringa[i] = ser1.read();


       }
       ser2.listen();

       // effettuo il test

       if (msb + lsb + stringa[1] == stringa[0])
       {
         //test OK

         return stringa[1];

         break;

       }
       else
       {

       }

     }

    }



    e poi ho riscritto la parte di scrittura sulla stufa, prendendo atto che la mia stufa non risponde sulla seriale

    CODICE
    byte scri_vi( byte banco, byte lsb, byte valore)

    {

     char stringa[3];

     // trasmette alla stufa il codice e restituisce il risultato//
     // non esegue il test di integrità, esegue una lettura

     //un ciclo, prova tre volte, se ricevuto OK fa break, altrimenti restituisce default
     for (int j = 0; j < 3; j++)
     {
       ser1.write(banco);
       ser1.write(lsb);
       ser1.write(valore);
       // trasmetto crc
       ser1.write(byte(banco + lsb + valore));
       // inutile fare un check
       //faccio invece una lettura esplicita e la confronto con il valore programmato

       delay(50);
       // adesso leggo (offset tra lettura e scrittura 128
       if (doma_nda(banco - 128, lsb) == valore)
       {

         return doma_nda(banco - 128, lsb);
         break;
       }
       else
       {

    // test non superato, lascio andare avanti perchè il ciclo ripete

       }
     }

    }
     
    Top
    .
  3.  
    .
    Avatar

    Napalm

    Group
    Member
    Posts
    5,523
    Location
    Rijeka,Croazia

    Status
    Anonymous
    masterlegnano, ma hai provato a scrivere con seriale dell pc usando un terminal? Per vedere se la stufa effettivamente risponde ?
    Perche non so se tempo di attesa sia giusto,forse alla stufa serve piu tempo per la risposta.
    Potresti provare :
    while (!ser1.available()) {delay (50)}
    e poi la lettura
    Cosi vedi se si blocca li o la stufa risponde ma con piu ritardo.
    Che cmq non lavoro con delay perche rallenta il programma.
     
    Top
    .
  4. masterlegnano
     
    .

    User deleted


    No, in effetti non ho provato da pc
    Stasera tempo permettendo provo
    Ma mi sembra strano, perché con la lettura la stufa risponde subito, e comunque trovo il valore scritto, a indicare che la stufa ha comunque eseguito
    Grazie, sei sempre un grande
     
    Top
    .
  5. masterlegnano
     
    .

    User deleted


    Per cominciare buona pasqua a tutti


    questa settimana non sono andato avanti
    all'ora:
    interfaccia web: shield ethernet guasto (madonne e santi vari, ma comunque fermo)
    radio: le radio SPI fanno Caxare, sono pressocchè inutilizizzabili
    vanno bene solo per giocare, ma appena si tenta di fare qualcosa si trovano limitazioni a iosa
    anche qui il xulo è girato molto, ma molto tanto

    insomma una settimana sprecata
    per adesso aspetto le radio seriali e la nuova shield ethernet

    di nuovo buona pasqua a tutti
     
    Top
    .
  6. masterlegnano
     
    .

    User deleted


    Va bene, devo chiedere scusa per la mia lunga assenza:

    Scusatemi, è da Pasqua che non mi faccio vivo

    sono successe varie cose e mi hanno allontanato dal problema

    1 ho finito il pellet
    2 è finito l'inverno
    3 naturalmente in estate non ci pensavo
    4 ho avuto alcune false partenze, che voglio condividere con voi per aiutare chi magari vuole seguire la mia stessa strada

    per cominciare le radio SPI:
    ho provato a usare dei moduli CC1101: una delusione, troppo complessi da usare, troppe variabili, sempre un casino
    sono passato a delle radio seriali, dei moduli HC12, molto più semplici da gestire

    poi lo shield Ethernet ha fatto un po' girare, anche dopo averlo cambiato mi sono accorto che gestire via HTML non è così banale per un inesperto come me

    inoltre c'è da considerare il problema della autenticazione degli utenti, non vorremo certo esporre la nostra stufa alle mani per primo picio che passa

    anche il problema della sicurezza in internet, dovendo esporre un server web a cani e porci, con porte aperte nel router non è una buona idea

    quindi ho optato per una soluzione meno raffinata, ma credo molto più sicura: il BOT di Telegram su una nodeMCU

    da ultimo mi stavo incasinando con la gestione di una rete di arduino che si parlavano attraverso una radio seriale e con un'altra seriale parlavano alle stufe e altri ammeniccoli


    insomma un casino, nulla di buono

    quindi di recente, armato di santa pazienza e di un po' di umiltà mi sono rimboccato le maniche e sono ripartito dal basso

    proseguo nel prossimo post
     
    Top
    .
  7. masterlegnano
     
    .

    User deleted


    Dicevo che gestire su un arduino UNO tre seriali, una hardware su usb per il PC in debug, una software sulle radio e una software sulla stufa è una complicazione bestia, oltre che inutile

    ho quindi deciso di collegare la stufa direttamente al modulo HC12 per trasmettere via radio direttamente i comandi indirizzati alla stufa

    così mi permette di avere una sola seriale SW sull'arduino e mi semplifica anche i collegamenti alla stufa

    se vi ricordate nei vecchi post avevo identificato, sulla seriale della stufa i tre fili usati, meno, +20V (che a me sono 17) e seriale bidirezionale

    e avevo anche postato lo schema di un adattatore che permette di collegare la seriale di arduino alla stufa
    aggiungendo a quell'adattatore un semplice integrato LM7805 e due condensatori posso collegare direttamente il modulo HC12 alla stufa e comandare così direttamente la stufa dalla radio

    naturalmente serve programmare il modulo HC 12 per i parametri di comunicazione della stufa, che ricordo sono 1200BPS 8 bit nessuna parità e 2 bit di stop

    per programmare lo HC12 basta collegarlo ad un arduino, collegando TX al RX della software serial
    Rx al TX della Softwareserial (da adesso abbrevio SWS)
    VCC al 5V
    Gnd al Gnd
    e il quinto filo, SET ad un pin libero dell'arduino, io ho usato il 4

    quindi il programma viene una cosa del genere:

    CODICE
    #include <SoftwareSerial.h>
    SoftwareSerial Radio(2, 3); // RX, TX


    void setup(void)
    {
       Serial.begin(9600);
       Radio.begin(9600);
       pinMode(4, OUTPUT);
       digitalWrite(4, HIGH);
       delay(200);
    }


    per il setup

    poi , abbassando il pin 4 il modlo HC 12 passa in modalità AT, e si può programmare

    serve dare dei tempi di attesa per lasciare al modulo il tempo di passare da una modalità all'altra

    CODICE
    // abbasso il pin 4 (SET)
                   digitalWrite(4, LOW);
                   // aspetto il tempo che serve
                   delay(80);
                   Radio.print("AT+B1200");
                   delay(80);
                   digitalWrite(4, HIGH);
                   delay(200);
                   break;


    naturalemnte dopo aver cambiato la velocità il modulo non risponderà più al programma
    serve cambiare, un passo alla volta, la velocità
    poi cambiare il l'impostazione della SWS alla nuova velocità e cambiare il bit di stop
    con un comando AT+U8N2 che imposta 8 bit nessuna parità e due bit di stop

    sapendo che dovrò comandare più di una macchina ho previsto anche la possibilità di cambiare il canale di comunicazione , lasciando riservato il canale 1 per altre cose, ed il canale due per la stufa

    quindi ho scritto un programma che gestisce un embrione di comandi

    riceve dalla USB dei caratteri e se li riconosce esegue semplici operazioni

    CODICE
    #include <SoftwareSerial.h>
    SoftwareSerial Radio(2, 3, false, true); // RX, TX


    void setup(void)
    {
       Serial.begin(1200);
       Radio.begin(1200);
       pinMode(4, OUTPUT);
       digitalWrite(4, HIGH);
       delay(200);
    }

    void loop(void)
    {
       if (Serial.available())
       {
           char c = Serial.read();

           switch (c)
           {
               case '\n':
               case '\r':
                   break;

               case '1':
                   // abbasso il pin 4 (SET)
                   digitalWrite(4, LOW);
                   // aspetto il tempo che serve
                   delay(80);
                   Radio.print("AT+C001");
                   delay(80);
                   digitalWrite(4, HIGH);
                   delay(200);
                   break;

               case '2':
                   // abbasso il pin 4 (SET)
                   digitalWrite(4, LOW);
                   // aspetto il tempo che serve
                   delay(80);
                   Radio.print("AT+C002");
                   delay(80);
                   digitalWrite(4, HIGH);
                   delay(200);
                   break;

               case '?':
                   report();
                   break;

               case '+':
                   // accendo la stufa
                   scri_vi(0x80, 0x21, 0x01);
                   // svuoto il buffer seriale
                   delay(20);

                   while (Radio.available())
                   {
                       Radio.read();
                       delay(20);
                   }

                   report();
                   break;

               case '-':
                   // spengo la stufa
                   scri_vi(0x80, 0x21, 0x06);
                   report();
                   break;

               case '*':
                   // stato 2
                   scri_vi(0x80, 0x21, 0x02);
                   report();
                   break;

               default:
                   Serial.println(F("Comando non riconosciuto"));
           }
       }

       if (Radio.available())
       {
           char c = Radio.read();
           Serial.write(c);
       }
    }



    byte doma_nda(byte msb , byte lsb)
    {
       char stringa[3];

       // trasmette alla stufa il codice e restituisce il risultato//
       // step 2 esegue il test di integrità

       //un ciclo, prova tre volte, se ricevuto OK fa break, altrimente restituisce default
       for (int j = 0; j < 3; j++)
       {
           Radio.write(msb);
           Radio.write(lsb);
           //ok adesso 1/3 secondo di ascolto
           delay(300);

           for (int i = 0 ; Radio.available() > 0 ; i++)
           {
               stringa[i] = Radio.read();
           }

           // effettuo il test
           if (msb + lsb + stringa[1] == stringa[0])
           {
               //test OK
               return stringa[1];
               break;
           }
           else
           {
               return 255;
           }
       }
    }

    byte scri_vi(byte banco, byte lsb, byte valore)

    {
       char stringa[3];

       // trasmette alla stufa il codice e restituisce il risultato//
       // non esegue il test di integrità

       //un ciclo, prova tre volte, se ricevuto OK fa break, altrimenti restituisce default
       for (int j = 0; j < 3; j++)
       {
           Radio.write(banco);
           Radio.write(lsb);
           Radio.write(valore);
           // trasmetto crc
           Radio.write(byte(banco + lsb + valore));
           //ok adesso 1/3 secondo di ascolto
           delay(300);

           for (int i = 0 ; Radio.available() > 0 ; i++)
           {
               stringa[i] = Radio.read();
               //   Serial.print(stringa[i]);
           }

           // effettuo il test
           if (stringa[0] == lsb)
               //sembra che ci sia qualche problema col test
           {
               return stringa[1];
           }
       }
    }


    void report(void)
    {
       //  stampa un report delo stato della stufa
       Serial.print(F("Stato della stufa: "));
       byte s = doma_nda(00, 33);
       Serial.print(s);

       switch (s)
       {
           //  (0 = spenta, 1/2=accensione, 3=avvio 4=lavoro, 6=pul.finale)
           //  (0-off, 1-starting, 2-load pellet, 3-flame light, 4-work, 5-cleaning, 6-, 7-cleaning final)
           case 0:
               Serial.println(F(" -> Spenta"));
               break;

           case 1:
               Serial.println(F(" -> Start"));
               break;

           case 2:
               Serial.println(F(" -> Accensione"));
               break;

           case 3:
               Serial.println(F(" -> Avvio"));
               break;

           case 4:
               Serial.println(F(" -> Lavoro"));
               break;

           case 5:
               Serial.println(F(" -> Sconosciuto"));
               break;

           case 6:
               Serial.println(F(" -> Pulizia finale"));
               break;

           default:
               Serial.println(F(" -> stato sconosciuto"));
       }

       Serial.print(F("temperatura acqua "));
       Serial.println(doma_nda(00, 0x01) / 2);
       Serial.print(F("temperatura fumi "));
       Serial.println(doma_nda(00, 0x5A));
    }


    Avanti qui per non allungare troppo il post


    noterete che apro anche la seriale USB a 1200, non credo sia necessario, ma mi viene comodo per altre cose

    in questa maniera arduino può cambiare il canale alla radio, usando i comandi AT

    e una volta che è sul canale 2, riservato alla stufa può tramettere e ricevere direttamente via radio

    la parte di interrogazione e comando della stufa è praticamnete quella già postata, ho solo fatto qualche correzione minore e cambiato nome alla SWS, eliminato anche la seconda SWS, inutile

    Comunque rimangono tutti i miei dubbi che avevo espresso prima di Pasqua:

    i tempi i sembrano strani
    ho problemi nel ricevere dalla stufa la conferma di comando ricevuto
    inoltre lo stato della stufa locazione 0x21 non riporta tutti gli stati, sembra che carico pelle e accensione condividano il numero
    anche lavoro e modula non riesco a discriminarli

    qualcuno ha qualche info di più?
    anche la temperatura fumi 0x5A si comporta stranamente, ad un certo punto arriva a 255, non capisco

    dai, datemi una mano a scoprire gli indirizzi e i significati, insieme possiamo farcela, grazie
     
    Top
    .
  8. masterlegnano
     
    .

    User deleted


    CITAZIONE (masterlegnano @ 1/4/2017, 13:40) 
    quindi la stufa prende i comandi del telecomando anche sulla seriale?
    mitico

    BMW sei un grande......

    Mi autocito, per ringraziare ancora BMWmilos,

    aggiungo solo che per trasmettere i codici del telecomando dalla seriale serve stare attenti alla cadenza
    è tutta sera che ci provo, e solo adesso ho scoperto che serve trasmettere 3 o 4 volte lo stesso codice, lasciando un tempo di attesa tra uno e l'altro di circa 150 millisecondi

    lo scrivo qui a futura memoria
     
    Top
    .
  9.  
    .
    Avatar

    Napalm

    Group
    Member
    Posts
    5,523
    Location
    Rijeka,Croazia

    Status
    Anonymous
    Non mi ricordo,ma mi sembra di averlo scritto. Perche anche per accendere devi tenere il tasto sia sulla stufa sia sull telecomando. Cmq sei andato avanti bene. Io non ci riesco,tra lavoro e famiglia non ho tempo. Cioe si,ma a mezzanotte non ho piu voglia per niente.
     
    Top
    .
  10. masterlegnano
     
    .

    User deleted


    occome ti capisco
    ho la moglie in vacanza, questo spiega tutto

    sto adesso provando una accensione completa da seriale, con le radio
    la stufa è adesso in "avvio"
     
    Top
    .
  11. masterlegnano
     
    .

    User deleted


    ciao a tutti

    sono di nuovo a voi, per aggiornarvi
    oggi finalmente sono riuscito a trovare il tempo per collegare anche la seconda stufa alla radio

    funziona egregiamente, riesco da telegram ad accendere e spegnere le stufe singolarmente, inteso come start da spente fino a modula (termostato posteriore aperto),
    interrogarle per conoscerne lo stato e regolare ed eventilamente far scattare il termostato generale che porta in potenza le stufe (via contatto posteriore termostato) e predispone la caldaia a metano in soccorso (avvio se in mezzora le stufe non sono in potenza)

    inoltre posso conoscere la temperatura di casa e aprire il cancello elettrico, ma questo poco importa per noi

    ho fatto esattamente come ho descritto fin qui, se poi qualcuno volesse delle dritte per farlo anche lui non ha che da chiedere

    non posto tutto il codice perché è pesante e lungo, ci sono parti telegram e parti di comunicazione serial che magari non interessano a tutti

    ma se volete basta chiedere

    prossimi passi:

    un cronotermostato che accenda e spenga le macchine e mi sorvegli la temperatura del boiler
    un grafico delle temperature su internet
    e poi l'appetito vien mangiando.....
    ancora grazie a tutti voi, per le idee e gli spunti che ho trovato in questo magnifico forum


    PS, ma nessuno sa come leggere lo stato della pompa di una idropellet?
     
    Top
    .
40 replies since 13/3/2017, 19:38   2000 views
  Share  
.