Salve tutti Vorrei usare per un Atlas Scientific Arduino Rapid Development Shield controllo PH
con montato su pH Circuit - EZO un LCd e un elettrovalvola per CO2
c'è qualcosa di meglio un po meno costoso? e fattibile avere una regolazione del PH max e min
che controlla una elettrovalvola?
Vedrò di pubblicare gli sketch mi servirebbe una mano come fare impostare un range Min Max.
Grazie
Vedo una grande partecipazione a riguardo di un problema! allora pubblico lo sketch
e fattibile mettere un rele che apre chiude a un certo valore di ph.
Grazie
#include <LiquidCrystal.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <Relè> <---------
LiquidCrystal lcd(8, 9, 4, 5, 6, 7); // select the pins used on the LCD panel
#define ONE_WIRE_BUS 2 // DS18B20 connect to Pin 2
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
#define STX 0xAA // define STX for serial communication
#define ETX 0XBB // define ETX for serial communication
byte RxCmd [4] = {0,0,0,0};
// define some values used by the panel and buttons
int lcd_key = -1;
int adc_key_in = 0;
int adc_key_prev = -1;
int CurrentMode = 0; // 0 = Normal Display , 1 = Debug1 , 2 = Debug2
int CalSelect = 0; // 0 = PH4 Calibration Select , 1 = PH7 Calibration Select
const int NumReadings = 10; // number of reading for LM35
int Index = 0; // index
int TempReadings[NumReadings]; // array for store LM35 readings
int TempTotal = 0; // LM35 running total
int TempAverage = 0; // LM35 average reading
double TempValue = 0; // LM35 Temperature Data in Human Reading Format after calculation
int PhReadings[NumReadings]; // array for store PH readings
int PhTotal = 0; // PH running total
int PhAverage = 0; // PH average reading
double Ph7Buffer = 6.86; // For PH7 buffer solution's PH value , 7 or 6.86
double Ph4Buffer = 4.01; // For PH4 buffer solution's PH value , 4 or 4.01
double Ph7Reading = 528; // PH7 Buffer Solution Reading.
double Ph4Reading = 655; // PH4 Buffer Solution Reading.
double PhRatio = 0; // PH Step
double PhValue = 0; // Ph Value in Human Reading Format after calculation
#define btnRIGHT 0
#define btnUP 1
#define btnDOWN 2
#define btnLEFT 3
#define btnSELECT 4
#define btnNONE 5
int read_LCD_buttons(){ // read the buttons
adc_key_in = analogRead(0); // read the value from the sensor
delay(10); // switch debounce delay. Increase this delay if incorrect switch selections are returned.
int k = (analogRead(0) - adc_key_in); // gives the button a slight range to allow for a little contact resistance noise
if (5 < abs(k)) return btnNONE; // double checks the keypress. If the two readings are not equal +/-k value after debounce delay, it tries again.
//lcd.print(adc_key_in); // read button value and print for calibrate
// my buttons when read are centered at these valies: 0, 144, 329, 504, 741
// we add approx 50 to those values and check to see if we are close
// We make this the 1st option for speed reasons since it will be the most likely result
if (adc_key_in > 1000) return btnNONE;
if (adc_key_in < 50) return btnRIGHT;
if (adc_key_in < 150) return btnUP;
if (adc_key_in < 350) return btnDOWN;
if (adc_key_in < 550) return btnLEFT;
if (adc_key_in < 750) return btnSELECT;
return btnNONE; // when all others fail, return this.
}
int reading(){ // Reading LM35 and PH Data
// Samplin LM35 and PH Value
TempTotal= TempTotal - TempReadings[Index]; // subtract the last reading:
PhTotal= PhTotal - PhReadings[Index]; // subtract the last reading:
TempReadings[Index] = analogRead(1); // read from the sensor : LM35
PhReadings[Index] = analogRead(2); // read from the sensor : PH
TempTotal= TempTotal + TempReadings[Index]; // add the reading to the temperature total:
PhTotal= PhTotal + PhReadings[Index]; // add the reading to the ph total:
Index = Index + 1; // advance to the next position in the array:
if (Index >= NumReadings){ // if we're at the end of the array...
Index = 0; // ...wrap around to the beginning:
TempAverage = TempTotal / NumReadings; // calculate the average:
PhAverage = PhTotal / NumReadings; // calculate the average:
}
TempValue = (double) TempAverage / 3.4 * (5/10.24); // LM35 connect to CA3140 for amplify 3 time
PhValue = (Ph7Reading - PhAverage) / PhRatio + Ph7Buffer; // Calculate PH
}
void setup(){
lcd.begin(16, 2); // start LCD library
for (int TempThisReading = 0; TempThisReading < NumReadings; TempThisReading++) // initialize all the LM35 readings to 0:
TempReadings[TempThisReading] = 0;
for (int PhThisReading = 0; PhThisReading < NumReadings; PhThisReading++) // initialize all the Ph readings to 0:
PhReadings[PhThisReading] = 0;
PhRatio = (Ph4Reading - Ph7Reading) / (Ph7Buffer - Ph4Buffer); // Calculate Ph Ratio
Serial.begin(9600);
while(Serial.available()) Serial.read(); // empty RX buffer
Serial.println("Starting");
}
void loop(){
if (Serial.available()) {
delay(2);
RxCmd[0] = Serial.read();
if (RxCmd[0] == STX) {
int i =1;
while(Serial.available()) {
delay(1);
RxCmd = Serial.read();
_ //if (RxCmd*>127 || i>7) break; //Communication error*_
_ if (RxCmd*==ETX) {
break; //Read all data*
* }
i++;
}
}
}
if ( RxCmd[1] == 1 ){
lcd.setCursor(9,1);
switch (RxCmd[2]) {
case 1:{
//Serial.print("Command 1 Received "); // Enquiry Water Temperature (DS18B20)
Serial.println(sensors.getTempCByIndex(0),2); // Return DS18B20 Data*
* break;
}
case 2:{
//Serial.print("Command 2 Received "); // Enquiry Room Temperature (LM35)
Serial.println(TempValue,2); // Return LM35 Data*
* break;
}
case 3:{
//Serial.print("Command 3 Received "); // Enquiry PH Data*
* Serial.println(PhValue,2); // Return PH Data*
* break;
}
case 4:{
//Serial.println("Command 4 Received "); // Enquiry Water Temp. & Room Temp. & PH*
* Serial.println(sensors.getTempCByIndex(0),2); // Return DS18B20 Data*
* Serial.println(TempValue,2); // Return LM35 Data*
* Serial.println(PhValue,2); // Return PH Data*
* break;
}
}
}
for (int i = 0 ; i < 5 ; i++) {
RxCmd = 0;
}
if (CurrentMode == 0) // Nomral Display Mode
{*
reading(); // Reading LM35 and PH Data for display
lcd.setCursor(13,0);
lcd.print("PH ");
lcd.setCursor(0,0); // set the LCD cursor position
*lcd.print("Room"); *
lcd.setCursor(0,1);
*lcd.print("Water"); *
lcd.setCursor(6,0);
lcd.print(TempValue); // display room temperature value (LM35)
*delay(1); // delay in between reads for stability *_
**@Markplus: ** ti ricordo che in conformità al regolamento, punto 7, devi editare il tuo post (in basso a destra del post, bottone More -> Modify) e racchiudere il codice all'interno dei tag CODE (... sono quelli che in edit inserisce il bottone fatto così: </>, tutto a sinistra). Grazie.
Guglielmo
e fattibile mettere un rele che apre chiude a un certo valore di ph.
Grazie
No, non é nessun problema; basta fare un if e un digitalWrite.
è necessario una temporizzazione per non metterci troppa CO2 visto che la misura e la miscelazione sono lente.
Ciao Uwe
PS metti il codice dentro i TAG CODE.
Forse nessuno ha risposto poiché non hai avuto l'accortezza di fornire i link del prodotti citati, non trovi?
L'Uomo è un animale che tende a fare economia di opera e di pensiero...
Ritornando al tuo problema, indipendentemente dal sensore pH utilizzato e dalla scheda amplificatore, puoi benissimo fare un controllo che apra/chiuda una elettrovalvola in funzione del valore del pH.
Non è un controllo istantaneo (la sonda di solito ci mette 5 secondi per stabilizzarsi), ma non credo sia un problema.
Spiega meglio il tuo progetto per far capire, ad esempio, se il liquido è H2O od altro e la precisione richiesta.
Ringrazio gpb01...sinceramente non mi ricordavo più come postare lo sketch Grazie uwefed intendi un temporizatore che apre e chiude per arrivare al valore impostato PH? ottimo non evevo prensato alla miscelazione!!!
cyberhs il fatto e che le sonde perdono di taratura!sono buone tutte?in mano ho poco per ora vorrei sapere come e cosa e meglio avere per non spendere soldi inutili...
avendo fatto in passato contatori digitali mi stanno domandando un controllo Co2 per il PH....
Prima poi ritorna,anche se pensi di aver abbandonato Arduino ,torna a fare il suo ruolo importante nella vita di tutti i giorni...
Grazie vedo che il lavoro puo incominciare ed e fattibile...... mando link prodotti accetto consigli...
Se intendi lasciare la sonda pH perennemente in immersione ti anticipo alcuni problemini.
Le sonde pH comunemente in commercio devono mettere in contatto elettrolitico l'interno della sonda con il liquido. Di solito ciò si fa un un setto poroso per cui nel vetro vedi un puntino bianco.
Succede però che per osmosi il liquido interno alla sonda si contamina per cui avrai derive nel tempo.
Il tempo dipende fortemente dal liquido in cui fai la misura, nel caso dell'acqua dal suo contenuto salino.
Se vai a vedere il catalogo di produttori di sonde come MettlerToledo e altri vedrai che ci sono diverse sonde anche per usi specifici.
Alcuni produttori hanno proposto la sostituzione del setto poroso con un buchino piccino, altri invece propongono una sonda più grossa con più liquido interno che ci metterà più tempo a contaminarsi.
Inoltre ti serviranno i cosiddetti buffer, cioè dei liquidi che hanno un pH specifico e che lo mantengono per lungo tempo. Ti servirà un buffer pH7 e uno o pH4 o pH10 a seconda del range di misura. Parli di CO2 per cui mi sa che ti serve il pH4.
Ricorda anche che se la sonda non misura anche la temperatura lo devi fare tu con un sensore a parte, in quanto va fatta una correzione per la temperatura.
Markplus:
Ringrazio gpb01...sinceramente non mi ricordavo più come postare lo sketch
Si, ma ... EDITA IL POST E SISTEMALO !!!
Guglielmo