From 71f791dcf5a11d883f9481adcfaa263cc9d81869 Mon Sep 17 00:00:00 2001 From: George Butskivsky Date: Wed, 7 May 2025 13:15:06 +0300 Subject: [PATCH] add basic IR sensor support (counter) --- feeder.ino | 104 ++++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 91 insertions(+), 13 deletions(-) diff --git a/feeder.ino b/feeder.ino index 002762d..43ac2a4 100644 --- a/feeder.ino +++ b/feeder.ino @@ -1,10 +1,10 @@ /* Скетч к проекту "Спутниковая Роботорговля" -bgp, 2023 + bgp, xenia, osmolov 2023-2025 */ #define EE_RESET 26 // любое число 0-255. Измени, чтобы сбросить настройки и обновить время -#define FEED_SPEED 1500 // задержка между шагами мотора (мкс) +#define FEED_SPEED 500 // задержка между шагами мотора (мкс) #define DIRPIN 2 // d2 направление #define STEPPIN 3 // d3 движение #define BTN_PIN 4 // кнопка выдачи @@ -15,16 +15,25 @@ bgp, 2023 #define SLEEP 9 // d9 пока не работаем - двигатель спит #define RELAY 10 // d10 ключ для отключения терминала и двигателя в ночное время #define BTN_PIN2 11 // кнопка настройки +#define LEDpin 12 // питание светодиода +#define IRpin 17 // питание фототранзистора +#define IRsens 15 #define STEPPER_SPEED 250 #define STEPPER_REV 800 -#define STEPPER_DELAY 1000 +#define STEPPER_DELAY 500 #define GROOVE_COUNT 3 -#define GEAR 4*3.857 // 3.857 - это соотношение зубцов внцтреннее шестеренки и белого круга с орехами +#define GEAR 4*3.857 // 3.857 - это соотношение зубцов внутреннее шестеренки и белого круга с орехами // ========================================================= #include +#include +#include +Thread IRLedThread = Thread(); +Thread MotorThread = Thread(); +ThreadController threadController = ThreadController(); + #include "microDS3231.h" MicroDS3231 rtc; @@ -40,6 +49,11 @@ Stepper myStepper(STEPPER_REV, STEPPIN, DIRPIN); int feedAmount = 1; +byte empty_signal; // храним уровень пустого сигнала +int sens_signal, last_sens_signal; +boolean groove_flag = false; +int grooveCounted = 0; + // https://robotchip.ru/podklyuchenie-kupyuropriemnika-cashcode-sm-k-arduino/ int valuePulse = 10; // Стоимость одного импульса @@ -75,6 +89,12 @@ int monitor_speed = 9600; void setup() { + IRLedThread.onRun(IRLedCount); + IRLedThread.setInterval(1); + + MotorThread.onRun(FeederMotor); + MotorThread.setInterval(1); + rtc.begin(); if (EEPROM.read(0) != EE_RESET) { // первый запуск @@ -82,7 +102,7 @@ void setup() EEPROM.put(1, feedAmount); rtc.setTime(BUILD_SEC, BUILD_MIN, BUILD_HOUR, BUILD_DAY, BUILD_MONTH, BUILD_YEAR); } - EEPROM.get(1, feedAmount); + feedAmount = EEPROM.read(1); pinMode(STEPPIN, OUTPUT); // пин движения pinMode(DIRPIN, OUTPUT); // пин направления pinMode(HANDPIN, INPUT); // пин ИК датчик руки @@ -91,6 +111,10 @@ void setup() pinMode(SLEEP, OUTPUT); // пин для отключения двигателя pinMode(TERM_COIN, INPUT); // прием сигнала от терминала pinMode(RELAY, OUTPUT); + pinMode(LEDpin, OUTPUT); + pinMode(IRpin, OUTPUT); + digitalWrite(LEDpin, 1); + digitalWrite(IRpin, 1); sleepTime = 60 *60 * 1000; @@ -120,14 +144,16 @@ void loop() String str_time = String(rtc.getHours()) + ":" + String(rtc.getMinutes()) + ":" + String(rtc.getSeconds()); String date_time = String(rtc.getDate()) + "-" + String(rtc.getMonth()) + "-" + String(rtc.getYear()); Serial.println(str_time + " " + date_time); + Serial.println("Feeds: " + String(feedAmount)); + Serial.println("IR level: " + String(analogRead(IRsens))); } if (voltage < VOLT) { digitalWrite(RELAY, LOW); delay(sleepTime); } - if ((now.hour >= onTime && now.hour < offTime && voltage > VOLT)) - { //&& voltage > 10.2 + if ((now.hour >= onTime && now.hour < offTime && voltage > VOLT && analogRead(IRsens) > 100 && analogRead(IRsens) < 1000 )) + { //&& voltage > 10.5 && IR sensor is good digitalWrite(RELAY, HIGH); // работаем если время рабочее И напряжение выше минимума } else @@ -211,15 +237,67 @@ void loop() // выдача корма void feed() { - digitalWrite(SLEEP, HIGH); - delayMicroseconds(STEPPER_DELAY); - for (int i = 0; i < feedAmount; i++) - myStepper.step((STEPPER_REV * GEAR) / GROOVE_COUNT); - delayMicroseconds(STEPPER_DELAY); - // oneRev(); + Serial.println("Feeding..."); + int counted = 0; + static uint32_t tmr = 0; + EEPROM.put(3, counted); // Начинаем отсчет орехов на выдачу + + feedAmount = EEPROM.read(1); + //Serial.println("IR sens: " + String(analogRead(IRsens))); + //Serial.println("Groove amount: " + String(feedAmount)); + + for (int i = 0; i < feedAmount; i++){ + tmr = millis(); + while (1) { + if (millis() - tmr > 10000) + { + motorRev(); + tmr = millis(); + } + digitalWrite(SLEEP, HIGH); + MotorThread.run(); + IRLedThread.run(); + grooveCounted = EEPROM.read(3); + if (grooveCounted > counted) { + counted = grooveCounted; + //Serial.println("Now " + String(counted) + " grooves"); + delayMicroseconds(STEPPER_DELAY); + break; + } + } + if (grooveCounted >= feedAmount) + break; + } + disableMotor(); } +void FeederMotor() +{ + //myStepper.step((STEPPER_REV * GEAR) / GROOVE_COUNT); + myStepper.step(150); +} + +void motorRev() +{ + myStepper.step(-((STEPPER_REV * GEAR) / GROOVE_COUNT)); +} + +void IRLedCount() +{ + grooveCounted = EEPROM.read(3); + + for (int i=0; i<50; i++) + { + //Serial.println(String(analogRead(IRsens))); + if (analogRead(IRsens) > 980) { + //Serial.println(grooveCounted++); + EEPROM.put(3, grooveCounted++); + break; + } + } +} + // кормежка по кнопке void feedByButton() {