ARDUINO - ORP e PH controllate da 74HC4052E

Il lavoro che devo fare consiste nel poter avere controllate da ARDUINO 2 sonde di lettura per la misurazione PH e 2 sonde per la misurazione ORP.
Ho acuistato questi circuiti HP e ORP http://www.atlas-scientific.com/Arduino-ph.html e fatti lavorare singolarmente sfruttando la libreria NewSoftSerial per TX/RX virtuali sono risuciot a farle funzionare (la loro documentazione era ben fatta). Però essendo 4 sonde, sempre prendendo spunto dalla loro documentazione, volevo collegarle ad un 4052 come da loro indicato ma purtroppo non riesco a farlo funzionare. I collegamenti sono abbastanza certo di averli fatti giusti ma a livello di codice e di come utilizzare il 4052 come ingresso diciamo che non ho trovato spiegazioni o applicazioni da cui trarre spunto (copiare XD ).
Mi potete gentilmente dare una mano.Magari dandomi qualche dritta su dove trovare esempi di utilizzo di questo multiplex?

Il risultato che ho sul serial monitor è sostanzialemtne questo:

check probe che )9 6 8 check probecheck
Úª*
N©ÊJúûÚ

quello che invece mi aspettavo e che compariva al regolare funzionamento sarebbe stato il seguente che diceva di verificare la sonda
check probe
check probe

il codice utilizzato è il seguente ed è per solo un sonda , suppongo che ci sia qualche cosa di non sincronizzato relativamente alla trasmissione del dato ma non avrei ide di cosa

char stamp_data[15];                            //this is where the data from the stamp is stored. The array is 15 char long because
                                                //if no pH probe is connected, the message "check probe" is transmitted.
                                                //Having an array that is to small will cause data corruption and could cause the Arduino to crash.  

byte holding;                                   //used to tell us the number of bytes that have been received by the Arduino and are holding in the buffer holding 
byte i;                                         //counter
byte startup=0;                                 //used to control the start-up sequence  


#include <NewSoftSerial.h>                      //this will let the software take advantage of the "newsoftserial" library.                     

NewSoftSerial mySerial =  NewSoftSerial(5, 6);  //setup and rename soft uart.
//                                      RX|TX 

void setup()
  { 
  pinMode(2, OUTPUT);    // s0
  pinMode(3, OUTPUT);    // s1
  pinMode(4, OUTPUT);    // E
  
  Serial.begin(38400);
  mySerial.begin(38400);                        //set up the soft serial to run at 38400               

  }
 
void loop () {
  // L L L Y0
  // L L H Y3
 
 digitalWrite(2, LOW);
 digitalWrite(3, LOW);
 digitalWrite(4, LOW);
      
 
if(startup==0){                                 //if the start-up sequence has not been run 
  for(i=1; i <= 2;i++){                         //we go through this for-loop twice, turning on/ off the stamp leds  
      delay(1000);                              //wait 1 second
      mySerial.print("l0");                     //turn off the led
      mySerial.print(13,BYTE);                  //ALWAYS end a command with <CR> (which is simply the number 13) or (print("/r") 
      delay(1000);                              //wait 1 second
      mySerial.print("l1");                     //turn on the led
      mySerial.print(13,BYTE);                  //ALWAYS end a command with <CR> (which is simply the number 13) or (print("/r") 
  }
  startup=1;                                    //stop the star-tup loop from happening by setting the startup var to 1 

  delay(1000);                                  //after the stamp leds flashed twice, lets wait 1 second befor we give the stamp a new command
  
   mySerial.print("c");                        //the command "c" will tell the stamp to take continues readings
   mySerial.print(13,BYTE);                    //ALWAYS end a command with <CR> (which is simply the number 13) or (print("/r")
  delay(1000);     
   //to take a single reading
   //you would simple send the command
   //mySerial.print("r");     
   //mySerial.print(13,BYTE);
   
   //to take a temperature dependent reading
   //send the temperature in celsius, let's say
   //the temperature in celsius is 18.5
   
   //mySerial.print("18.5");     
   //mySerial.print(13,BYTE);
}
 



 if(mySerial.available() > 3) {              //if we see the more then three bytes have been received by the Arduino 
    holding=mySerial.available();            //lets read how many bytes have been received 
    
    for(i=1; i <= holding;i++){             //we make a loop that will read each byte we received 
        stamp_data[i]= mySerial.read();     //and load that byte into the stamp_data array
    }
    
    for(i=1; i <= holding;i++){            //we now loop through the array         
        Serial.print(stamp_data[i]);       //printing each byte we recived  through the hardware UART
       }
       Serial.println("");                //once we finished, we print a nul char with the <CR><LF> command. 
     
  }
}

