[RISOLTO] Collegamento sensore Formaldeide ZE08-CH20 e Arduino

Salve a tutti. Sono diversi giorni che sto combattendo con il sensore in oggetto e non riesco a farlo funzionare con Arduino. Leggo sempre FF FF FF FF FF FF FF FF FF.
Qualcuno può darmi una mano?

Prima di tutto, nella sezione in lingua Inglese si può scrivere SOLO in Inglese ... quindi, per favore, la prossima volta presta più attenzione in quale sezione metti i tuoi post ...

... poi, essendo il tuo primo post, nel rispetto del regolamento della sezione Italiana del forum (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti IN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con MOLTA attenzione il su citato REGOLAMENTO ... Grazie.

Guglielmo

P.S.: Il tuo post è già stato spostato nell'opportuna sezione del forum "Italiano”dove puoi proseguire.

Dopo che avrai fatto quanto su richiesto, metti un link al sensore di cui parli così vediamo un po' le caratteristiche ...

Guglielmo

Non è vero che è il mio primo post, ne avevo scritti anche qualche tempo fa e ora era un pò che non scrivevo. La presentazione l'ho già fatta, quindi posso proseguire nella mia domanda o devo rifarla?

lmaselli:
Non è vero che è il mio primo post, ne avevo scritti anche qualche tempo fa e ora era un pò che non scrivevo. La presentazione l'ho già fatta, quindi posso proseguire nella mia domanda o devo rifarla?

Chiedo scusa, mio errore :kissing: , NON l'avevo trovata ... prosegui pure dando le indicazioni richieste ... :smiley:

Guglielmo

Grazie, nessun problema, io leggo spesso il forum per trovare risposte ai miei problemi, però scrivo poco, forse dovrei farlo più spesso.
Il sensore che mi fa dannare è questo Sensore Rilevamento Concentrazione diFormaldeide ZE08-CH2O.
Riesco a farlo funzionare utilizzando la lettura analogica, però vorrei provare la lettura via seriale per capire se i valori che ricevo sono credibili. Ma non riesco a farlo.

Come lo hai collegato in seriale ? Sua quali pin ? Come hai adattato il livelli ?

Guglielmo

L'ho attaccato con il pin 5 RXD al Pin TX 1 arduino e il pin 6 TXD al pin RX 0 arduino. Devo fare il partitore per portare a 3,3V il max solo sul pin 5 RXD giusto?

Si, sarebbe meglio.
Anche se forse è meglio se usi la softwareserial su altri due pin

che programma stai usando ?

Posso postare il listato?

certamente

Dai retta, evita la vera seriale di Arduino che è sempre un po' rognosa e inoltre, se la usi, NON puoi più fare debug ed usare la USB ed usa invece la libreria SoftwareSerial per creare una seconda porta seriale su altri due pin (consiglio 10 RX e 11 TX).

Guglielmo

Non uccidetemi se trovate errori banali, non ho grande esperienza con questo tipo di programmi.

int ledFormaldeide = 9;

float Formaldeide = 0.0;

float limiteFormaldeide = 0.1;

uint8_t modeQA[9] = {0xFF, 0x01, 0x78, 0x41, 0x00, 0x00, 0x00, 0x00, 0x46};
uint8_t inviaConcentrazione[9] = {0xFF, 0x01, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79};
uint8_t riceviConcentrazione[9] = {0}; // 0xFF, 0x86, 0x00, 0x2A, 0x00, 0x00, 0x00, 0x20 0x30

void ImpostaModoQA()
{
     for(int i=0;i < 9;i++)
     {    
        Serial.write(modeQA[i]);     
          
     delay(2); // attende che tutto il pacchetto sia ricevuto
     Serial.print("il valore byte impostamodoQA è ");
     Serial.println(modeQA[i],HEX);
     }
}

void RichiestaInvioDati()
{
     for(int i=0;i < 9;i++)
     {    
        Serial.write(inviaConcentrazione[i]);     
          
     delay(2); // attende che tutto il pacchetto sia ricevuto
     Serial.print("il valore byte inviaConcentrazione è ");
     Serial.println(inviaConcentrazione[i],HEX);
     }
}

void RicezioneDati()
{
     for(int i=0;i < 9;i++)
     {    
        riceviConcentrazione[i] = Serial.read();     
          
     delay(2); // attende che tutto il pacchetto sia ricevuto
     Serial.print("il valore riceviConcentrazione è ");
     Serial.println(riceviConcentrazione[i],HEX);
     }
}



void ProcessSerialData()
{
  uint8_t mData = 0;
  uint8_t i = 0;
  uint8_t mPkt[9] = {0};
  
  uint8_t mCheck = 0;
  
  // Legge i dati provenienti dal sensore come sequenza di byte
  // Il Pacchetto Dati ha il seguente formato: FF 17 04 00 Concentrazione_High Concentrazione_Low Full_Range_High Full_Range_Low 25
 
  while (Serial.available() > 0) 
  {  
     //Serial.println("Sono dentro WHILE SERIAL.AVAILABLE ");
     mData = Serial.read();     
     Serial.println(mData);
     delay(2); // attende che tutto il pacchetto sia ricevuto
    
     if(mData == 0xFF) // Message Header ok
     {
        mPkt[0] =  mData;
        mData = Serial.read();
        //Serial.print("il valore Formaldeide è ");
        //Serial.println(mData,HEX);
        if(mData == 0x17) // Il gas è la Formaldeide CH2O
        {
          mPkt[1] =  mData; // Metto il valore in mPkt(1)
          mCheck = mData;
          
          // Riceve Unit ppb - No decimal byte - Concentrazione (High Byte) - Concentrazione (Low Byte) - Full Range (High Byte) - Full Range (Low Byte) - Checksum
          // Calcola la somma dei dati precedenti che deve risultare uguale al dato successivo che è Check-sum
          for(i=0;i < 4;i++)
          {
             mPkt[i+2] = Serial.read();
             delay(2);

             //Serial.print("il valore è ");
             //Serial.println(mData,HEX);

             
             mCheck += mPkt[i+2];
          }
          mPkt[6] = Serial.read();
          delay(1);
          mPkt[7] = Serial.read();
          mCheck = mCheck + mPkt[6] + mPkt[7] + 1;
          Formaldeide = (uint16_t)(mPkt[5] + (uint16_t)mPkt[4] * 256);
          Serial.print("il valore Formaldeide ");
          Serial.println(Formaldeide);
          if(mCheck == mPkt[8]) // Se Check-sum è esatto calcola la concentrazione della Formaldeide
          {

          // Concentrazione Formaldeide = Concentrazione (High Byte)*256 + Concentrazione (Low Byte)

            Formaldeide = (uint16_t)(mPkt[5] + (uint16_t)mPkt[4] * 256);
            Serial.print("il valore Formaldeide ");
            Serial.println(Formaldeide);
             
            delay(3000);         
            return;
          }
        }      
     }

   }
}


void setup() 
{
    // Impostiamo il Pin del LED come OUTPUT
    pinMode(ledFormaldeide, OUTPUT); 

    Serial.begin(9600);
//    Formaldeide = 0.0;
//
ImpostaModoQA();
delay(1000);
}

void loop() 
{
  
  //ImpostaModoQA();
  RichiestaInvioDati();
  delay(1000);
  RicezioneDati();
  delay(1000);
  
  ProcessSerialData();
  if (Formaldeide > limiteFormaldeide)
  {
        digitalWrite(ledFormaldeide, HIGH);
  }
  else
  {
        digitalWrite(ledFormaldeide, LOW);
  }
  delay(2000);
}

>lmaselli: ti ricordo che in conformità al regolamento, punto 7, devi editare il tuo post (quindi NON scrivendo un nuovo post, ma utilizzando il bottone More -> Modify che si trova in basso a destra del tuo post) e racchiudere il codice all'interno dei tag CODE (... sono quelli che in edit inserisce il bottone con icona fatta così: </>, tutto a sinistra).

In pratica, tutto il tuo codice dovrà trovarsi racchiuso tra due tag: [code] _il _tuo_ codice_ [/code] così da non venire interpretato e non dare adito alla formazione di caratteri indesiderati o cattiva formattazione del testo. Grazie.

... ho cancellato il tuo post e corretto IO quello qua sopra.

E si che lo avevo anche scritto, ma tanto non leggete ... ::slight_smile:

gpb01:
... devi editare il tuo post (quindi NON scrivendo un nuovo post, ma utilizzando il bottone More -> Modify che si trova in basso a destra del tuo post) ...

Guglielmo

Ok scusa, sono imbranato. Non disturbo più. Lo prometto

innanzi tutto, hai visto la wiki e hai provato con la sua libreria link ?

lmaselli:
Non disturbo più. Lo prometto

Nessun disturbo, ci mancherebbe :smiley: ... solo ... un po' più di attenzione :wink:

Guglielmo

gpb01:
Nessun disturbo, ci mancherebbe :smiley: ... solo ... un po' più di attenzione :wink:
Guglielmo

Ok, grazie e scusa ancora.

brunello22:
innanzi tutto, hai visto la wiki e hai provato con la sua libreria link ?

No non ho provato quello che mi hai linkato, io ero partito da questo Serial Communication CH2O sensor e avevo cercato di capirci qualcosa. Ora leggerò con attenzione quello che mi hai linkato e poi vi farò sapere se ho risolto.

Buonpomeriggio a tutti. Allora, sono riuscito a far funzionare il sensore in modalità DAC, invece non riesco a far funzionare la modalità UART, probabilmente perché nel sensore che ho io non c'è lo switch per passare da UART a DAC, ma bisogna inviare comandi seriali e non riesco. Comunque in DAC funziona.