#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <EEPROM.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#define BUTTON_UP_PIN 2
#define BUTTON_DOWN_PIN 3
#define BUTTON_LEFT_PIN 4
#define BUTTON_RIGHT_PIN 5
#define BUTTON_SELECT_PIN 6
#define BUZZER_PIN 8
#define BUZZER_LOCK_BUTTON 7
#define TEMP_CHANGE_THRESHOLD 0.5
#define TEMP_READ_INTERVAL 5000
#define SENSOR_CHECK_INTERVAL 30000
#define NUM_SENSORS 2
#define NUM_READINGS 5
LiquidCrystal_I2C lcd(0x27, 20, 4);
OneWire oneWire(2);
DallasTemperature sensors(&oneWire);
int screen = 1;
int settingIndex = 0;
int settings[3] = {50, 100, 200};
float temperatures[NUM_SENSORS][NUM_READINGS];
unsigned int currentReading = 0;
float averagedTemperature = 0.0;
bool buzzerEnabled = true;
bool buzzerLocked = false;
bool sensorError[NUM_SENSORS] = {false};
unsigned long lastTempReadTime = 0;
unsigned long lastSensorCheckTime = 0;
unsigned long lastBuzzerLockTime = 0;
unsigned long buzzerAlarmStartTime = 0;
unsigned long debounceDelay = 50;
bool buttonState = HIGH;
void setup() {
Serial.begin(9600);
pinMode(BUZZER_PIN, OUTPUT);
pinMode(BUZZER_LOCK_BUTTON, INPUT_PULLUP);
lcd.init();
lcd.backlight();
sensors.begin();
// First code setup
pinMode(BUTTON_UP_PIN, INPUT_PULLUP);
pinMode(BUTTON_DOWN_PIN, INPUT_PULLUP);
pinMode(BUTTON_LEFT_PIN, INPUT_PULLUP);
pinMode(BUTTON_RIGHT_PIN, INPUT_PULLUP);
pinMode(BUTTON_SELECT_PIN, INPUT_PULLUP);
displayMainScreen();
}
void loop() {
if(screen == 1) {
handleMainScreen();
} else if(screen == 2) {
handleSettingsScreen();
} else {
if (!sensorError[0] || !sensorError[1]) {
if (millis() - lastTempReadTime >= TEMP_READ_INTERVAL) {
readTemperatures();
updateDisplay();
lastTempReadTime = millis();
}
if (millis() - lastSensorCheckTime >= SENSOR_CHECK_INTERVAL) {
checkSensorStatus();
lastSensorCheckTime = millis();
}
} else {
if (!buzzerLocked) {
buzzerAlarmStartTime = millis();
buzzerAlarm();
} else {
if (millis() - buzzerAlarmStartTime >= 5000) {
buzzerLocked = false;
}
}
for (int i = 0; i < NUM_SENSORS; ++i) {
sensorError[i] = false;
}
}
checkBuzzerLockButton();
}
}
void displayMainScreen() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Main Screen");
}
void handleMainScreen() {
if(digitalRead(BUTTON_SELECT_PIN) == LOW) {
screen = 2;
displaySettingsScreen();
delay(200);
}
}
void displaySettingsScreen() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Settings");
for(int i = 0; i < 3; i++) {
lcd.setCursor(0, i + 1);
if(i == settingIndex) {
lcd.print(">");
} else {
lcd.print(" ");
}
lcd.print("Setting ");
lcd.print(i + 1);
lcd.print(": ");
lcd.print(settings[i]);
}
}
void handleSettingsScreen() {
if(digitalRead(BUTTON_SELECT_PIN) == LOW) {
saveSetting(settingIndex);
screen = 1;
displayMainScreen();
delay(200);
} else if(digitalRead(BUTTON_UP_PIN) == LOW) {
changeSetting(1);
displaySettingsScreen();
delay(200);
} else if(digitalRead(BUTTON_DOWN_PIN) == LOW) {
changeSetting(-1);
displaySettingsScreen();
delay(200);
} else if(digitalRead(BUTTON_LEFT_PIN) == LOW) {
settingIndex = (settingIndex + 2) % 3;
displaySettingsScreen();
delay(200);
} else if(digitalRead(BUTTON_RIGHT_PIN) == LOW) {
settingIndex = (settingIndex + 1) % 3;
displaySettingsScreen();
delay(200);
}
}
void changeSetting(int change) {
settings[settingIndex] += change;
if(settings[settingIndex] < 0) {
settings[settingIndex] = 0;
}
}
void saveSetting(int index) {
EEPROM.put(index * sizeof(int), settings[index]);
}
void readTemperatures() {
sensors.requestTemperatures();
for (int i = 0; i < NUM_SENSORS; ++i) {
float temp = sensors.getTempCByIndex(i);
if (temp == DEVICE_DISCONNECTED_C) {
sensorError[i] = true;
temperatures[i][currentReading] = -127.0;
} else {
temperatures[i][currentReading] = round(temp * 10) / 10.0;
}
}
currentReading = (currentReading + 1) % NUM_READINGS;
averagedTemperature = calculateAverageTemperature();
}
void updateDisplay() {
lcd.clear();
lcd.setCursor(0, 0);
if (!sensorError[0]) {
lcd.print("Temp1: ");
lcd.print(temperatures[0][currentReading], 1);
lcd.print(" C");
} else {
lcd.print("Blad czujnika 1");
}
lcd.setCursor(0, 1);
if (!sensorError[1]) {
lcd.print("Temp2: ");
lcd.print(temperatures[1][currentReading], 1);
lcd.print(" C");
} else {
lcd.print("Blad czujnika 2");
}
}
float calculateAverageTemperature() {
float total[NUM_SENSORS] = {0.0};
for (int i = 0; i < NUM_SENSORS; ++i) {
for (int j = 0; j < NUM_READINGS; ++j) {
total[i] += temperatures[i][j];
}
}
return total[0] / NUM_READINGS;
}
void buzzerAlarm() {
if (buzzerEnabled) {
for (int i = 0; i < 3; ++i) {
tone(BUZZER_PIN, 1000);
delay(200);
noTone(BUZZER_PIN);
delay(200);
}
}
}
void checkSensorStatus() {
for (int i = 0; i < NUM_SENSORS; ++i) {
float temp = sensors.getTempCByIndex(i);
if (temp == DEVICE_DISCONNECTED_C) {
sensorError[i] = true;
}
}
}
void checkBuzzerLockButton() {
unsigned long currentTime = millis();
if (currentTime - lastBuzzerLockTime >= debounceDelay) {
bool newButtonState = digitalRead(BUZZER_LOCK_BUTTON);
if (newButtonState != buttonState) {
if (newButtonState == LOW) {
buzzerLocked = !buzzerLocked;
}
buttonState = newButtonState;
}
lastBuzzerLockTime = currentTime;
}
}
Loading
ds18b20
ds18b20
Loading
ds18b20
ds18b20