Кормушка для котэ

Тема в разделе "Arduino & Shields", создана пользователем Alex20280, 8 окт 2020.

Метки:
  1. Alex20280

    Alex20280 Нерд

    Всем привет!

    Задумал сделать кормушку для котэ.
    Задача чтобы она по времени (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);
    }
     
  2. Asper Daffy

    Asper Daffy Иксперд

    Мда ... роботизированная кормушка, потом робот – поглаживатель и почёсыватель за ухом, потом робот – слушатель мурлыканья ... но если всё это делать не самому, то нахрена вообще иметь кота?
     
    Airbus нравится это.
  3. fogary

    fogary Гик

    Alex20280

    Почему не захотели использовать будильники DS3231?
    Зачем нужно проверять время? Эти RTC имеют достаточную точность хода.
    Шнур прям в COM-порт, или все же в USB?
     
  4. Airbus

    Airbus Радиохулиган Модератор

  5. Daniil

    Daniil Гуру

    А что это такое?
    Вы уверены что проверка времени всегда совпадает с заданным временем вплоть до секунды?
     
  6. issaom

    issaom Гуру

    LED_BUILTIN это дефайн встроенного в любую плату светодиода в среде Arduino IDE (работает на любой платформе)
     
    Daniil нравится это.
  7. b707

    b707 Гуру

    если коротко - выкиньте из ЛУП вызов timeCheck() и все должно работать правильно.

    Для того чтобы ваши условия кормления срабатывали - loop() должен оборачиваться быстро. А процедура timeCheck() замедляет вашу программу в тысячи раз
     
  8. Airbus

    Airbus Радиохулиган Модератор

  9. Alex20280

    Alex20280 Нерд

    Спасибо, попробую.
     
  10. Alex20280

    Alex20280 Нерд

    В USB подключаю.
    По-поводу будильника не знаю. Нужно посмотреть.
     
  11. fogary

    fogary Гик

    Если не ошибаюсь, сразу после подключения к USB-порту - Ардуино перезагружается.
     
  12. Andrey12

    Andrey12 Гик

    ds3231 содержит 2 будильника, если кормлений больше чем 2 в день то смысла нет в будильниках. Только если их программно "перезаводить" каждый раз после предидущего кормления, но это изврат какойто.
     
    issaom нравится это.
  13. fogary

    fogary Гик

    Думаете, что будильник сломается или Ардуино умрет от натуги?
     
    Feofan нравится это.
  14. parovoZZ

    parovoZZ Гуру

    то котик ожиреет.
     
  15. Airbus

    Airbus Радиохулиган Модератор

  16. Airbus

    Airbus Радиохулиган Модератор

    [​IMG]