#include "SevSeg.h" // Biblioteka do obsługi wyświetlacza
#include <EEPROM.h> // Biblioteka do obsługi EEPROM
SevSeg sevseg; // Obiekt wyświetlacza
const int sensorPin = 2; // Pin czujnika optycznego
const int resetPin = 13; // Pin przycisku resetu
const int buzzerPin = A2; // Pin buzzera
int productCount = 0; // Licznik produktów
int totalProducts = 0; // Całkowita liczba produktów zapisana w EEPROM
const int warningLimit = 10; // Próg ostrzegawczy
bool warningGiven = false; // Flaga, czy ostrzeżenie zostało już wygenerowane
void setup() {
pinMode(sensorPin, INPUT_PULLUP); // Konfiguracja pinu czujnika
pinMode(resetPin, INPUT_PULLUP); // Konfiguracja pinu przycisku resetu
pinMode(buzzerPin, OUTPUT); // Konfiguracja pinu buzzera
Serial.begin(9600);
// Konfiguracja wyświetlacza
byte numDigits = 4;
byte digitPins[] = {11, 12, A0, A1};
byte segmentPins[] = {3, 4, 5, 6, 7, 8, 9, 10};
sevseg.begin(COMMON_ANODE, numDigits, digitPins, segmentPins);
sevseg.setBrightness(90);
// Odczyt liczby produktów z EEPROM
totalProducts = EEPROM.read(0);
if (totalProducts > 99 || totalProducts < 0) {
totalProducts = 0; // Inicjalizacja w przypadku błędnych danych
}
Serial.print("Odczytano z EEPROM: ");
Serial.println(totalProducts);
Serial.println("System gotowy...");
}
void loop() {
static int lastStateSensor = HIGH; // Poprzedni stan czujnika
static int lastStateReset = HIGH; // Poprzedni stan przycisku resetu
// Sprawdzenie stanu czujnika - zliczanie produktów
int currentSensorState = digitalRead(sensorPin);
if (currentSensorState == LOW && lastStateSensor == HIGH) {
productCount++;
totalProducts++; // Zwiększamy całkowity licznik produktów
EEPROM.write(0, totalProducts); // Zapis całkowitej liczby produktów do EEPROM
Serial.print("Zliczono produkt: ");
Serial.println(productCount);
Serial.print("Symulacja: Wysyłanie do chmury... Aktualna liczba produktów: ");
Serial.println(totalProducts); // Symulacja wysyłania do chmury
// Sprawdzenie, czy osiągnięto próg ostrzegawczy
if (productCount == warningLimit && !warningGiven) {
Serial.println("!!! Osiągnięto limit produktów !!!");
tone(buzzerPin, 1000, 1000); // Generowanie dźwięku 1s o wyższej częstotliwości
warningGiven = true; // Flaga, aby ostrzeżenie nie powtórzyło się
}
delay(200); // Debouncing
}
lastStateSensor = currentSensorState;
// Sprawdzenie przycisku resetu - resetuje tylko licznik, nie EEPROM
int currentResetState = digitalRead(resetPin);
if (currentResetState == LOW && lastStateReset == HIGH) {
delay(50); // Krótkie opóźnienie do debouncingu
if (digitalRead(resetPin) == LOW) { // Potwierdzenie, że przycisk jest wciśnięty
productCount = 0; // Reset licznika na wyświetlaczu
warningGiven = false; // Reset flagi ostrzegawczej
Serial.println("Licznik zresetowany (EEPROM nie zmieniony).");
Serial.println("Symulacja: Resetowanie lokalnego licznika...");
noTone(buzzerPin); // Wyłączenie dźwięku na wszelki wypadek
while (digitalRead(resetPin) == LOW); // Czekanie aż przycisk zostanie puszczony
}
}
lastStateReset = currentResetState;
// Aktualizacja wyświetlacza
sevseg.setNumber(productCount);
sevseg.refreshDisplay();
}