проблема Arduino Uno + RTC DS1307

Тема в разделе "Arduino & Shields", создана пользователем Crusader, 17 май 2014.

  1. ANV

    ANV Гуру

    Так сделайте. Все данные для статьи уже есть в этой теме. Только у самой Амперки продается другой модуль на DS1307.

    upd: глянул схематику модуля Амперки, там такой проблемы нет, и с подзарядкой там никто не игрался
     
    Последнее редактирование: 28 май 2014
  2. ANV

    ANV Гуру

  3. Crusader

    Crusader Нуб

    У меня на этом модуле стоит аккумуляторная батарейка. По крайней мере так на ней написано.
     
  4. Megakoteyka

    Megakoteyka Оракул Модератор

    Можно еще GPS использовать в качестве часов. Там время тоже изначально берется из атомных. Немного дешевле выйдет :)
     
  5. Crusader

    Crusader Нуб

    А у меня тем временем уже рабочая версия автоматического полива..... :)

    пока всё тупо в цикле с задержкой в секунду обрабатывается. Собираюсь прикрутить многозадачность. Может кто подскажет хороший и не сложный пример?

    спасибо.
     
  6. Максим B

    Максим B Гуру

    А у меня все стало на менюшке ((( . Вроде элементарно, но проблема с си (((. В других темах обсуждаю.
     
  7. Crusader

    Crusader Нуб

    Я тоже пока без менюшки сделал. Предпочитаю иметь сразу рабочий результат , а потом допиливать. Когда прикручу меню - могу подкинуть код. Я использую Arduino LCD KeyPad Shield.

    Кстати, народ, как лучше сохранять переменные?
    (ну например, я через меню настроил таймеры все, а после выключения их нужно заново выставлять, было бы классно , если бы арда их значения куда то записывала и при включении считывала)

    спасибо
     
  8. Megakoteyka

    Megakoteyka Оракул Модератор

    А EEPROM нам на что?
     
  9. Максим B

    Максим B Гуру

    KeyPad буду сам делать. Схемы есть. Код менюшки есть такой.

    Код (Text):
    #include <LiquidCrystal.h>

    // Initialize the library with the numbers of the interface pins
    LiquidCrystal lcd(A0, A3, 9, 10, 11, 12);

    //States for the menu.
    int currentMenuItem = 0;
    int lastState = 0;

    void setup() {
      //Set the characters and column numbers.
      lcd.begin(16, 2);
      //Print default title.
      clearPrintTitle();
    }

    void loop() {
      //Call the main menu.
      mainMenu();
    }

    void mainMenu() {
      //State = 0 every loop cycle.
      int state = 0;
      //Refresh the button pressed.
      int x = analogRead (A1);
      //Set the Row 0, Col 0 position.
      lcd.setCursor(0,0);

      //Check analog values from LCD Keypad Shield
      if (x < 100) {
        //Right
      } else if (x < 170) {
      //Up
        state = 1;
      } else if (x < 290){
      //Down
        state = 2;
      } else if (x < 600){
        //Left
      } else if (x < 390){
        //Select
        state = 3;
      }

      //If we are out of bounds on th menu then reset it.
      if (currentMenuItem < 0 || currentMenuItem > 4) {
      currentMenuItem = 0;
      }

      //If we have changed Index, saves re-draws.
      if (state != lastState) {
          if (state == 1) {
            //If Up
              currentMenuItem = currentMenuItem - 1;
              displayMenu(currentMenuItem);
          } else if (state == 2) {
            //If Down
              currentMenuItem = currentMenuItem + 1;
              displayMenu(currentMenuItem);
          } else if (state == 3) {
            //If Selected
            selectMenu(currentMenuItem);
          }
          //Save the last State to compare.
          lastState = state;
      }
      //Small delay
      delay(5);
    }

    //Display Menu Option based on Index.
    void displayMenu(int x) {
        switch (x) {
          case 1:
            clearPrintTitle();
            lcd.print ("-> Menu Option 1");
            break;
          case 2:
            clearPrintTitle();
            lcd.print ("-> Menu Option 2");
            break;
          case 3:
            clearPrintTitle();
            lcd.print ("-> Menu Option 3");
            break;
          case 4:
            clearPrintTitle();
            lcd.print ("-> Menu Option 4");
            break;
        }
    }

    //Print a basic header on Row 1.
    void clearPrintTitle() {
      lcd.clear();
      lcd.setCursor(0,0);
      lcd.print(" HACKSHED.CO.UK ");
      lcd.setCursor(0,1);
    }

    //Show the selection on Screen.
    void selectMenu(int x) {
      switch (x) {
          case 1:
            clearPrintTitle();
            lcd.print ("Selected Opt 1");
            //Call the function that belongs to Option 1
            break;
          case 2:
            clearPrintTitle();
            lcd.print ("Selected Opt 2");
            //Call the function that belongs to Option 2
            break;
          case 3:
            clearPrintTitle();
            lcd.print ("Selected Opt 3");
            //Call the function that belongs to Option 3
            break;
          case 4:
            clearPrintTitle();
            lcd.print ("Selected Opt 4");
            //Call the function that belongs to Option 4
            break;
        }
    }
     
     
  10. Cyoko

    Cyoko Нерд

    Во , это я куда надо попал походу :)
    Тоже озадачился таймерами для полива. Есть рабочий вариант ? Ну или какие наработки ? Или померла тема ?
     
  11. medic

    medic Нуб

    актуальна делаю такую-же систему, точнее версию 2,0 первый вариант сезон отработал, - полив проветривание
     
  12. Cyoko

    Cyoko Нерд

    Вы полив по таймеру делали или по датчику влажности почвы ? Если по таймеру можете скетч показать ?
     
  13. medic

    medic Нуб

    делал по таймеру, недельному, полив в одно и тоже время день настраивался отдельно есть полив или нет, время полива тоже настраивалась, начала и окончания.
    Код (Text):
    void settime()
    {
      lcd.clear();
      lcd.backlight();
      lcd.print("Vrem.nach.poliva:");
      delay(1500);
      while (read_buttons() != 1)
      {
        lcd.setCursor(0,1);
        lcd.print(htstart);
        lcd.print(":");
        lcd.print(mtstart);
        if (read_buttons() == 2)
        {
          if (htstart == 23) htstart = 0;
          else ++htstart;
        }
        if (read_buttons() == 3)
        {
          if (mtstart == 59) mtstart =0;
          else ++mtstart;
        }
        delay (200);
        lcd.setCursor(0,1);
        lcd.print("Ustanovleno    ");
      }
      delay(1500);
      lcd.clear();
      lcd.print("Vrem.konc.poliva:");
      delay(1500);
      while (read_buttons() != 1)
      {
        lcd.setCursor(0,1);
        lcd.print(htstop);
        lcd.print(":");
        lcd.print(mtstop);
        if (read_buttons() == 2)
        {
          if (htstop == 23) htstop =0;
          else ++htstop;
        }
        if (read_buttons() == 3)
        {
          if (mtstop == 59) mtstop =0;
          else ++mtstop;
        }
        delay (200);
        lcd.setCursor(0,1);
        lcd.print("Ustanovleno    ");
      }
      delay(1500);
      i=0;
      for (i=1; i<=7;i++)
      {
        lcd.clear();
        lcd.print("Polivft'li v: ");
        lcd.print(i);
        lcd.print("D");
        while (read_buttons() != 1)
        {
          lcd.setCursor(0,1);
          lcd.print(week[i]);
          if (read_buttons() == 2) week[i]=false;
          if (read_buttons() == 3) week[i]=true;
          delay (100);
        }
        delay (1500);
      }
      lcd.clear();
      lcd.print("Nach.poliv v:");
      lcd.setCursor(0,1);
      lcd.print(htstart);
      lcd.print(":");
      lcd.print(mtstart);
      delay(3500);
      lcd.clear();
      lcd.print("Zakanach.poliv:");
      lcd.setCursor(0,1);
      lcd.print(htstop);
      lcd.print(":");
      lcd.print(mtstop);
      delay(3500);
      lcd.clear();
      lcd.print("Po dniam:");
      lcd.setCursor(0,1);
      for (i=1; i<=7;i++)
      {
        if (week[i]==true)
        {
          lcd.print(i);
          lcd.print(",");
        }
      }
      delay(2500);
      lcd.clear();
      lcd.print("Nastroika");
      lcd.setCursor(0,1);
      lcd.print("zavershena!");
      delay(2500);
    }
    затем проверялись день и время полива:

    Код (Text):
    if (tread == htstart) if (mread== mtstart) if (valve == false) if (week[dread] ==true)
     {
      valveopen ();
      }
      if (tread = htstop) if (mread== mtstop) if (valve == true) if (week[dread] ==true)
      {
        valveclose();
      }
     
    Последнее редактирование: 1 окт 2014
  14. flytortoise

    flytortoise Нерд

    [​IMG]
    Прошу помочь разобраться.
    Подключаю модуль с часами: http://arduino.shopium.ua/products/arduino-ds1307-rtc-module/ к Ардуино Мини (питание модуля от Ардуино).
    Все работает пока Ардуина подключена к USB.
    Как только от USB отключаю модуль перестает считать.
    Замерил напряжения самой батареи (вынул из модуля) = 3,5 V
    На 3 ноге DS1307 при отклученном от USB напряжение = 0,68V но ПОЧЕМУ?
    Прошу помочь разобраться.
    Заранее СПС.
     
  15. Unixon

    Unixon Оракул Модератор

    А на кой им там целых 470k (на реальной плате 510k) между батареей и часами?
    Да еще и в комплекте с 1.5M на землю... делитель <censored>.
    Типа DS1307 сама не знает какой ей ток c батареи взять?

    Я бы выпаял эту сладкую парочку R6/R4 оттуда.
    Точнее R4 вообще нафиг, а R6 заменить на перемычку (резистор 0 Ом) или тупо припоя капнуть.
     
  16. flytortoise

    flytortoise Нерд

    Все равно НЕПОНЯТНО почему при отключении внешнего питания 4,28V на 3 ноге превращаются в 0,68V ?
    Если батарея 3,5 V то по расчетной формуле делителя напряжения на резисторах Uвых = Uвх х (R2 / (R1 + R2)) где Uвх = 3,5V; R2 = 1,5 MOm; R1 = 470 MOm; т.е. Uвых = 2,6V а на деле 0,68V
    Типа без внешнего питания DS1307 подсаживает по 3 ноге. Другого ничего не приходит на ум но там же МИКРО ПОТРЕБЛЕНИЕ как по даташиту!.
    Хотя при наличии внешнего питания на 3 ноге 4,28V
    Бред. Типа батарея не вытягивает по току, а DS1307 потребляет не микро а МАКСИ!
     
  17. Unixon

    Unixon Оракул Модератор

    Ток ограничен R6 на уровне (3.5V-0.68V)/510k~=5.52uA, из них через R4 в землю сливается 0.68V/1.5M=0.45uA, значит на часы приходится не меньше 5uA. От батареи оно должно есть не больше 0.8uA при 3.0V. Считаем: 0.8uA*3.0V=2.4uW, 2.4uW/0.68V=3.52uA. Почти по спеку получается, на 1.5uA отличается оценка. Часы правда в таком режиме работать не должны, так что оценка потребления может быть другой. Ну и не стоит забывать, что микросхема - это не резистор, линейно вести себя не будет, так что оценка довольно грубая. Но в линейном приближении почти сходится.
     
    Последнее редактирование: 5 апр 2015
  18. flytortoise

    flytortoise Нерд

    Отключил от всего!!!!
    Все равно на 3 ноге всего 0,68V.
    Естественно ничего не считает, а после подачи питания все по нулям!
    Куда копать не представляю!
    Разве что может сама микруха DS1307 сбоит.
    Но как проверить? Ведь когда питание внешнее подано - все ОК!
     
  19. Unixon

    Unixon Оракул Модератор

    Замкните R6.
     
  20. flytortoise

    flytortoise Нерд

    Так тогда и R4 убрать нужно!