Всем привет! Задумал сделать кормушку для котэ. Задача чтобы она по времени (4 раза в сутки) сама давала корм. Также, есть кнопка для подачи корма, если нужно дополнительно покормить. Я заливаю код, выставляя время. Потом перезаливаю код, без метода setDS3231time(00,9,13) и время работает коректно. После залития кода кнопка работает отлично и при первом времени кормления сервопривод отрабаываю. Но последующие кормления не срабатывают почему то. Я заметил интересную деталь. В коде есть метод timeCheck() который дает мне возможность подключиться к com порту и проверить время. Так вот, когда я подключаю шнур к ардуино нано, на плате начинает мигать синий светодит, раз в секунду (это отрабатывает этот метод). Но после того как я отключу шнур, диод перестает мигать через 1 мин 20 сек и потом ни кнопка, не запланированное кормление не срабатывают. В чем может быть проблема? Код (C++): #include <Wire.h> #include <DS3231.h> #define DS3231_I2C_ADDRESS 0x68 DS3231 rtc(SDA, SCL); byte decToBcd(byte val) // Convert normal decimal numbers to binary coded decimal { return( (val/10*16) + (val%10) ); } byte bcdToDec(byte val) // Convert binary coded decimal to normal decimal numbers { return( (val/16*10) + (val%16) ); } #include <Servo.h> Servo feedServo; #define ctsPin 3 // button #define PIN_SERVO 5 Time t; int feed1hour = 01; int feed1minute = 00; int feed2hour = 2; int feed2minute = 00; int feed3hour = 3; int feed3minute = 00; int feed4hour = 4; int feed4minute = 00; int feedQty = 4; int feedRate = 800; //a pwm rate the triggers forward on the servo 75 int feedReversal = 300; void setup(){ Serial.begin(9600); rtc.begin(); //setDS3231time(00,9,13); // set the initial time here: DS3231 seconds, minutes, hours, day, date, month, year pinMode(ctsPin, INPUT); pinMode(LED_BUILTIN, OUTPUT); // NEW Команда для адекватного реагирования светодиода //pinMode(button_pin, INPUT); // Инициализируем цифровой вход/выход в режиме входа. feedServo.attach(5); // привязываем сервопривод к аналоговому выходу 5 } void setDS3231time(byte second, byte minute, byte hour) { // sets time and date data to DS3231 Wire.beginTransmission(DS3231_I2C_ADDRESS); Wire.write(0); // set next input to start at the seconds register Wire.write(decToBcd(second)); // set seconds Wire.write(decToBcd(minute)); // set minutes Wire.write(decToBcd(hour)); // set hours Wire.endTransmission(); } void loop() { t = rtc.getTime(); timeCheck(); //Manual feed button int ctsValue = digitalRead(ctsPin); if (ctsValue == HIGH){ feed(); digitalWrite(LED_BUILTIN, HIGH); } else { digitalWrite(LED_BUILTIN, LOW); } // CHECK FEEDING TIME AND FEED IF MATCHED if (t.hour == feed1hour && t.min == feed1minute && t.sec == 0) { // if I dont' check seconds are zero feed(); // then it'll feed continuously for 1 minute! } if (t.hour == feed2hour && t.min == feed2minute && t.sec == 0) { feed(); } if (t.hour == feed3hour && t.min == feed3minute && t.sec == 0) { // if I dont' check seconds are zero feed(); // then it'll feed continuously for 1 minute! } if (t.hour == feed4hour && t.min == feed4minute && t.sec == 0) { feed(); } } void feed() { feedServo.attach(PIN_SERVO); for(int i = 0; i<10; i++) { feedServo.write(360); delay(1000); feedServo.write(10); delay(1200); } feedServo.write (60); feedServo.detach(); } void timeCheck (){ Serial.print(t.hour); Serial.print("-"); Serial.print(t.min); Serial.print("-"); Serial.println(t.sec); delay (1000); }
Мда ... роботизированная кормушка, потом робот – поглаживатель и почёсыватель за ухом, потом робот – слушатель мурлыканья ... но если всё это делать не самому, то нахрена вообще иметь кота?
Alex20280 Почему не захотели использовать будильники DS3231? Зачем нужно проверять время? Эти RTC имеют достаточную точность хода. Шнур прям в COM-порт, или все же в USB?
А что это такое? Вы уверены что проверка времени всегда совпадает с заданным временем вплоть до секунды?
LED_BUILTIN это дефайн встроенного в любую плату светодиода в среде Arduino IDE (работает на любой платформе)
если коротко - выкиньте из ЛУП вызов timeCheck() и все должно работать правильно. Для того чтобы ваши условия кормления срабатывали - loop() должен оборачиваться быстро. А процедура timeCheck() замедляет вашу программу в тысячи раз
ds3231 содержит 2 будильника, если кормлений больше чем 2 в день то смысла нет в будильниках. Только если их программно "перезаводить" каждый раз после предидущего кормления, но это изврат какойто.