forked from bgp/feeder
add basic IR sensor support (counter)
This commit is contained in:
parent
452aab8c45
commit
71f791dcf5
104
feeder.ino
104
feeder.ino
|
@ -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()
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue