This is the program that collects and displays pH, temperature, and dissolved oxygen values.:
//Ph, DO, Temperature to OLED from Arduino - Lehansa M
#include <Arduino.h>
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
#define DO_PIN A1
//ADDED DEFINE SENSOR PIN A0 FOR PH STARTS HERE-LEHANSA
#define SensorPin A0 // the pH meter Analog output is connected with the Arduino’s Analog
unsigned long int avgValue; //Store the average value of the sensor feedback
float b;
int buf[10],temp;
//ADDED DEFINE SENSOR PIN A0 FOR PH ENDS HERE-LEHANSA
#define VREF 5000 //VREF (mv)
#define ADC_RES 1024 //ADC Resolution
//Single-point calibration Mode=0
//Two-point calibration Mode=1
#define TWO_POINT_CALIBRATION 0
#define READ_TEMP (25) //Current water temperature ℃, Or temperature sensor function
//Single point calibration needs to be filled CAL1_V and CAL1_T
#define CAL1_V (131) //mv
#define CAL1_T (25) //℃
//Two-point calibration needs to be filled CAL2_V and CAL2_T
//CAL1 High temperature point, CAL2 Low temperature point
#define CAL2_V (1300) //mv
#define CAL2_T (15) //℃
const uint16_t DO_Table[41] = {
14460, 14220, 13820, 13440, 13090, 12740, 12420, 12110, 11810, 11530,
11260, 11010, 10770, 10530, 10300, 10080, 9860, 9660, 9460, 9270,
9080, 8900, 8730, 8570, 8410, 8250, 8110, 7960, 7820, 7690,
7560, 7430, 7300, 7180, 7070, 6950, 6840, 6730, 6630, 6530, 6410
};
uint8_t temperature;
uint16_t ADC_Raw;
uint16_t ADC_Voltage;
uint16_t DO;
int16_t readDO(uint32_t voltage_mv, uint8_t temperature_c)
{
#if TWO_POINT_CALIBRATION == 00
uint16_t V_saturation = (uint32_t)CAL1_V + (uint32_t)35 * temperature_c - (uint32_t)CAL1_T * 35;
return (voltage_mv * DO_Table[temperature_c] / V_saturation);
#else
uint16_t V_saturation = (int16_t)((int8_t)temperature_c - CAL2_T) * ((uint16_t)CAL1_V - CAL2_V) / ((uint8_t)CAL1_T - CAL2_T) + CAL2_V;
return (voltage_mv * DO_Table[temperature_c] / V_saturation);
#endif
}
void setup()
{
Serial.begin(115200);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); //initialize with the I2C addr 0x3C (128x64)
display.clearDisplay();
delay(10);
pinMode(13,OUTPUT);
Serial.begin(9600);
//Serial.println("Ready"); //Test the serial monitor
}
void loop()
{
temperature = (uint8_t)READ_TEMP;
ADC_Raw = analogRead(DO_PIN);
ADC_Voltage = uint32_t(VREF) * ADC_Raw / ADC_RES;
for(int i=0;i<10;i++) //Get 10 sample value from the sensor for smooth the value
{
buf[i]=analogRead(SensorPin);
delay(10);
}
for(int i=0;i<9;i++) //sort the analog from small to large
{
for(int j=i+1;j<10;j++)
{
if(buf[i]>buf[j])
{
temp=buf[i];
buf[i]=buf[j];
buf[j]=temp;
}
}
}
avgValue=0;
for(int i=2;i<8;i++) //take the average value of 6 center sample
avgValue+=buf[i];
float phValue=(float)avgValue5.0/1024/6; //convert the analog into millivolt
phValue=3.5phValue; //convert the millivolt into pH value
Serial.print("PH:\t" + String(phValue) + "\t" );
Serial.print("temperature:\t" + String(temperature) + "\t");
//Serial.print("ADC RAW:\t" + String(ADC_Raw) + "\t");
//Serial.print("ADC Voltage:\t" + String(ADC_Voltage) + "\t");
Serial.println("DO:\t" + String(readDO(ADC_Voltage, temperature)) + "\t");
display.clearDisplay();
display.setCursor(10, 0); //oled display
display.setTextSize(1);
display.setTextColor(WHITE);
display.print("Dissolved Oxygen");
display.setCursor(30, 20); //oled display
display.setTextSize(2);
display.setTextColor(WHITE);
display.print((readDO(ADC_Voltage, temperature))/1000);
display.setTextSize(1);
display.print(" mg/L");
display.display();
delay(1000);
//TEMPERATURE STARTS HERE-LEHANSA
display.clearDisplay();
display.setCursor(10, 0); //oled display
display.setTextSize(1);
display.setTextColor(WHITE);
display.print("Temperature");
display.setCursor(30, 20); //oled display
display.setTextSize(2);
display.setTextColor(WHITE);
display.print(temperature);
display.setTextSize(1);
display.print("degrees C");
display.display();
delay(2000);
//TEMPERATURE ENDS HERE-LEHANSA
//PH DISPLAY STARTS HERE-LEHANSA
display.clearDisplay();
display.setCursor(10, 0); //oled display
display.setTextSize(1);
display.setTextColor(WHITE);
display.print("PH Value");
display.setCursor(30, 20); //oled display
display.setTextSize(2);
display.setTextColor(WHITE);
display.print(phValue);
display.setTextSize(1);
display.display();
delay(3000);
//PH DISPLAY ENDS HERE-LEHANSA
}