grazie

Ciao,

sembra apparentemente un problema di velocità di comunicazione in bps, i dati che ricevi non vengono interpretati correttamente.

ora mi studio un po' la documentazione ed il tuo sketch poi ti dico :stuck_out_tongue:

ciao
kattivik76

Grazie kattvik76!!!
Infatti ho già fatto delle prove diminuendo il valore del baund della porta di conunicazione ma non ho avuto miglioramenti.
Per quanto riguarda il circuito da quello che mi è sembrato di capire fa una lettura ogni 501 ms
Magari alla fine della prima lettura potrei mettere high il contatto E in modo che il 4052 si resetti terminata la comunicazione da parte della sonda?

La seriale RS232 con o senza livelli TTL non é fatto per un sistema bus. È un interfaccia punto a punto.
L' uso di un multiplexer (che non ha scritto che schema hai usato) é un uso non conforme alle specifiche dello standart RS232.
Mandaci il link per lo schema del 4052.

Ciao Uwe

SI!
Allora lo skema di come ho collegato il 4052 all'arduino sostanzialemente lo preso direttamente dalla pagina del produttore eccolo http://www.atlas-scientific.com/_documents/Application_Note_stamps_001.pdf (intendi questo per link dello schema)

Il multiplex è della TI e riporta 74HC4052E

Ovviametne da ignorante in materia ho capito che in base al segnale sui tre pin il multiplex riceve o trasmette con il circuito associato, poi attivando variando lo stato dei pin passo alla seconda e via fino a gestire le 4 ...

Tnks

Ciao,

secondo quanto ho visto sulla documentazione, lo sketch che hai utilizzato serve per leggere in continuo "c" il valore misurato direttamente sulla scheda pH..

ti allego lo sketch modificato per l'utilizzo del multiplexer seriale 74HC4052.

n.b.: non ho potuto provarlo :smiley:

fammi sapere :smiley:

saluti
Kattivik76

_74hc4052.pde (8.78 KB)

I problemi concettuali sono:
Il programma esempio setta le interfacce per una spedizione continua del dato di misura.
Visto che il multiplexer 4052 separa direttamente le interfaccie e ne collega solo uno la comutazione non sincronizzata comporta problemi.
Devi essere consapevole che le interfacce non sanno che se sono collegate al Arduino o nó percui possono andare perse dei dati.
È meglio mettere le interfaccie in modalitá reqest e selezionare il collegamento e poi chiedere e leggere il dato.
Questo non spiega i caratteri strani.
Controlla la velocitá della seriale. Togliendo il 4052 funziona?
Ciao Uwe

Si se tolgo il 4052 funziona. Provo a fre la richiesta singola e vi faccio sapere.

ok, prova poi a caricare lo sketch che ti ho postato prima

ricolleganto il multiplexer 74HC4052, dovrebbe funzionare :smiley:

saluti
kattivik76

