// OLED knjižnice
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
// sensor knjižnjice
#include <OneWire.h>
#include <DallasTemperature.h>
// definiranje OLED
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define SSD1306_I2C_ADDRESS 0x3C
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire);
//definiranje pin-ov
#define potentiometer_pin A3
#define up_btn_pin 2
#define down_btn_pin 0
#define sensor_pin 3
#define buzzer_pin 4
// definiranje vrednosti
float sensor_temp;
int timer = 0;
int buzzer_interval = 5000; // čas med piski buzzerja v milisekundah
bool is_beeping = false;
int last_buzz_time = 0;
int user_temp;
int before_temp = 0;
float user_time = 0;
int trenutni_cas;
int prejsni_cas = 0;
int btn_interval = 70; // čas med pregledom stanja gumbov v milisekundah
// definiranje sensorja
OneWire oneWire(sensor_pin);
DallasTemperature sensor(&oneWire);
void setup() {
// inicializacija displaya
display.begin(SSD1306_SWITCHCAPVCC, SSD1306_I2C_ADDRESS);
display.setTextSize(2);
display.setTextColor(SSD1306_WHITE);
// inicalizacija sensorja
sensor.begin();
//določanje pin-ov itd.
Serial.begin(9600);
pinMode(potentiometer_pin, INPUT);
pinMode(up_btn_pin, INPUT_PULLUP);
pinMode(down_btn_pin, INPUT_PULLUP);
pinMode(buzzer_pin, OUTPUT);
// začetna slika in vrednosti
display.display();
delay(1500);
display.clearDisplay();
displayTime(0);
displayTemp(0);
}
void loop() {
// vnos temperature
user_temp = map(analogRead(potentiometer_pin), 0, 1023, -55, 125);
if (user_temp != before_temp){ // prihrani hitrost, če se napiše temperatura samo, ko je spremenjena
displayTemp(user_temp);
before_temp = user_temp;
}
// vnos časa z gumbi
trenutni_cas = millis();
if (trenutni_cas > prejsni_cas + btn_interval){
prejsni_cas = trenutni_cas;
// preveri če je gumb pritisnjen (output = 0)
if (!digitalRead(up_btn_pin)){
user_time += 500;
displayTime(user_time);
}
if (!digitalRead(down_btn_pin) && user_time > 0){
user_time -= 500;
displayTime(user_time);
}
}
// sensor
sensor.requestTemperatures();
sensor_temp = sensor.getTempCByIndex(0);
trenutni_cas = millis();
if (sensor_temp >= user_temp) {
if (!is_beeping) {
is_beeping = true;
// začne štopati, -buzzer_interval, ker se kasneje ta spremenljivka doda
last_buzz_time = trenutni_cas + user_time - buzzer_interval;
}
// piskanje v intervalih
if (trenutni_cas >= last_buzz_time + buzzer_interval) {
last_buzz_time = trenutni_cas;
tone(buzzer_pin, 900, 100); // 900Hz ton za 100ms
Serial.println("Buzz");
}
}
else {
is_beeping = false; // neha piskati ko se zniža temperatura pod mejo
}
}
void displayTemp(int temp) {
display.fillRect(60, 0, 80, 20, SSD1306_BLACK);
display.setCursor(0, 0);
display.print("Temp:");
display.print(temp);
display.write(247); // prikaže znak za stopinje
display.print("C");
display.display();
}
void displayTime(float time) {
display.fillRect(60, 30, 80, 20, SSD1306_BLACK);
display.setCursor(0, 30);
display.print("Time:");
if (time < 100000){
display.print(time/1000, 1); // ena decimalka
}
else{
display.print(time/1000, 0); // brez decimalk
}
display.print("s");
display.display();
}