#include <Wire.h>
#include <Adafruit_GFX.h>
#include "soc/rtc.h"
#include <Adafruit_SSD1306.h>
#include "HX711.h"
#define DT_PIN 16 // Pin pro váhový senzor (HX711)
#define SCK_PIN 4 // Pin pro váhový senzor (HX711)
#define BUTTON_MODE_PIN 18 // Pin pro tlačítko režimu
#define BUTTON_ZERO_PIN 19 // Pin pro tlačítko nulování
#define RELAY_PIN 17 // Pin pro relé
HX711 scale;
Adafruit_SSD1306 display(128, 64, &Wire, -1);
bool mode1 = true;
long weight=0;
void setup() {
pinMode(BUTTON_MODE_PIN, INPUT_PULLUP);
pinMode(BUTTON_ZERO_PIN, INPUT_PULLUP);
pinMode(RELAY_PIN, OUTPUT);
pinMode(BUTTON_MODE_PIN, INPUT_PULLUP);
attachInterrupt(BUTTON_MODE_PIN, zmena_modu, HIGH);
Serial.begin(9600);
if(!display.begin(SSD1306_BLACK, 0x3c, 21, 22)) {
Serial.println(F("SSD1306 allocation failed"));
for(;;);
}
display.display();
//delay(200);
display.clearDisplay();
scale.begin(DT_PIN, SCK_PIN);
//zeroScale();
}
void zeroScale() {
//scale.set_scale(-357);
scale.tare(); // Nastaví váhu na nulu
//delay(500); // Čekání na ustálení
}
void zmena_modu(){
if (mode1) {
// Mode 1: Spínat relé, když váha překročí určitý limit
if (weight > 3800) {
digitalWrite(RELAY_PIN, HIGH);
} else {
digitalWrite(RELAY_PIN, LOW);
}
} else {
// Mode 2: Spínat relé, když váha klesne pod určitý limit
if (weight < 15) {
digitalWrite(RELAY_PIN, HIGH);
} else {
digitalWrite(RELAY_PIN, LOW);
}
}
}
void loop() {
if (digitalRead(BUTTON_MODE_PIN) == LOW) {
mode1 = !mode1; // Toggle mode on button press
zeroScale(); // Zajistíme nulování při změně režimu
// delay(50); // Debounce
}
if (digitalRead(BUTTON_ZERO_PIN) == LOW) {
zeroScale(); // Zajistíme nulování při stisku tlačítka pro nulování
//delay(50); // Debounce
}
weight = scale.get_units(1); // Get raw weight value
Serial.print("get units: \t\t");
Serial.println(scale.get_units(1), 3);
// Zobrazit výsledky na displeji v průběhu s vyšší frekvencí
display.clearDisplay();
display.setTextSize(1.2);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 10);
display.print(F("Hmotnost: "));
display.setCursor(80, 10);
display.print(weight);
display.setCursor(0, 30);
display.print(F("Rezim: "));
display.setCursor(60, 30);
display.print(mode1 ? F("Mode 1") : F("Mode 2"));
display.display();
delay(50); // Zvyšujeme frekvenci aktualizace na 500 ms
}