#include <OneWire.h> // Comunicație pe un singur fir (OneWire)
#include <DallasTemperature.h> // Bibliotecă pentru senzorul DS18B20
// Senzor DS18B20 conectat pe pinul A0
const int oneWireBus = A0;
OneWire oneWire(oneWireBus);
DallasTemperature sensors(&oneWire); // Inițializăm senzorul
// Segmentele A–G + punctul zecimal (DP), pe pinii 5–12 ===
const int segmentPins[8] = {5, 6, 7, 8, 9, 10, 11, 12}; // A, B, C, D, E, F, G, DP
// Controlul cifrelor: DIG1, DIG2, DIG3, pe pinii 2–4 ===
const int digitPins[3] = {2, 3, 4}; // Multiplexare: activăm una pe rând
// Coduri pentru afișarea cifrelor 0–9 pe display cu ANOD COMUN
// Formatul: A B C D E F G DP — 0 = segment aprins, 1 = segment stins
const byte digitTable[10] = {
B11000000, B11111001, B10100100, B10110000,
B10011001, B10010010, B10000010, B11111000,
B10000000, B10010000
};
// Buzzer conectat pe pinul A1
const int buzzerPin = A1;
// Variabile pentru afișaj și temperatură
int digits[3] = {0, 0, 0}; // Cifrele de afișat
int digitIndex = 0; // Cifra curentă activă (0, 1, 2)
float lastTemperature = 0.0; // Ultima temperatură citită
unsigned long lastTempUpdate = 0; // Momentul ultimei citiri a temperaturii
unsigned long lastBeepToggle = 0; // Momentul ultimei comutări a buzzerului
bool buzzerState = false; // Starea buzzerului
void setup() {
sensors.begin(); // Inițializare senzor DS18B20
pinMode(buzzerPin, OUTPUT); // Pinul buzzer ca ieșire
// Setăm pinii cifrelor (DIG1–DIG3) ca ieșiri
for (int i = 0; i < 3; i++)
pinMode(digitPins[i], OUTPUT);
// Setăm pinii segmentelor (A–G + DP) ca ieșiri
for (int i = 0; i < 8; i++)
pinMode(segmentPins[i], OUTPUT);
}
void loop() {
// Citim temperatura la fiecare 300ms
if (millis() - lastTempUpdate >= 300) {
lastTempUpdate = millis();
sensors.requestTemperatures(); // Comandăm citirea senzorului
lastTemperature = sensors.getTempCByIndex(0); // Obținem temperatura în °C
int temp = int(lastTemperature * 10); // Păstrăm o zecimală (ex: 25.3°C → 253)
digits[0] = (temp / 100) % 10; // Cifra sutei
digits[1] = (temp / 10) % 10; // Cifra zecilor
digits[2] = temp % 10; // Cifra unităților
}
// Activăm buzzerul dacă temperatura ≥ 25°C (beep rapid)
if (lastTemperature >= 25.0) {
if (millis() - lastBeepToggle >= 200) {
lastBeepToggle = millis();
buzzerState = !buzzerState;
digitalWrite(buzzerPin, buzzerState ? HIGH : LOW); // Alternăm starea buzzerului
}
} else {
digitalWrite(buzzerPin, LOW); // Buzzer oprit sub 25°C
}
// Multiplexare: afișăm câte o cifră pe rând
showDigit(digitIndex, digits[digitIndex], digitIndex == 1); // Doar cifra 2 are punct zecimal
digitIndex = (digitIndex + 1) % 3; // Trecem la cifra următoare
delay(1); // Pauză foarte scurtă
}
// Funcție care afișează o singură cifră
// digitIndex: 0, 1, 2 (pentru DIG1–DIG3)
// number: cifra de afișat (0–9)
// showDot: true dacă trebuie aprins punctul zecimal
void showDigit(int digitIndex, int number, bool showDot) {
// Dezactivăm toate cele 3 cifre (LOW = oprire anod comun)
for (int i = 0; i < 3; i++)
digitalWrite(digitPins[i], LOW);
// Codul pentru cifra cerută (7 biți: A–G)
byte segments = digitTable[number];
// Setăm fiecare segment A–G
for (int i = 0; i < 7; i++)
digitalWrite(segmentPins[i], (segments >> i) & 0x01 ? HIGH : LOW); // 0 = aprins
// Setăm DP (punctul zecimal)
digitalWrite(segmentPins[7], showDot ? LOW : HIGH); // LOW = aprins
// Activăm cifra curentă (HIGH = activare pentru anod comun)
digitalWrite(digitPins[digitIndex], HIGH);
}