#include <Wire.h>
#include "DHT20.h"
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1 // No reset pin needed for Wokwi
#define OLED_COLUMN 70
const uint8_t FAKE_I2C_DEVICE_ADDRESS = 0x42;
const uint16_t FAKE_I2C_DEVICE_REGISTER_ADDRESS = 0x50;
DHT20 DHT;
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
uint8_t count = 0;
void setup() {
Serial.begin(9600);
Wire.begin();
DHT.begin();
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Use 0x3C for I2C address
Serial.println(F("SSD1306 allocation failed"));
for (;;);
}
display.clearDisplay();
display.setTextColor(SSD1306_WHITE);
display.display();
delay(1500);
}
void loop() {
display.clearDisplay();
//fake_i2c_device_loop();
dht20_loop();
display.display();
delay(2000);
}
void dht20_loop() {
if (millis() - DHT.lastRead() >= 1000)
{
uint32_t start = micros();
int status = DHT.read();
uint32_t stop = micros();
if ((count % 10) == 0)
{
count = 0;
Serial.println();
Serial.println("Type\tHumidity (%)\tTemp (°C)\tTime (µs)\tStatus");
}
count++;
Serial.print("DHT20 \t");
Serial.print(DHT.getHumidity(), 1);
Serial.print("\t\t");
Serial.print(DHT.getTemperature(), 1);
Serial.print("\t\t");
Serial.print(stop - start);
Serial.print("\t\t");
switch (status)
{
case DHT20_OK:
Serial.print("OK");
break;
case DHT20_ERROR_CHECKSUM:
Serial.print("Checksum error");
break;
case DHT20_ERROR_CONNECT:
Serial.print("Connect error");
break;
case DHT20_MISSING_BYTES:
Serial.print("Missing bytes");
break;
case DHT20_ERROR_BYTES_ALL_ZERO:
Serial.print("All bytes read zero");
break;
case DHT20_ERROR_READ_TIMEOUT:
Serial.print("Read time out");
break;
case DHT20_ERROR_LASTREAD:
Serial.print("Error read too fast");
break;
default:
Serial.print("Unknown error");
break;
}
Serial.print("\n");
display.setCursor(0, 0);
display.print("Temperature");
display.setCursor(OLED_COLUMN, 0);
display.println(DHT.getTemperature(), 1);
display.setCursor(0, 10);
display.print("Humidity");
display.setCursor(OLED_COLUMN, 10);
display.println(DHT.getHumidity(), 1);
display.setCursor(0, 20);
display.print("Status");
display.setCursor(OLED_COLUMN, 20);
display.println(status == DHT20_OK ? "OK" : "KO");
}
}
void fake_i2c_device_loop() {
// Prepare the i2c device
Wire.beginTransmission(FAKE_I2C_DEVICE_ADDRESS);
Wire.write(FAKE_I2C_DEVICE_REGISTER_ADDRESS);
Wire.endTransmission();
// Read from the i2c device
Wire.requestFrom(FAKE_I2C_DEVICE_ADDRESS, 1);
delay(5);
uint8_t buf;
Wire.readBytes((uint8_t *)&buf, 1);
display.setCursor(0, 40);
display.print("Fake i2c");
display.setCursor(OLED_COLUMN, 40);
display.println(buf);
}