#include <Arduino.h>
#include <Wire.h>
#include <U8g2lib.h>
// #include "dht.h"
// #include "rtc.h"
#include "bitmaps.h"
#define SOIL_PIN A0
#define RELAY_PIN 7
#define DHT_PIN 6
#define SOIL_MAX 905
#define SOIL_MIN 420
#define PUMP RELAY_PIN
// initialization for the 128x64px OLED display
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);
void setup() {
Serial.begin(9600);
Wire.begin();
u8g2.begin();
// startRTC();
pinMode(RELAY_PIN, OUTPUT);
}
void loop() {
int16_t soilMoisture = analogRead(SOIL_PIN);
int8_t moisturePercentage = map(soilMoisture, SOIL_MAX, SOIL_MIN, 0, 100);
u8g2.clearBuffer();
watering(moisturePercentage);
drawFlower(moisturePercentage);
drawMoisture(moisturePercentage);
drawThermometer();
u8g2.sendBuffer();
}
void watering(int8_t moisturePercentage) {
if (moisturePercentage > 75) digitalWrite(PUMP, LOW);
else if (moisturePercentage < 20) digitalWrite(PUMP, HIGH);
}
void drawFlower(int8_t moisturePercentage) {
u8g2.drawXBMP(16, 0, 32, 64, bitmaps_flowers[constrain(map(moisturePercentage, 0, 100, 0, 10), 0, 10)]);
}
void drawThermometer() {
u8g2.drawXBMP(64, 0, 16, 32, epd_bitmap_thermometer);
// char buffer[64];
// itoa(dht.readTemperature(), buffer, 10);
// u8g2.drawStr(80, 16, buffer);
char buffer[10];
int8_t temp = -15;
int8_t str_width;
sprintf(buffer, "%d", temp);
str_width = u8g2.getStrWidth(buffer);
u8g2.setFont(u8g2_font_9x6LED_tf);
u8g2.drawStr(80, 16, buffer);
u8g2.drawStr(80 + str_width, 16, " C");
}
void drawMoisture(int8_t moisturePercentage) {
char buffer[10];
int8_t str_width;
u8g2.setFont(u8g2_font_7x14_tf);
itoa(constrain(moisturePercentage, 0, 100), buffer, 10);
str_width = u8g2.getStrWidth(buffer);
u8g2.drawStr(32 - str_width/2, 12, buffer);
}
// void drawTime() {
// if (!rtc.isrunning()) {
// u8g2.setFont(u8g_font_6x10);
// u8g2.setCursor(60, 50);
// u8g2.print("The RTC is");
// u8g2.setCursor(60, 60);
// u8g2.print("NOT running");
// }
// }