Arduino Uno R3 Akvaryum Ph + Derece
-
hocam merhaba.
Anladığım kadarı ile sistem basamak basamak çalışıyor.
lcd.setCursor(0, 0); bu kodda Cursor'ı 0. satır, 0. haneye koy demiş.
lcd.print("pH Val:"); sonra git o cursondan sonra bunları yaz demiş. Toplamda boşlukta dahil 7 tane sembol var.
lcd.setCursor(8, 0); sonra Cursor'u 8. haneye koymuş
lcd.print(ph_act); sonra ph değerini yazdırmış.
Sende şey yapabilirsin, bilmiyorum çalışır mı denemen lazım hocam (:
lcd.setCursor(0, 1); 0. hane 1. satır.
lcd.print("°C Val:"); Celcius sembolu iste. O yuvarlak calismayabilir. Denemen lazım yine (:
lcd.setCursor(8, 1); Sıradan cursoru kaydırdım işte.
lcd.print(temp); Sıcaklık değişkenin temp diye anladım ama hatalı da olabilirim.
Bu üstteki kodlar işini görür bence
-
Bu ph olayı ile alâkalı benimde bir sorunum var.
Her şeyi doğruca ayarladım ph değerlerini bardaklara 4-7-10 ph sıvılarını koyarak doğru şekilde alıyorum.
Ama aynı sistemi götürüp 1500 litre su bulunan içinde Resistans ve Dagıç Su Pompası olan tanka koyunca değerler sapıtıyor.
1 - Dalgıç Su pompası elektrik kaçırıyor olabilirmi ?
2- Resistans Elektrik Kaçırıyor olabilirmi ?
3- Kullandığım ph probunun ölçebileceği max. su miktarı olabilirmi ?
Dalgıç su pompası ve Resistansa gelen kabloları tamamen elktrikten kesip denedim yinede değerler bozuluyor.
Sebebi ne olabilir.
-
En sonunda halletim, çalışan malzeme resimdeki gibi sadece DS18S20 derece sensörü 4.7 kohm direnç ile anakart 2 ye bağlı, yani ph sensör üzerinde değil, kod ekte akvaryumcu arkadaşlara hayırlı olsun..
#include <Wire.h>
#include <OneWire.h>
#include <LiquidCrystal_I2C.h>int DS18S20_Pin = 2; //DS18S20 Signal pin on digital 2
//Temperature chip i/o
OneWire ds(DS18S20_Pin); // on digital pin 2LiquidCrystal_I2C lcd(0x27, 16, 2);
float calibration_value = 21.34;
int phval = 0;
unsigned long int avgval;
int buffer_arr[10],temp;
void setup()
{
Serial.begin(9600);
lcd.init();
lcd.begin(16, 2);
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print(" Akvaryum ");
lcd.setCursor(0, 1);
lcd.print(" pH + Derece ");
delay(2000);
lcd.clear();
}
void loop() {
for(int i=0;i<10;i++)
{
buffer_arr[i]=analogRead(A0);
delay(30);
}
for(int i=0;i<9;i++)
{
for(int j=i+1;j<10;j++)
{
if(buffer_arr[i]>buffer_arr[j])
{
temp=buffer_arr[i];
buffer_arr[i]=buffer_arr[j];
buffer_arr[j]=temp;
}
}
}
avgval=0;
for(int i=2;i<8;i++)
avgval+=buffer_arr[i];
float volt=(float)avgval*5.0/1024/6;
float ph_act = -5.70 * volt + calibration_value;
lcd.setCursor(0, 0);
lcd.print("pH Val:");
lcd.setCursor(8, 0);
lcd.print(ph_act);
delay(1000);{
float Temp = getTemp();
Serial.println(Temp);
lcd.setCursor(0, 1);
lcd.print("Temp : ");
lcd.print(Temp);
delay(100); //just here to slow down the output so it is easier to read
}
}
float getTemp(){
//returns the temperature from one DS18S20 in DEG Celsiusbyte data[12];
byte addr[8];if ( !ds.search(addr)) {
//no more sensors on chain, reset search
ds.reset_search();
return -1000;
}if ( OneWire::crc8( addr, 7) != addr[7]) {
Serial.println("CRC is not valid!");
return -1000;
}if ( addr[0] != 0x10 && addr[0] != 0x28) {
Serial.print("Device is not recognized");
return -1000;
}ds.reset();
ds.select(addr);
ds.write(0x44,1); // start conversion, with parasite power on at the endbyte present = ds.reset();
ds.select(addr);
ds.write(0xBE); // Read Scratchpad
for (int i = 0; i < 9; i++) { // we need 9 bytes
data[i] = ds.read();
}
ds.reset_search();
byte MSB = data[1];
byte LSB = data[0];float tempRead = ((MSB << 8) | LSB); //using two's compliment
float TempSum = tempRead / 16;
return TempSum;
}