Sziasztok!
Már egy ideje kisebb-nagyobb megszakításokkal dolgozom a vezérlőmön. A közelmúltban találkoztam a NEXTION kijelzővel és ez lényeges változást hozott az eddig dédelgetett menüvezérelt projektembe. A cél karácsony, így addigra akarok előállni (és beüzemelni) az 1.0 verzióval (Arduino Mega 2560 + 7' Nextion + pH + hőmérők + teljes kontrol a világítás, co2, fűtés, hűtés, UV.... stb. felett - minden fontos paraméter kivülről állítható auto és manual üzemben).
Természetesen közzéteszem a teljes anyagot, mivel innen indult az álom... Addig ha érdekelnek a dizájnos és egyszerűen programozható kijelzők, keress rá a NEXTON HMI-re és építs....
Addig is egy friss tapasztalat. Beszereztem az akciós oldalról egy "Liquid PH0-14 Value Sensor Module + BNC PH Electrode Probe for Arduino" pH szenzort, és elég sokat szívtam a beüzemeléssel. Mivel a net tele van rossz és pontatlan, használhatatlan példákkal, megosztom veletek az általam jónak és pontosnak vélt kódot. Több forrásból dolgoztam, így ebben a formában többé-kevésbe új a kód (a képletet loptam
). A pH 4.01-es etalon folyadékkal 25C-on +-2 százados pontosságot sikerült kihozni belőle. Ha módosító javaslatotok van, ne habozzatok az írással...
Természetesen a teljes programban nem delay-el van időzítve a tényleges mérés, és csak percenként 1 mérésciklus lefutás van jelenleg.
Kód beillesztése:
#define pHSensorPin 7
float pH_ertek;
void setup()
{
Serial.begin(9600);
}
void loop()
{
Serial.println(" * PH meres indul... *");
unsigned long int pHkozep;
analogWrite(pHSensorPin, HIGH);
int buf[10]; //buffer feltöltése
for(int i=0;i<10;i++) // 10 mérés átlagolása
{buf[i]=0;
buf[i]=analogRead(pHSensorPin);
delay(10);
}
for(int i=0;i<9;i++)
{byte j=0;
for(int j=i+1;j<10;j++)
{if(buf[i]>buf[j])
{int temp=buf[i];
buf[i]=buf[j];
buf[j]=temp;
}
}
}
pHkozep = 0; //min és max értékek elhagyása
for(int i=2;i<8;i++) //6 középső érték kiválasztása
pHkozep+=buf[i];
float pHsensor_atlag = pHkozep/6;
pH_ertek = mapfloat(pHsensor_atlag, 765, 665, 4.01, 7.01); // Map the '0 to 1023' result to '0 to 14'.
analogWrite(pHSensorPin, LOW);
Serial.print(" PH ertek: "), Serial.println(pH_ertek);
Serial.println(" * PH meres vege! *");
delay(1000);
}
float mapfloat(long x, long in_min, long in_max, long out_min, long out_max){
return (float)(x - in_min) * (out_max - out_min) / (float)(in_max - in_min) + out_min;
}