Per la questione del ph penso sia veramente rognosa, soprattutto per il settaggio e la tara dello strumento, infatti vedo strumenti da qualche migliaio di euro che ogni tot misurazioni bisogna ritararli con il liquido apposito...
Io intanto mi rendo utile e vi faccio vedere cosa ho fatto fino ad ora...
La base del mio progetto consiste come detto prima in una scheda da 4 relay, RTC DS1307, e sonda di temperatura.
collegati cosi alla scheda arduino
relay 1 --> filtro --> pin 4
relay 2 --> luce 1 --> pin5
relay 3 --> luce 2 --> pin6
relay 4 --> riscaldatore --> pin7
RTC
SDA -->pin A4
SCL --> pin A5
SONDA TEMP
lm335 --> pin A0
Qui il codice (Compilato ma non ancora testato)
#include "Wire.h"
#define DS1307_ADDRESS 0x68
const int ora_accensione = 9 ;
const int min_accensione = 30 ;
const int ora_spegni = 17 ;
const int min_spegni = 20 ;
const int Temp_Giusta = 27 ;
const float Margine_temp = 1.5 ;
const int filtro = 4 ;
const int luce_1 = 5 ;
const int luce_2 = 6 ;
const int risca = 7 ;
void setup() {
Wire.begin();
Serial.begin(9600);
pinMode(filtro, OUTPUT);
pinMode(luce_1, OUTPUT);
pinMode(luce_2, OUTPUT);
pinMode(risca, OUTPUT);
}
void loop() {
int Stato_luci;
int Stato_temp;
Stato_luci = ContLuci();
Stato_temp = ContTemp();
Stampa(Stato_luci,Stato_temp);
delay(5000);
}
int ContTemp()
{
double margine_up = (Temp_Giusta + Margine_temp);
double margine_down = (Temp_Giusta - Margine_temp);
double temp = Temperatura();
int stato;
if (digitalRead(risca)==LOW) {
stato=0;
}
if (digitalRead(risca)==HIGH) {
stato=1;
}
if(stato==0 && temp<=margine_down) {
Relay(risca,1);
return 1;
}
if(stato==1 && temp>=margine_up) {
Relay(risca,0);
return 0;
}
return (stato);
}
int ContLuci(){
int ore=Ora(1);
int minuti=Ora(0);
if (ora_accensione==ore && min_accensione<=minuti){
Relay(luce_1,1);
Relay(luce_2,1);
return(1);
}
else {
if (ora_spegni==ore && min_spegni>=minuti){
Relay(luce_1,1);
Relay(luce_2,1);
return(1);
}
else {
if (ora_accensione<=ore && ora_spegni>=ore) {
Relay(luce_1,1);
Relay(luce_2,1);
return(1);
}
}
}
Relay(luce_1,0);
Relay(luce_2,0);
return (0);
}
void Stampa(int Luci, int Risc){
int ore = Ora(1);
int minuti = Ora(0);
double Temp = Temperatura();
Serial.print("Temperatura: ");
Serial.println(Temp,DEC);
Serial.print("°C ");
Serial.print(ore);
Serial.print(":");
Serial.print(minuti);
Serial.print("\n");
if (Luci==0) Serial.print("Luci : OFF ");
else Serial.print("Luci : ON ");
if (Risc==0) Serial.print(" Riscalda : OFF ");
else Serial.print(" Riscalda : ON ");
Serial.print("\n");
return ;
}
double Temperatura(){
double sensorValue = analogRead(A0);
double tempKelvin = sensorValue*500/1023.0;
double tempCelsius = tempKelvin-273.0;
return tempCelsius;
}
int Relay(int pin,int val){
if (val==1){
digitalWrite(pin,HIGH);
return(1);
}
else {
if(val==0){
digitalWrite(pin,LOW);
return(0);
}
}
return 0;
}
byte bcdToDec(byte val) {
// Convert binary coded decimal to normal decimal numbers
return ( (val/16*10) + (val%16) );
}
int Ora(int p){
// Reset the register pointer
Wire.beginTransmission(DS1307_ADDRESS);
byte zero = 0x00;
Wire.write(zero);
Wire.endTransmission();
Wire.requestFrom(DS1307_ADDRESS, 7);
bcdToDec(Wire.read());
int minuti = bcdToDec(Wire.read());
int ore = bcdToDec(Wire.read() & 0b111111); //24 hour time
if (p==1) return ore;
else {
return minuti;
}
}
Funzioni Implementate:
accensione/spegnimento ad una certa ora/minuti
Controllo della temperatura dell'acqua con relativa accensione/spegnimento del riscaldatore
Stampaggio a seriale di tutti i dati e info stato luci e riscaldatore
Funzioni da Implementare nel breve periodo
Librerie <time.h> e <DS1307RTC.h>
aggiunta pulsanti controllo manuale
aggiunta display informazioni
il progetto è in stato embrionale ma penso che sia una buona base da cui partire per un progetto più grosso.