#define button 2
#define trig 4
#define echo 5
void calc_distance();
//Global variables
double distance, tempdist;
float temp;
int lastScreen_state;
volatile int screen_state = 0;
volatile int seccounter = 0;
//DHT sensor setup code
#include <Adafruit_Sensor.h>
#include <DHT.h>
#define DHTPIN 6
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
//OLED Screen setup code
#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
// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
#define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
void setup() {
//serialbegin setup
Serial.begin(115200);
//screen setup
// SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
for(;;); // Don't proceed, loop forever
}
//DHT sensor setup
dht.begin();
//pin setup
pinMode(echo, INPUT);
pinMode(trig, OUTPUT);
pinMode(button, INPUT);
//interrupt setup
attachInterrupt(digitalPinToInterrupt(button), ISR_Func, FALLING);
//timer1 1 second
cli();
TCCR1A = 0;// set entire TCCR1A register to 0
TCCR1B = 0;// same for TCCR1B
TCNT1 = 0;//initialize counter value to 0
// set compare match register for 1hz increments
OCR1A = 15624;// = (16*10^6) / (1*1024) - 1 (must be <65536)
// turn on CTC mode
TCCR1B |= (1 << WGM12);
// Set CS10 and CS12 bits for 1024 prescaler
TCCR1B |= (1 << CS12) | (1 << CS10);
// enable timer compare interrupt
TIMSK1 |= (1 << OCIE1A);
sei();
delay(2000);
}
void loop() {
switch(screen_state){
//main welcome/standby screen
case 0:
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor(24, 12);
display.println("WELCOME");
//Animation
display.setTextSize(1);
for(int j = 0; j < 15;j++){
for(int i = 0; i< 60;i++){
if(screen_state != 0){
break;
}
display.setCursor(10+i, 32+2*j);
display.print("**");
delayMicroseconds(50000);
display.display();
}
}
break;
//Waterlevel Display
case 1:
calc_distance();
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor(8, 8);
display.println("WaterLevel");
display.setTextSize(3);
display.setCursor(24, 32);
display.print("%");
display.print(int((400-distance)/4));
display.display();
break;
//Weather Display
case 2:
temp = dht.readTemperature();
if (isnan(temp)) {
display.clearDisplay();
display.setTextSize(2);
display.setCursor(8, 32);
display.println("FailedTemp");
display.display();
}
else{
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor(24, 8);
display.println("Temp");
display.setTextSize(3);
display.setCursor(8, 32);
display.print(temp);
display.print("C");
display.display();
}
break;
default:
screen_state = 0;
break;
}
//Sleep
lastScreen_state = screen_state;
if(seccounter > 20){screen_state = 0;}
}
void ISR_Func(){
//Interrupt service routine
if(screen_state==2){screen_state = 1;}
else{
screen_state++;
}
detachInterrupt(digitalPinToInterrupt(button));
}
ISR(TIMER1_COMPA_vect){ //change the 0 to 1 for timer1 and 2 for timer2
//interrupt commands here
attachInterrupt(digitalPinToInterrupt(button), ISR_Func, FALLING);
//Sleep routine
if(lastScreen_state == screen_state){seccounter++;}
else{
seccounter = 0;
}
}
void calc_distance(){
delayMicroseconds(2);
digitalWrite(4,HIGH);
delayMicroseconds(10);
digitalWrite(4,LOW);
tempdist = pulseIn(5,HIGH)/29.1/2;
if((tempdist)>400){
distance = 400;
}
else{
distance = tempdist;
}
delay(10);
}