// --- Vključitev knjižnic ---
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h> // Za OLED zaslon
#include <HX711_ADC.h> // Za tehtnico (Load Cell)
#include <Servo.h> // Za upravljanje servomotorja
#include <OneWire.h> // Za komunikacijo s temperaturnim senzorjem
#include <DallasTemperature.h> // Za branje temperature
// --- Definicije OLED zaslona ---
#define screen_wide 128
#define screen_height 64
#define SSD1306_I2C_ADDRESS 0x3c
// --- Pini za senzorje ---
#define DS 4 // Pin za temperaturni senzor
#define DOUT 12 // Pin za dimni senzor (digitalni izhod)
// --- Spremenljivke za komponente ---
int sensorValue;
OneWire oneWire(DS);
DallasTemperature sensor(&oneWire);
// --- LED diode ---
int led1 = 1;
int led2 = 2;
int led3 = 3;
// --- Servo motor ---
Servo servo;
// --- Gumb za zagon ---
int button = 11;
// --- Inicializacija zaslona ---
Adafruit_SSD1306 moj_zaslon(screen_wide, screen_height, &Wire);
// --- Inicializacija tehtnice ---
HX711_ADC LoadCell(9, 8); // DT = 9, SCK = 8
// --- Država sistema ---
bool state = false;
// ----------------------------------------------------
// ---------------------- SETUP -----------------------
// ----------------------------------------------------
void setup() {
// Inicializacija zaslona
moj_zaslon.begin(SSD1306_SWITCHCAPVCC, SSD1306_I2C_ADDRESS);
moj_zaslon.clearDisplay();
moj_zaslon.setTextSize(1);
moj_zaslon.setTextColor(SSD1306_WHITE);
moj_zaslon.setCursor(10,10);
moj_zaslon.print(F("Pametno rezvrscanje po tezi"));
moj_zaslon.display();
// Inicializacija temperaturnega senzorja
sensor.begin();
// Nastavitev vhodnih/izhodnih pinov
pinMode(button, INPUT_PULLUP); // Gumb (aktivira se ob pritisku - LOW)
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
// Inicializacija servomotorja
servo.attach(5);
// Inicializacija tehtnice
LoadCell.begin();
LoadCell.start(2000); // Čas inicializacije v milisekundah
LoadCell.setCalFactor(420); // Kalibracijski faktor tehtnice
}
// ----------------------------------------------------
// ---------------------- LOOP ------------------------
// ----------------------------------------------------
void loop() {
// --- Preverjanje, če je gumb pritisnjen ---
if (digitalRead(button) == LOW ) {
state = true; // Omogoči delovanje sistema
}
// --- Branje temperature ---
sensor.requestTemperatures();
int temp = sensor.getTempCByIndex(0);
// --- Varnost: preveri previsoko temperaturo ---
if (temp >= 90) {
digitalWrite(led1, LOW);
digitalWrite(led2, LOW);
digitalWrite(led3, HIGH);
moj_zaslon.clearDisplay();
moj_zaslon.setTextSize(1);
moj_zaslon.setTextColor(SSD1306_WHITE);
moj_zaslon.setCursor(10,10);
moj_zaslon.print("TEMPERATURA PREVISOKA");
moj_zaslon.setCursor(10,30);
moj_zaslon.print("ZAUSTAVI SISTEM");
moj_zaslon.display();
return; // Ustavi nadaljnje izvajanje loop-a
}
// --- Varnost: preveri zaznano prisotnost dima ---
if (digitalRead(DOUT) == LOW) { // LOW = alarm na večini dim senzorjev
digitalWrite(led1, LOW);
digitalWrite(led2, LOW);
digitalWrite(led3, HIGH);
moj_zaslon.clearDisplay();
moj_zaslon.setTextSize(1);
moj_zaslon.setTextColor(SSD1306_WHITE);
moj_zaslon.setCursor(10,10);
moj_zaslon.print("ZAZNAN DIM");
moj_zaslon.setCursor(10,30);
moj_zaslon.print("ZAUSTAVI SISTEM");
moj_zaslon.display();
return; // Ustavi nadaljnje izvajanje loop-a
}
// --- Branje mase iz tehtnice ---
LoadCell.update();
float i = LoadCell.getData();
// --- Pretvorba mase v kot za servo motor ---
int serp = map((int)i, 0, 50, 0, 180); // Mapiranje mase na kot
servo.write(serp);
// --- Če je sistem aktiven, prikazuj podatke ---
if (state == true) {
if (serp <= 60) { // Lahek tovor
digitalWrite(led1, HIGH);
digitalWrite(led2, LOW);
digitalWrite(led3, LOW);
moj_zaslon.clearDisplay();
moj_zaslon.setTextSize(1);
moj_zaslon.setTextColor(SSD1306_WHITE);
moj_zaslon.setCursor(10,10);
moj_zaslon.print(i);
moj_zaslon.print(" KG");
moj_zaslon.setCursor(10,30);
moj_zaslon.print("LAHEK TOVOR");
moj_zaslon.display();
}
if (serp > 60 && serp <= 120) { // Srednji tovor
digitalWrite(led1, LOW);
digitalWrite(led2, HIGH);
digitalWrite(led3, LOW);
moj_zaslon.clearDisplay();
moj_zaslon.setTextSize(1);
moj_zaslon.setTextColor(SSD1306_WHITE);
moj_zaslon.setCursor(10,10);
moj_zaslon.print(i);
moj_zaslon.print(" KG");
moj_zaslon.setCursor(10,30);
moj_zaslon.print("SREDNJI TOVOR");
moj_zaslon.display();
}
if (serp > 120) { // Težak tovor
digitalWrite(led1, LOW);
digitalWrite(led2, LOW);
digitalWrite(led3, HIGH);
moj_zaslon.clearDisplay();
moj_zaslon.setTextSize(1);
moj_zaslon.setTextColor(SSD1306_WHITE);
moj_zaslon.setCursor(10,10);
moj_zaslon.print(i);
moj_zaslon.print(" KG");
moj_zaslon.setCursor(10,30);
moj_zaslon.print("TEZAK TOVOR");
moj_zaslon.display();
}
}
}