add basic IR sensor support (counter)

This commit is contained in:
George Butskivsky 2025-05-07 13:15:06 +03:00
parent 452aab8c45
commit 71f791dcf5
1 changed files with 91 additions and 13 deletions

View File

@ -1,10 +1,10 @@
/* /*
Скетч к проекту "Спутниковая Роботорговля" Скетч к проекту "Спутниковая Роботорговля"
bgp, 2023 bgp, xenia, osmolov 2023-2025
*/ */
#define EE_RESET 26 // любое число 0-255. Измени, чтобы сбросить настройки и обновить время #define EE_RESET 26 // любое число 0-255. Измени, чтобы сбросить настройки и обновить время
#define FEED_SPEED 1500 // задержка между шагами мотора (мкс) #define FEED_SPEED 500 // задержка между шагами мотора (мкс)
#define DIRPIN 2 // d2 направление #define DIRPIN 2 // d2 направление
#define STEPPIN 3 // d3 движение #define STEPPIN 3 // d3 движение
#define BTN_PIN 4 // кнопка выдачи #define BTN_PIN 4 // кнопка выдачи
@ -15,16 +15,25 @@ bgp, 2023
#define SLEEP 9 // d9 пока не работаем - двигатель спит #define SLEEP 9 // d9 пока не работаем - двигатель спит
#define RELAY 10 // d10 ключ для отключения терминала и двигателя в ночное время #define RELAY 10 // d10 ключ для отключения терминала и двигателя в ночное время
#define BTN_PIN2 11 // кнопка настройки #define BTN_PIN2 11 // кнопка настройки
#define LEDpin 12 // питание светодиода
#define IRpin 17 // питание фототранзистора
#define IRsens 15
#define STEPPER_SPEED 250 #define STEPPER_SPEED 250
#define STEPPER_REV 800 #define STEPPER_REV 800
#define STEPPER_DELAY 1000 #define STEPPER_DELAY 500
#define GROOVE_COUNT 3 #define GROOVE_COUNT 3
#define GEAR 4*3.857 // 3.857 - это соотношение зубцов внцтреннее шестеренки и белого круга с орехами #define GEAR 4*3.857 // 3.857 - это соотношение зубцов внутреннее шестеренки и белого круга с орехами
// ========================================================= // =========================================================
#include <EEPROM.h> #include <EEPROM.h>
#include <Thread.h>
#include <ThreadController.h>
Thread IRLedThread = Thread();
Thread MotorThread = Thread();
ThreadController threadController = ThreadController();
#include "microDS3231.h" #include "microDS3231.h"
MicroDS3231 rtc; MicroDS3231 rtc;
@ -40,6 +49,11 @@ Stepper myStepper(STEPPER_REV, STEPPIN, DIRPIN);
int feedAmount = 1; 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/ // https://robotchip.ru/podklyuchenie-kupyuropriemnika-cashcode-sm-k-arduino/
int valuePulse = 10; // Стоимость одного импульса int valuePulse = 10; // Стоимость одного импульса
@ -75,6 +89,12 @@ int monitor_speed = 9600;
void setup() void setup()
{ {
IRLedThread.onRun(IRLedCount);
IRLedThread.setInterval(1);
MotorThread.onRun(FeederMotor);
MotorThread.setInterval(1);
rtc.begin(); rtc.begin();
if (EEPROM.read(0) != EE_RESET) if (EEPROM.read(0) != EE_RESET)
{ // первый запуск { // первый запуск
@ -82,7 +102,7 @@ void setup()
EEPROM.put(1, feedAmount); EEPROM.put(1, feedAmount);
rtc.setTime(BUILD_SEC, BUILD_MIN, BUILD_HOUR, BUILD_DAY, BUILD_MONTH, BUILD_YEAR); 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(STEPPIN, OUTPUT); // пин движения
pinMode(DIRPIN, OUTPUT); // пин направления pinMode(DIRPIN, OUTPUT); // пин направления
pinMode(HANDPIN, INPUT); // пин ИК датчик руки pinMode(HANDPIN, INPUT); // пин ИК датчик руки
@ -91,6 +111,10 @@ void setup()
pinMode(SLEEP, OUTPUT); // пин для отключения двигателя pinMode(SLEEP, OUTPUT); // пин для отключения двигателя
pinMode(TERM_COIN, INPUT); // прием сигнала от терминала pinMode(TERM_COIN, INPUT); // прием сигнала от терминала
pinMode(RELAY, OUTPUT); pinMode(RELAY, OUTPUT);
pinMode(LEDpin, OUTPUT);
pinMode(IRpin, OUTPUT);
digitalWrite(LEDpin, 1);
digitalWrite(IRpin, 1);
sleepTime = 60 *60 * 1000; sleepTime = 60 *60 * 1000;
@ -120,14 +144,16 @@ void loop()
String str_time = String(rtc.getHours()) + ":" + String(rtc.getMinutes()) + ":" + String(rtc.getSeconds()); String str_time = String(rtc.getHours()) + ":" + String(rtc.getMinutes()) + ":" + String(rtc.getSeconds());
String date_time = String(rtc.getDate()) + "-" + String(rtc.getMonth()) + "-" + String(rtc.getYear()); String date_time = String(rtc.getDate()) + "-" + String(rtc.getMonth()) + "-" + String(rtc.getYear());
Serial.println(str_time + " " + date_time); Serial.println(str_time + " " + date_time);
Serial.println("Feeds: " + String(feedAmount));
Serial.println("IR level: " + String(analogRead(IRsens)));
} }
if (voltage < VOLT) if (voltage < VOLT)
{ {
digitalWrite(RELAY, LOW); digitalWrite(RELAY, LOW);
delay(sleepTime); delay(sleepTime);
} }
if ((now.hour >= onTime && now.hour < offTime && voltage > VOLT)) if ((now.hour >= onTime && now.hour < offTime && voltage > VOLT && analogRead(IRsens) > 100 && analogRead(IRsens) < 1000 ))
{ //&& voltage > 10.2 { //&& voltage > 10.5 && IR sensor is good
digitalWrite(RELAY, HIGH); // работаем если время рабочее И напряжение выше минимума digitalWrite(RELAY, HIGH); // работаем если время рабочее И напряжение выше минимума
} }
else else
@ -211,15 +237,67 @@ void loop()
// выдача корма // выдача корма
void feed() void feed()
{ {
digitalWrite(SLEEP, HIGH); Serial.println("Feeding...");
delayMicroseconds(STEPPER_DELAY); int counted = 0;
for (int i = 0; i < feedAmount; i++) static uint32_t tmr = 0;
myStepper.step((STEPPER_REV * GEAR) / GROOVE_COUNT); EEPROM.put(3, counted); // Начинаем отсчет орехов на выдачу
delayMicroseconds(STEPPER_DELAY);
// oneRev(); 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(); 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() void feedByButton()
{ {