// Tiny4kOLED documentation:
// https://github.com/datacute/Tiny4kOLED/tree/master?tab=readme-ov-file
// DHT22 documentation:
// https://github.com/RobTillaart/DHTlib
#include <avr/sleep.h>
#include <avr/interrupt.h>
#include <TinyWireM.h>
#include <Tiny4kOLED.h>
#include "DHT20.h"
DHT20 DHT;
int previous_status = -1;
void setup() {
oled.begin(128, 64, sizeof(tiny4koled_init_128x64br), tiny4koled_init_128x64br);
oled.setRotation(1);
oled.setFont(FONT8X16);
oled.clear();
oled.on();
}
void sleep() {
// The POWER DOWN sleep mode does not seems to be simulated on Wokwi…
GIMSK |= _BV(PCIE); // Enable Pin Change Interrupts
PCMSK |= _BV(PCINT1); // Use PB1 as interrupt pin
ADCSRA &= ~_BV(ADEN); // ADC off
set_sleep_mode(SLEEP_MODE_PWR_DOWN); // replaces above statement
sleep_enable(); // Sets the Sleep Enable bit in the MCUCR Register (SE BIT)
sei(); // Enable interrupts
sleep_cpu(); // sleep
cli(); // Disable interrupts
PCMSK &= ~_BV(PCINT1); // Turn off PB1 as interrupt pin
sleep_disable(); // Clear SE bit
ADCSRA |= _BV(ADEN); // ADC on
sei(); // Enable interrupts
}
void loop() {
displayTemperature();
delay(2000);
//sleep();
}
void displayTemperature() {
if (millis() - DHT.lastRead() >= 1000)
{
int status = DHT.read();
// Clear screen on status change
if (status != previous_status) {
oled.clear();
}
if (status == 0) {
float t = DHT.getTemperature();
float h = DHT.getHumidity();
oled.setCursor(0, 0);
oled.print(t, 1);
oled.print(" C ");
oled.setCursor(64, 0);
oled.print(h, 1);
oled.print(" % ");
} else {
oled.setCursor(0, 0);
oled.print("TEMP. ERROR");
}
previous_status = status;
}
}
ISR(PCINT0_vect) { }