#include <Wire.h>
#include <U8g2lib.h>
U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0, /* clock=*/ A7, /* data=*/ A8, /* reset=*/ U8X8_PIN_NONE);
const unsigned char waterlevel[] PROGMEM = {
0x00, 0xC0, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0xE0, 0x01, 0x00,
0x00, 0x30, 0x03, 0x00, 0x00, 0x38, 0x07, 0x00, 0x00, 0x18, 0x06, 0x00,
0x00, 0x0C, 0x0C, 0x00, 0x00, 0x06, 0x18, 0x00, 0x00, 0x07, 0x38, 0x00,
0x00, 0x03, 0x30, 0x00, 0x80, 0x01, 0x60, 0x00, 0xC0, 0x18, 0xC0, 0x00,
0xC0, 0x3C, 0xC0, 0x00, 0x60, 0x66, 0x88, 0x01, 0x60, 0x66, 0x9C, 0x01,
0x30, 0x7C, 0x0E, 0x03, 0x30, 0x38, 0x07, 0x03, 0x30, 0x80, 0x03, 0x03,
0x30, 0xC0, 0x01, 0x03, 0x30, 0xE0, 0x00, 0x03, 0x30, 0x70, 0x00, 0x03,
0x30, 0x38, 0x0F, 0x03, 0x30, 0x9C, 0x0F, 0x03, 0x60, 0x8E, 0x99, 0x01,
0xE0, 0x80, 0xCF, 0x01, 0xC0, 0x00, 0xCF, 0x00, 0x80, 0x03, 0x70, 0x00,
0x00, 0x0F, 0x38, 0x00, 0x00, 0xFE, 0x1F, 0x00, 0x00, 0xF0, 0x03, 0x00,
};
const unsigned char turbidity[] PROGMEM = {
0x00, 0x02, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x80, 0x0D, 0x00, 0x00,
0xC0, 0x18, 0x00, 0x00, 0x40, 0x30, 0x00, 0x00, 0x20, 0x20, 0x00, 0x00,
0x30, 0x60, 0x00, 0x00, 0x10, 0x40, 0x00, 0x00, 0x18, 0xC0, 0x00, 0x00,
0x08, 0x80, 0x80, 0x00, 0x04, 0x80, 0xC1, 0x01, 0x0C, 0x00, 0x61, 0x03,
0x1C, 0x00, 0x31, 0x06, 0x14, 0x00, 0x11, 0x04, 0x14, 0x00, 0x19, 0x0C,
0x1C, 0x80, 0x09, 0x08, 0x2C, 0x80, 0x09, 0x0A, 0x68, 0x80, 0x08, 0x0A,
0xD8, 0xC1, 0x08, 0x0B, 0x70, 0x78, 0xD8, 0x0D, 0xC0, 0x3F, 0x31, 0x06,
0x00, 0x80, 0xE3, 0x03, 0x00, 0xC0, 0x06, 0x00, 0x00, 0x40, 0x0C, 0x00,
0x00, 0x60, 0x0C, 0x00, 0x00, 0x20, 0x08, 0x00, 0x00, 0xA0, 0x08, 0x00,
0x00, 0xE0, 0x0D, 0x00, 0x00, 0x60, 0x0C, 0x00, 0x00, 0xC0, 0x07, 0x00,
};
const unsigned char tds[] PROGMEM = {
0x00, 0xE0, 0x01, 0x00, 0x00, 0xF0, 0x03, 0x00, 0x00, 0x36, 0x1B, 0x00,
0x00, 0x3F, 0x3F, 0x00, 0x80, 0x09, 0x64, 0x00, 0xC0, 0x00, 0xC0, 0x00,
0x80, 0xE1, 0x61, 0x00, 0x80, 0xF1, 0x63, 0x00, 0xE0, 0x18, 0xC6, 0x01,
0x60, 0x08, 0x84, 0x01, 0x20, 0x0C, 0x0C, 0x01, 0x60, 0x0C, 0x8C, 0x01,
0xE0, 0x18, 0xC6, 0x01, 0xC0, 0xF9, 0xE7, 0x00, 0x80, 0xF1, 0x63, 0x00,
0xC0, 0x01, 0xE0, 0x00, 0x80, 0x01, 0x60, 0x00, 0x80, 0x1F, 0x7E, 0x00,
0x00, 0x3F, 0x3F, 0x00, 0x00, 0xF0, 0x03, 0x00, 0x00, 0xE0, 0x01, 0x00,
0x02, 0x06, 0x18, 0x10, 0x8F, 0x3F, 0x7F, 0x3C, 0xFC, 0xF1, 0xE3, 0x0F,
0x20, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x8F, 0x3F, 0x7F, 0x3C, 0xFC, 0xF1, 0xE3, 0x0F, 0x20, 0xC0, 0x00, 0x01,
};
#define SERIAL Serial
#define TDSPin A0
#define turPin A1
#define BUTTON 2
unsigned char low_data[8] = {0};
unsigned char high_data[12] = {0};
int level;
#define NO_TOUCH 0xFE
#define THRESHOLD 100
#define ATTINY1_HIGH_ADDR 0x78
#define ATTINY2_LOW_ADDR 0x77
void getHigh12SectionValue(void)
{
memset(high_data, 0, sizeof(high_data));
Wire.requestFrom(ATTINY1_HIGH_ADDR, 12);
while (12 != Wire.available());
for (int i = 0; i < 12; i++) {
high_data[i] = Wire.read();
}
delay(10);
}
void getLow8SectionValue(void)
{
memset(low_data, 0, sizeof(low_data));
Wire.requestFrom(ATTINY2_LOW_ADDR, 8);
while (8 != Wire.available());
for (int i = 0; i < 8 ; i++) {
low_data[i] = Wire.read(); // receive a byte as character
}
delay(10);
}
int check()
{
int sensorvalue_min = 250;
int sensorvalue_max = 255;
int low_count = 0;
int high_count = 0;
while (1)
{
uint32_t touch_val = 0;
uint8_t trig_section = 0;
low_count = 0;
high_count = 0;
getLow8SectionValue();
getHigh12SectionValue();
for (int i = 0; i < 8; i++)
{
if (low_data[i] >= sensorvalue_min && low_data[i] <= sensorvalue_max)
{
low_count++;
}
if (low_count == 8)
{
}
}
for (int i = 0; i < 12; i++)
{
if (high_data[i] >= sensorvalue_min && high_data[i] <= sensorvalue_max)
{
high_count++;
}
if (high_count == 12)
{
}
}
for (int i = 0 ; i < 8; i++) {
if (low_data[i] > THRESHOLD) {
touch_val |= 1 << i;
}
}
for (int i = 0 ; i < 12; i++) {
if (high_data[i] > THRESHOLD) {
touch_val |= (uint32_t)1 << (8 + i);
}
}
while (touch_val & 0x01)
{
trig_section++;
touch_val >>= 1;
}
level = trig_section *5; //water level
return level;
}
}
int tdsRaw = 0;
float tdsValue = 0;
float Voltage_tds = 0;
int turbidityRaw = 0;
float Voltage_tur = 0;
bool flag = false;
void count() {
flag = true;
}
void setup(){
SERIAL.begin(115200);
Wire.begin();
u8g2.begin();
pinMode(TDSPin, INPUT);
pinMode(turPin, INPUT);
pinMode(BUTTON, INPUT);
attachInterrupt(digitalPinToInterrupt(BUTTON), count, FALLING);
}
uint8_t cnt = 1;
void loop(){
tdsRaw = analogRead(TDSPin);
Voltage_tds = tdsRaw*5/1024.0; //Convert analog reading to Voltage
tdsValue=(133.42*Voltage_tds*Voltage_tds*Voltage_tds - 255.86*Voltage_tds*Voltage_tds + 857.39*Voltage_tds)*0.5; //Convert voltage value to TDS value
// Serial.print("TDS Value = ");
// SERIAL.print(tdsValue);
// Serial.println(" ppm");
turbidityRaw = analogRead(turPin);
Voltage_tur = turbidityRaw * (5.0 / 1024.0);
// Serial.print("Turbidity Value = ");
SERIAL.println(Voltage_tur);
check();
// SERIAL.println(level);
if (flag) {
cnt++;
flag = false;
if (cnt==4) {
cnt = 1;
}
}
// Serial.println(cnt);
select_mode(cnt);
delay(2000);
}
void select_mode(int n)
{
switch (n)
{
case 1:
u8g2.firstPage();
do {
u8g2.setFont(u8g2_font_t0_16b_mr);
u8g2.drawXBMP(49, 16, 30, 30, tds);
u8g2.setCursor(40, 60);
u8g2.print(tdsValue); // write something to the internal memory
u8g2.print("ppm");
} while (u8g2.nextPage());
break;
case 2:
u8g2.firstPage();
do {
u8g2.setFont(u8g2_font_t0_16b_mr);
u8g2.drawXBMP(49, 16, 30, 30, turbidity);
u8g2.setCursor(45, 60);
u8g2.print(Voltage_tur); // write something to the internal memory
u8g2.print("V");
} while (u8g2.nextPage());
break;
case 3:
u8g2.firstPage();
do {
u8g2.setFont(u8g2_font_t0_16b_mr);
u8g2.drawCircle(8, 55, 8, U8G2_DRAW_ALL);
if (level >= 5 && level < 25) {
u8g2.drawDisc(8, 55, 8, U8G2_DRAW_UPPER_LEFT);
}
if (level >= 25 & level < 50) {
u8g2.drawDisc(8, 55, 8, U8G2_DRAW_UPPER_RIGHT | U8G2_DRAW_UPPER_LEFT);
}
if (level >= 50 && level < 75) {
u8g2.drawDisc(8, 55, 8, U8G2_DRAW_LOWER_LEFT | U8G2_DRAW_UPPER_RIGHT | U8G2_DRAW_UPPER_LEFT);
}
if (level >= 75) {
u8g2.drawDisc(8, 55, 8, U8G2_DRAW_ALL);
}
u8g2.drawXBMP(49, 16, 30, 30, waterlevel);
u8g2.setCursor(56, 60);
u8g2.print(level); // write something to the internal memory
u8g2.print("%");
} while (u8g2.nextPage());
break;
}
}
Comments