В настоящее время я пытаюсь построить автоматическое устройство подачи c fi sh; в основном он просто включает сервопривод для выпуска еды каждые 24 часа. Я использую следующие компоненты:
- Arduino Uno
- MicroServo 9g
- 9 В Аккумулятор (для питания)
Я бы Я хотел бы уточнить, что я новичок в Arduino, и я только что понял, что Arduino Uno не будет работать в течение дня с батареей 9v. Поэтому я посмотрел онлайн и обнаружил, что могу перевести его в спящий режим с помощью WatchDog. Однако, я в настоящее время отлаживаю это, поскольку это продолжает печатать перевернутое? и / или случайные символы в последовательном мониторе. Я хотел бы знать, работает ли мой код и / или как я могу решить эту проблему. Большое спасибо за ваш вклад! Вот мой код:
#include <Servo.h>
#include <avr/interrupt.h>
#include <avr/wdt.h>
#include <avr/power.h>
#include <avr/sleep.h>
#include <avr/io.h>
//innitialize all variables
Servo myservo;
unsigned long timenow = 0;
unsigned long timebefore = 0;
unsigned long timebetween = 0;
const int buttonPin = 2;
const int servoDelay = 1500;
const int feedDelay = 3000;
const unsigned long dayTime = 86400000;
const unsigned long feedTime = 17000 -(2*servoDelay) - feedDelay;
const unsigned long feedCycle = (feedTime/8000)+1;
bool feedstart = false;
int buttonState = 0;
unsigned long nbr_remaining = 0 ;
ISR(WDT_vect){
wdt_reset();
}
void setup() {
// attaching servo to digital input/output 9
myservo.attach(9);
myservo.write(0);
Serial.begin(9600);
//button setup
pinMode(buttonPin, INPUT);
digitalWrite(buttonPin, HIGH);
configure_wdt();
}
void loop() {
buttonState = digitalRead(buttonPin);
if(buttonState == LOW){
feedstart = true;
}
if(feedstart){
dispenseFood();
Serial.println("Print here!");
sleepControl(feedCycle);
}
}
void configure_wdt(){
cli();
MCUSR = 0;
WDTCSR |= 0b00011000;
WDTCSR = 0b01000000 | 0b100001;
sei();
}
void sleepControl(unsigned long ncycles){
nbr_remaining = ncycles;
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
power_adc_disable();
while (nbr_remaining > 0){
sleep_mode();
sleep_disable();
nbr_remaining = nbr_remaining - 1;
}
power_all_enable();
}
void dispenseFood(){
myservo.write(90);
delay(servoDelay);
delay(feedDelay);
myservo.write(0);
delay(servoDelay);
}
Кроме того, если у вас есть какие-либо советы о том, как уменьшить энергопотребление, пожалуйста, сообщите мне тоже! Большое спасибо за вашу помощь!