#define MOTOR_PIN 2 // Wyjście sterujące silnikiem, HIGH = silnik ON
#define BUTTON_PIN 3 // Przycisk ręczny (INPUT_PULLUP, LOW = wciśnięty)
#define ROTATION_SENSOR_PIN A0 // Czujnik obrotu / łopatek
#define LOW_LEVEL_PIN 5 // Czujnik niskiego poziomu karmy (HIGH = brak karmy)
#define EXTRA_TRIGGER_PIN 6 // Dodatkowy przycisk (INPUT_PULLUP)
#define LED_PIN 13 // LED sygnalizacyjna
#define LOW_LEVEL_OUT_PIN 7 // Wyjście: LOW = brak karmy, HIGH = karma OK
#define PORTION_PULSES 1
#define ROTATION_THRESHOLD 500
#define ROTATION_DEBOUNCE_MS 200
#define BUTTON_DEBOUNCE_MS 50
#define MAX_MOTOR_TIME_MS 20000
#define LOW_LEVEL_BLINK_MS 500
unsigned long lastRotationTime = 0;
unsigned long lastButtonTime = 0;
unsigned long motorStartTime = 0;
unsigned long lastBlinkTime = 0;
bool motorRunning = false;
bool ledState = false;
bool lastRotationState = false;
bool lastButtonState = true;
int pulseCount = 0;
void startFeeding()
{
motorRunning = true;
motorStartTime = millis();
pulseCount = 0;
digitalWrite(MOTOR_PIN, HIGH);
}
void stopFeeding()
{
motorRunning = false;
digitalWrite(MOTOR_PIN, LOW);
}
bool readRotation()
{
return analogRead(ROTATION_SENSOR_PIN) > ROTATION_THRESHOLD;
}
bool isAnyButtonPressed()
{
return !(digitalRead(BUTTON_PIN) && digitalRead(EXTRA_TRIGGER_PIN));
}
void setup()
{
Serial.begin(115200);
pinMode(MOTOR_PIN, OUTPUT);
pinMode(LED_PIN, OUTPUT);
pinMode(LOW_LEVEL_OUT_PIN, OUTPUT);
pinMode(BUTTON_PIN, INPUT_PULLUP);
pinMode(EXTRA_TRIGGER_PIN, INPUT_PULLUP);
pinMode(LOW_LEVEL_PIN, INPUT);
digitalWrite(MOTOR_PIN, LOW);
digitalWrite(LED_PIN, LOW);
digitalWrite(LOW_LEVEL_OUT_PIN, HIGH);
}
void loop()
{
unsigned long now = millis();
bool isLowLevel = !digitalRead(LOW_LEVEL_PIN); // LOW = brak karmy
bool buttonState = isAnyButtonPressed();
digitalWrite(LOW_LEVEL_OUT_PIN, isLowLevel ? LOW : HIGH);
if (motorRunning)
{
digitalWrite(LED_PIN, HIGH);
}
else if (isLowLevel)
{
if (now - lastBlinkTime >= LOW_LEVEL_BLINK_MS)
{
lastBlinkTime = now;
ledState = !ledState;
digitalWrite(LED_PIN, ledState);
}
}
else
{
digitalWrite(LED_PIN, LOW);
}
if (!motorRunning)
{
if (buttonState && !lastButtonState && now - lastButtonTime > BUTTON_DEBOUNCE_MS)
{
startFeeding();
lastButtonTime = now;
}
}
lastButtonState = buttonState;
if (motorRunning)
{
if (now - motorStartTime >= MAX_MOTOR_TIME_MS)
{
stopFeeding();
}
else
{
bool rotationState = readRotation();
if (rotationState && !lastRotationState && now - lastRotationTime > ROTATION_DEBOUNCE_MS)
{
pulseCount++;
lastRotationTime = now;
}
lastRotationState = rotationState;
if (pulseCount >= PORTION_PULSES)
{
stopFeeding();
while (isAnyButtonPressed())
{
delay(10);
}
delay(50);
}
}
}
Serial.print("MOTOR="); Serial.print(motorRunning);
Serial.print(" | PULSES="); Serial.print(pulseCount);
Serial.print(" | ROT_RAW="); Serial.print(analogRead(ROTATION_SENSOR_PIN));
Serial.print(" | ROT_LOG="); Serial.print(readRotation());
Serial.print(" | BTN="); Serial.print(digitalRead(BUTTON_PIN) == LOW);
Serial.print(" | EXT="); Serial.print(digitalRead(EXTRA_TRIGGER_PIN) == LOW);
Serial.print(" | LOW_LVL="); Serial.print(isLowLevel);
Serial.print(" | LOW_OUT="); Serial.print(digitalRead(LOW_LEVEL_OUT_PIN));
Serial.print(" | LED="); Serial.print(digitalRead(LED_PIN));
Serial.print(" | TIME="); Serial.print(motorRunning ? now - motorStartTime : 0);
Serial.println(" ms");
}