i made a thermometer based on 3 digit 7 segment common anode display, it uses DHT11 sensor, shows the temperature value which it read at starting but not updating in any condition....
#include <dht_nonblocking.h>
#define DHT_PIN A4
#define DHT_TYPE DHT_TYPE_11
DHT_nonblocking dht_sensor(DHT_PIN, DHT_TYPE);
const int segmentPins[8] = {0, 1, 2, 3, 4, 5, 6, 7};
const int digitPins[3] = {8, 9, 10};
const byte digits[10] = {
B1111110, // 0
B0110000, // 1
B1101101, // 2
B1111001, // 3
B0110011, // 4
B1011011, // 5
B1011111, // 6
B1110000, // 7
B1111111, // 8
B1111011 // 9
};
unsigned long lastRead = 0;
const unsigned long readInterval = 2000; // 2-second update interval
float temperature = 0.0;
bool firstReading = true;
void setup() {
// Initialize pins
for (int i = 0; i < 8; i++) pinMode(segmentPins[i], OUTPUT);
for (int i = 0; i < 3; i++) pinMode(digitPins[i], OUTPUT);
// Slower startup animation (10 seconds)
const byte animationFrames[] = {
B1000000, // A
B0100000, // B
B0010000, // C
B0001000, // D
B0000100, // E
B0000010, // F
B0000001 // G
};
unsigned long animationStart = millis();
unsigned long frameStart = animationStart;
int currentFrame = 0;
const int frameDuration = 500; //
while (millis() - animationStart < 10000) { // 10-second animation
// Update animation frame
if (millis() - frameStart >= frameDuration) {
frameStart = millis();
currentFrame = (currentFrame + 1) % 7;
}
// Try to read sensor during animation
float temp;
if (dht_sensor.measure(&temp, NULL)) {
temperature = temp; // Store as float
firstReading = false;
}
// Display current animation frame
displayAnimationFrame(animationFrames[currentFrame]);
}
}
void loop() {
float temp;
// Continuously attempt to read the sensor
if (dht_sensor.measure(&temp, NULL)) {
// Update temperature every 10 seconds
if (millis() - lastRead >= readInterval) {
lastRead = millis();
temperature = temp;
firstReading = false;
}
}
// Display current temperature
displayNumber(firstReading ? 0.0f : temperature);
}
void clearDisplay() {
for (int digit = 0; digit < 3; digit++) {
digitalWrite(digitPins[digit], HIGH); // Turn off all digits
}
for (int segment = 0; segment < 8; segment++) {
digitalWrite(segmentPins[segment], HIGH); // Turn off all segments
}
}
void displayNumber(float temp) {
// Clear old digits before updating
clearDisplay();
int number = round(temp * 10); // Convert temp to 1 decimal place (e.g., 24.7 → 247)
int digitsArray[3] = { (number / 100) % 10, (number / 10) % 10, number % 10 };
for (int digit = 0; digit < 3; digit++) {
digitalWrite(digitPins[digit], LOW);
if (digit == 0 && temp < 10) {
displayDigit(-1); // Blank leading digit for temps under 10°C
} else {
displayDigit(digitsArray[digit]);
}
digitalWrite(segmentPins[7], (digit == 1) ? LOW : HIGH); // Decimal point on middle digit
delay(5);
digitalWrite(digitPins[digit], HIGH);
}
}
void displayDigit(int number) {
// Clear previous segments
for (int segment = 0; segment < 7; segment++) {
digitalWrite(segmentPins[segment], HIGH);
}
// Display number if valid
if (number != -1) {
for (int segment = 0; segment < 7; segment++) {
digitalWrite(segmentPins[segment], !(digits[number] & (1 << (6 - segment))));
}
}
}
void displayAnimationFrame(byte pattern) {
for (int digit = 0; digit < 3; digit++) {
digitalWrite(digitPins[digit], LOW);
displayPattern(pattern);
delay(5);
digitalWrite(digitPins[digit], HIGH);
}
}
void displayPattern(byte pattern) {
for (int segment = 0; segment < 7; segment++) {
digitalWrite(segmentPins[segment], !((pattern >> (6 - segment)) & 1));
}
digitalWrite(segmentPins[7], HIGH);
}