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 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 <EEPROM.h>
#include <Thread.h>
#include <ThreadController.h>
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()
{