Buongiorno a tutti e grazie a coloro disposti ad aiutarmi.
Sono alle prese con un progetto di un impianto idroponico che monitora e corregge il ph della soluzione al suo interno, e sto riscontrando problemi con la stampa dei valori di ph su schermo Oled.
in sostanza lo sketch mostra il ph ma solo sul serial monitor, dove i valori tra una misurazione e l'altra variano solo di pochi numeri nella parte decimale, mentre i valori mostrati sul' Oled variano anche di 5 numeri nella parte intera (ad esmpio, viene mostrato 4,70 come valore ph, ma nella misurazione seguente può anche raddoppiare, nonostante la soluzione in cui è immersa la sonda sia la stessa).
Specifico che lo schermo Oled è alimentato direttamente dall' alimentatore 5v che alimenta arduino, e non è quindi arduino direttamente ad alimentarlo. Inizialmente pure il modulo PH 4502C (a cui è collegata la sonda) era alimentato direttamente dall'alimentatore, ma venivano mostrati valori diversi anche sul monitor seriale, spostando invece i 2 cavi di alimentazione del modulo direttamente sui 5v e GND di arduino i valori sul seriale si stabilizzavano, il problema potrebbe quindi essere l'alimentazione?
La misurazione avviene con sonda collegata al modulo PH 4502C, lo schermo OLed usa la comunicazione I2C. Superata una certa soglia di ph, scatta un Relè a cui è collegata una pompa peristaltica che versa una soluzione acida nel serbatoio per corregere il ph.
Ecco lo sketch :
#include <Adafruit_SSD1306.h>
#define RelePh 3
#define ReleLivello 6
#define PhPin A1
#define PinLivello A3
#define Offset -5.22
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
unsigned long int valoreMedio;
int livello = analogRead(PinLivello);
Adafruit_SSD1306 display (SCREEN_WIDTH, SCREEN_HEIGHT);
void setup() {
Serial.begin(9600);
pinMode(RelePh, OUTPUT);
digitalWrite(RelePh, HIGH);
pinMode(ReleLivello, OUTPUT);
digitalWrite(ReleLivello, HIGH);
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
for(;;);
}
display.setTextColor( WHITE);
display.setTextSize(2);
display.setCursor(9, 28);
display.clearDisplay();
display.display();
display.println("BENVENUTO");
display.display();
delay(3000);
display.clearDisplay();
display.setTextSize(1);
}
void loop() {
ph();
livelloSerbatoio();
delay(2000);
display.clearDisplay();
}
void ph() {
int buf[10];
for(int i=0;i<10;i++)
{
buf[i]=analogRead(PhPin);
delay(10);
}
for(int i=0;i<9;i++)
for(int j=i+1;j<10;j++)
if(buf[i]>buf[j])
{
int temp=buf[i];
buf[i]=buf[j];
buf[j]=temp;
}
valoreMedio=0;
for(int i=2;i<8;i++)
valoreMedio+=buf[i];
float phValue=(float)valoreMedio*5.0/1024/6;
phValue=14-(3.5*phValue+Offset);
display.setCursor(0, 7);
display.print("PH :");
display.print(phValue, 2);
display.display();
Serial.print("PH:");
Serial.print(phValue, 2);
Serial.println(" ");
delay(600);
if (phValue > 6,50) {
digitalWrite(RelePh, LOW);
}
else {
digitalWrite(RelePh, HIGH);
}
}
void livelloSerbatoio() {
display.setCursor(0, 53);
display.print("Livello Serbatoio :");
display.print(livello);
display.display();
Serial.println("Livello Serbatoio :");
Serial.print(livello);
Serial.println(" ");
delay(600);
if (livello < 1500) {
digitalWrite(ReleLivello, LOW);
}
else if (livello > 2000) {
digitalWrite(RelePh, HIGH);
digitalWrite(ReleLivello, HIGH);
}
else {
digitalWrite(ReleLivello, HIGH);
}
}
Grazie ancora........