#include <Wire.h>
#include <RTClib.h>
#include <DHT.h>
#include <WiFi.h>
#include <HTTPClient.h>
//#include "DHTesp.h"
// Define multiplexer pins
#define S0 16
#define S1 17
#define S2 18
#define S3 19
#define SIG 34 // MUX Signal pin for input/output
// Segment pins (connect directly to ESP32 GPIOs)
const int segmentPins[] = {23, 22, 21, 5, 4, 2, 15};
// Define multiplexer channel selection values
const int channelCount = 16;
// RTC and DHT definitions
RTC_DS1307 rtc;
#define DHTPIN 13
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
// WiFi credentials
// const char* ssid = "YOUR_WIFI_SSID";
// const char* password = "YOUR_WIFI_PASSWORD";
const char* serverURL = "http://your-server.com/log"; // Replace with your server URL
// Segment values for digits 0-9
const byte digits[] = {
0b00111111, // 0
0b00000110, // 1
0b01011011, // 2
0b01001111, // 3
0b01100110, // 4
0b01101101, // 5
0b01111101, // 6
0b00000111, // 7
0b01111111, // 8
0b01101111 // 9
};
void setup() {
Serial.begin(115200);
// Initialize multiplexer control pins
pinMode(S0, OUTPUT);
pinMode(S1, OUTPUT);
pinMode(S2, OUTPUT);
pinMode(S3, OUTPUT);
// Initialize segment pins
for (int i = 0; i < 7; i++) {
pinMode(segmentPins[i], OUTPUT);
digitalWrite(segmentPins[i], LOW); // Turn off segments
}
// Initialize RTC and DHT
Wire.begin();
if (!rtc.begin()) {
Serial.println("Couldn't find RTC");
while (1);
}
if (!rtc.isrunning()) {
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
dht.begin();
// Connect to WiFi
Serial.begin(9600);
Serial.print("Connecting to WiFi");
WiFi.begin("Wokwi-GUEST", "", 6);
while (WiFi.status() != WL_CONNECTED) {
delay(100);
Serial.print(".");
}
Serial.println(" Connected!");
}
void selectMuxChannel(int channel) {
// Set multiplexer channel
digitalWrite(S0, channel & 1);
digitalWrite(S1, (channel >> 1) & 1);
digitalWrite(S2, (channel >> 2) & 1);
digitalWrite(S3, (channel >> 3) & 1);
}
void displayDigit(int channel, int value) {
// Select the corresponding MUX channel
selectMuxChannel(channel);
// Write segment data
for (int i = 0; i < 7; i++) {
digitalWrite(segmentPins[i], (digits[value] >> i) & 1);
}
delay(5); // Display the digit briefly
}
/*
void displayNumber(int startChannel, int number) {
// Break number into individual digits and display them
for (int i = 0; i < 6; i++) {
int digit = number % 10;
displayDigit(startChannel + i, digit);
number /= 10;
}
}
*/
void displayNumber(int startChannel, int number) {
// Break number into individual digits and display them
for (int i = 5; i >= 0; i--) { // Display 6 digits max
int digit = number % 10;
displayDigit(startChannel + i, digit);
number /= 10;
}
}
void sendToServer(float temperature, float humidity) {
if (WiFi.status() == WL_CONNECTED) {
HTTPClient http;
http.begin(serverURL);
// Prepare data
String payload = "temperature=" + String(temperature) + "&humidity=" + String(humidity);
// Send POST request
http.addHeader("Content-Type", "application/x-www-form-urlencoded");
int responseCode = http.POST(payload);
if (responseCode > 0) {
Serial.println("Data logged successfully");
} else {
Serial.println("Failed to send data");
}
http.end();
} else {
Serial.println("WiFi not connected");
}
}
void loop() {
DateTime now = rtc.now(); // Get the current time
// Get temperature and humidity
float temperature = dht.readTemperature();
float humidity = dht.readHumidity();
// Print time (HH:MM:SS)
Serial.print("Time: ");
Serial.print(now.hour());
Serial.print(":");
Serial.print(now.minute());
Serial.print(":");
Serial.println(now.second());
// Print date (DDMMYYYY)
Serial.print("Date: ");
Serial.print(now.day());
Serial.print("/");
Serial.print(now.month());
Serial.print("/");
Serial.println(now.year());
// Print temperature and humidity
Serial.print("Temperature: ");
Serial.print(temperature);
Serial.print(" °C\t");
Serial.print("Humidity: ");
Serial.print(humidity);
Serial.println(" %");
// Display time (HH:MM:SS)
displayNumber(0, now.hour() * 10000 + now.minute() * 100 + now.second());
// Display date (DDMMYYYY)
displayNumber(6, now.day() * 1000000 + now.month() * 10000 + now.year());
// Display temperature and humidity
displayNumber(12, (int)temperature);
displayNumber(14, (int)humidity);
// Log temperature and humidity to server
sendToServer(temperature, humidity);
delay(1000); // Update every second
}