//Data Logger
#include <iostream>
String Url = "place thinkspeak api token url"; //place your own thinkspeak channel
//example : String URL ="http://api.thingspeak.com/update?api_key=LG44GXA088QY9060&field2=";
//Wifi Section
#include <WiFi.h>
//Liquid Crystral Setting
#include <LiquidCrystal_I2C.h>
#include <Wire.h> //For LCD SDA & SCL Wiring
LiquidCrystal_I2C LCD = LiquidCrystal_I2C(0x27, 16, 2);
//NTP Local Time
#define NTP_SERVER "pool.ntp.org"
#define UTC_OFFSET 28800 // Malaysia GMT+8 so 8x60x60
#define UTC_OFFSET_DST 0 //Malaysia no offset
//dht22
#include <DHT.h>
#define DHT_pin 23 //connected on port D23
#define DHT_Type DHT22 //use DHT22
DHT dht(DHT_pin, DHT_Type);
//Potential meter will be replaced with pH sensor(pH_pin = 34)
float calibration_value = 20.24 - 0.7; //32.34 - 0.7
int phval = 0;
unsigned long int avgval;
float ph_act;
int buffer_arr[10],temp;
//LCD
void spinner() {
static int8_t counter = 0;
const char* glyphs = "\xa1\xa5\xdb";
LCD.setCursor(15, 1);
LCD.print(glyphs[counter++]);
if (counter == strlen(glyphs)) {
counter = 0;
}
}
void printLocalTime() {
struct tm timeinfo;
if (!getLocalTime(&timeinfo)) {
LCD.setCursor(0, 1);
LCD.println("Connection Err");
delay(2000); //2 second
LCD.clear();
return;
}
LCD.setCursor(0, 0);
LCD.println(&timeinfo, "Date: %H:%M:%S"); //appear date
LCD.setCursor(0, 1);
LCD.println(&timeinfo, "Time: %d/%m/%Y");//appear jam
delay(2000); //2 second
LCD.clear();
}
void setup() {
Serial.begin(115200);
LCD.init();
LCD.backlight();
LCD.setCursor(0, 0);
LCD.print("Connecting to ");
LCD.setCursor(0, 1);
LCD.print("WiFi ");
delay(2000); //2 second
LCD.clear();
WiFi.begin("Wokwi-GUEST", "", 6);
while (WiFi.status() != WL_CONNECTED) {
delay(250);
spinner();
}
Serial.println("");
Serial.println("WiFi connected");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
LCD.setCursor(0, 0);
LCD.print("WiFi connected ");
LCD.setCursor(0, 1);
LCD.print(WiFi.localIP());
delay(2000); //2 second
LCD.clear();
LCD.setCursor(0, 0);
LCD.println("Online");
LCD.setCursor(0, 1);
LCD.println("Updating time...");
delay(2000); //2 second
LCD.clear();
configTime(UTC_OFFSET, UTC_OFFSET_DST, NTP_SERVER);
//DHT Section
Serial.println(F("DHT22 test!"));
dht.begin();
LCD.setCursor(0, 0);
LCD.println("DHT22 Test");
LCD.setCursor(0, 1);
LCD.println("Status : Ok!");
delay (5000);
LCD.clear();
}
void loop() {
//Blynk.run();
printLocalTime();
delay(250);
//dht sensor reading section
float h = dht.readHumidity();// Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
float t = dht.readTemperature();// Read temperature as Celsius (the default)
float f = dht.readTemperature(true);// Read temperature as Fahrenheit (isFahrenheit = true)
// Check if any reads failed and exit early (to try again).
if (isnan(h) || isnan(t) || isnan(f)) {
Serial.println(F("Failed to read from DHT sensor!"));
LCD.setCursor(0, 0);
LCD.println("DHT22 Test");
LCD.setCursor(0, 1);
LCD.println("Status : Error!");
delay (5000);
LCD.clear();
return;
}
float hif = dht.computeHeatIndex(f, h);// Compute heat index in Fahrenheit (the default)
float hic = dht.computeHeatIndex(t, h, false);// Compute heat index in Celsius (isFahreheit = false)
Serial.print(F("Humidity: "));
Serial.print(h);
Serial.print(F("% | Temperature: "));
Serial.print(t);
Serial.print(F("°C "));
Serial.print(F(" | Heat index: "));
Serial.print(hif);
Serial.println(F("°F"));
LCD.setCursor(8, 0);
LCD.println("Humidity");
LCD.setCursor(9, 1);
LCD.println(h);
LCD.setCursor(15, 1);
LCD.println("%");
delay(2000);
LCD.clear();
LCD.setCursor(5, 0);
LCD.println("Temperature");
LCD.setCursor(9, 1);
LCD.println(t);
LCD.setCursor(15, 1);
LCD.println("C");
delay(2000);
LCD.clear();
LCD.setCursor(6, 0);
LCD.println("Heat Index");
LCD.setCursor(9, 1);
LCD.println(f);
LCD.setCursor(15, 1);
LCD.println("F");
delay(2000);
LCD.clear();
//pH Sensor section
for(int i=0;i<10;i++)
{
{
buffer_arr[i]=analogRead(35);
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*3.3/4096.0/6;
//Serial.print("Voltage: ");
//Serial.println(volt);
ph_act = -5.70 * volt + calibration_value;
Serial.print(F("pH Val : "));
Serial.println(ph_act);
Serial.println("\n");
//Blynk.virtualWrite(V2,ph_act);
LCD.setCursor(8, 0);
LCD.println("pH Index");
LCD.setCursor(9, 1);
LCD.println(ph_act);
LCD.setCursor(14, 1);
LCD.println("pH");
delay(2000);
LCD.clear();
break;
}
}