kattivik grazie mille e compliemtni per la chiarezza del codice.
Allora ho buttato su lo sketch e in un primo momento ho avuto ancora problemi.
Allora ho fatto nel seguente modo:

  • commentato il codice relativo alle altre seriali tranne la 0 e ricaricato ......
    il prblema persite .... mi compaiono ancora dei cratteri strani
  • allora oltre a commentare il codice ho anche socllegato dal multi l'apparato della seriale 3 .....
    il bussolotto leggeva correttamente il valore del ph..

Quindi..
come mai anche se c'era solo il comando epr leggere il seriale 0, veniva sposcato dal segnale 3?

Adesso provo a fare il cotnrario o spostare il 3 sul 2 ...

idee??

Fatto funzioanare l'altra sonda utilizzando sempre la stesssa seriale 0, mi legge ORP. Se collego anche l'altra seriale mi scrive dei caratteri non defirabili all'interno dei valori buoni ad esempio 45 * ( .99 dove i numeri sono la parte buona. Come se si trovasse dello sporco proveniente dall'alrea scheda ...
ricontrollo i collegamenti non vorrei aver invertito qualche cosa sicurametne avrò fatto qualche casino...

come alimenti i moduli?
Ciao Uwe

Infatti mi era venuto in mente pure quello, i moduli li alimento con i 3.3 dell'arduino con il quale alimento anche il multiplex.

Bha questa sera provo a connetterci le sonde giusto epr avere un valore di riferimento e vedere cosa succede.
Adesso ad esempio ho invertito i tx rx della seconda scheda e non viene più fuori l'errore .... ma la cosa ovviametne non è corretta.
Se scollego fisicametne una scheda dal multiplex mi vengono restituiti comunque entrambi i valori di ORP e HP e la cosa non è corretta, da dove prende la lettura del secondo circuito se è scollegato?

1.18 ORP
1.33 PH
1.18 ORP
1.37 PH
1.18 ORP
1.37 PH
1.18 ORP
1.37 PH
1.22 ORP
1.40 PH
1.22 ORP

Perché usi i 3,3V se i moduli funzionano anche con 5V?
Ti crei 2 problemi:

  • L' alimentazione del Arduino probabilmente non regge la corrente dei 4 modulini. I dati tecnici non sono chiari; parla di 1,6mA a LED spenti ma non dice quant é a LED accesi. (calcolando 5mA a 8 LED accesi sono 40mA!!)
    Se usi un arduino 2009 puó dare 50mA sui 3,3V; l' arduino UNO puó dare 80mA.
  • I segnali della seriale sono 0-5V sulla TX Arduino e 0-3,3V RX Arduino. Dando 5V a un entrata di un circuito integrato che lavora a 3,3V normalmente lo rompi. L' Arduino legge secondo dati tecnici come H tensioni sopra 3V. Puó anche esserci che con qualcche disturbo o carico non ci sono i 3,3V ma quache Decimo di volt di meno e l' arduino non riconosce il livello H oppure solo ognitanto.
    http://www.atmel.com/dyn/resources/prod_documents/doc8161.pdf pagina 313

Soluzione: alimenta tutto con 5V.

Ciao Uwe

Sto usando per il momento solo 2 schede così faccio prima a capire cosa non funziona ..

Quello che non reggesse me lo ero posto ed avevo provato ad alimentare tutto a 5v ma sembra ancora peggio. Non mi da nessun lettura anche se il led della scheda PH lampeggia. Riportando a 3.3 funziona nuovamente .... ma mi legge tutte le 2 seriali anche se una è staccata, sto usando la 0 e la 3.
Metto a 5 volt solo il 4052 ... risultato sorprendente adesso mi legge solo la scheda che effettivametne è connessa allo 0 il PH.
Attacco TX RX della scheda ORP e non arriva più nulla sul serial monitor anche se le schedine lampeggiano.
Resetto e non va più nulla!!!!
Tolgo il 5V dal 4052 e metto 3V da segnali di vita ma non ci siamo ....

ok mazatta da 5 kg e risolvo ....
5 respiri profondi e riparto da zero!! Tutto alimentato a 5V

in bocca al lupo