Хранение данных в eeprom

Тема в разделе "Arduino & Shields", создана пользователем ДеКодер, 13 апр 2020.

  1. В пятом сообщении я написал:
    Подсветке не нужно знать через сколько секунд ей нужно зажечься или погаснуть
     
  2. parovoZZ

    parovoZZ Гуру

    У процессора другое представление. Чтобы эффективно программировать, необходимо мыслить как процессор.
    Для операции с минутами необходимо помнить, что переполнение происходит на 60 минуте. Освободившийся час необходимо добавить или позаимствовать у часовой переменной. При операциях в минутах об этом даже голова не болит.
     
    ДеКодер нравится это.
  3. b707

    b707 Гуру

    Паровоз, отстань от него - не видишь, человек давно все решил и спрашивает только чтоб поспорить. пусть делает как хочет...
     
  4. Спорить я не хочу, и понимаю про что вы говорите.
     
  5. Asper Daffy

    Asper Daffy Иксперд

    Вот и я о том же. А так просто одно число бы сравнили. Впрочем, дело Ваше - делайте как хотите.

    Кстати, iarduino_RTC написана крайне неаккуратно. Вас не смущают многочисленные предупреждения компилятора? Я бы от таких библиотек подальше держался.
     
    Andrey12 и ДеКодер нравится это.
  6. Я понял про что вы говорите. Не кидайтесь тапками ))
    Использую TinyRTC 1.1 сегодня вот такую штуку лицезрел
    Screenshot.jpg
    Отображаю в часах и минутах - 25 часов :D и дата вчерашняя, походу что-то не то делаю:cool:
     
  7. Чудеса чудесатые. Вытащил батарейку, часы нормально стали работать, никаких 25 часов в сутках нет. Решил проблему с "будильником", никаких извращений с переводом в секунды. Если нужно, могу выложить решение.
     
  8. вот и часть кода, реализация очень простая, не нужно велосипедить с переводом в секунды (не секундомер же)
    Код (C++):
    // период действия, интервал в часах и минутах
    struct Validity{
      uint8_t hourBegin;
      uint8_t hourEnd;
      uint8_t minutsBegin;
      uint8_t minutsEnd;
    };

    class LedLine{
      private:
        // лампа горит
        bool isOn = false;
        // порт вывода
        byte portOut;
        // имя порта
        String portName;
        // инвертирует состояние
        void InverseState(){
          isOn = !isOn;
        }
       
      public:
        // активный период т.е. период в течение которого лампа активна
        Validity ActivePeriod;
        // проверка состояния
        void CheckState(){
            byte tmp_hours = myTimer.Hours;
            byte tmp_minuts = myTimer.minutes;
           
            if((ActivePeriod.hourBegin <= tmp_hours && tmp_hours <= ActivePeriod.hourEnd) &&
            (ActivePeriod.minutsBegin <= tmp_minuts && tmp_minuts <= ActivePeriod.minutsEnd)){
                isOn = true;
                myBluetooth.println(portName + " : " + "Active");
            }
            else{
                isOn = false;
                myBluetooth.println(portName + " : " + "Deactive");
            }
        }
        // переключение "выключателя"
        void SwitchLed(){      
            if(isOn){
                digitalWrite(portOut, HIGH);
            }
            else{
                digitalWrite(portOut, LOW);
            };
        }
       
        LedLine(byte port, String name_port){
            portOut = port;
            portName = name_port;
        }
       
    };

    void loop(){
    .....
    if(millis()%10000 == 0){
          // проверка состояния
          myBluetooth.print("Check status: ");
          myBluetooth.println(myTimer.gettime("H:i d-m-Y"));
          Led3000.CheckState();
          Led5000.CheckState();
          Led6000.CheckState();
         
          Led3000.SwitchLed();
          Led5000.SwitchLed();
          Led6000.SwitchLed();
      }
    .....
    }
     
  9. Asper Daffy

    Asper Daffy Иксперд

    Да, замечательный код. Только не работает ни хрена, но это и не важно - первый закон Скотта ещё никто не отменял!
     
    Последнее редактирование: 28 апр 2020
    ДеКодер нравится это.
  10. С чего вы взяли ? у меня все работает, выложил часть кода (полностью не стал выкладывать), но основную концепцию указал, условие в методе CheckState() отрабатывает как следует. Пиздеть все молодцы :)
     
  11. akl

    akl Гуру

    if(millis()%10000 == 0){
    чет мне кажется оно может подглючить
    если например цикл сильно меньше 1 миллисекунды, то оно будет срабатывать много раз подряд пока эта миллисекунда идет.
    а если например цикл больше 1 миллисекунды (мало ли что там еще делается), то оно может вообще пропустить срабатывание
     
  12. Asper Daffy

    Asper Daffy Иксперд

    Как с чего? с Вашего кода.
    Это Вам показалось потому, что Вы не умеете ни читать коды, ни тестировать их.
    Вот это условие?
    Код (C++):
    if((ActivePeriod.hourBegin<= tmp_hours && tmp_hours <= ActivePeriod.hourEnd)&&
           (ActivePeriod.minutsBegin<= tmp_minuts && tmp_minuts <= ActivePeriod.minutsEnd)){
    Ну-ну.

    Давайте посмотрим, как оно сработает, если, например, активный период с 14:45 до 15:20 ? Ну, как, работает? Или, вторая строка неверна никогда, а стало быть всё условие неверно никогда? А случай 14:20 - 15:25 ещё смешнее. Сами разберётесь в какие именно шестиминутные отрезки оно вдруг начнёт срабатывать, а когда будет молчать как рыба об лёд, или разжёвывать надо?

    Вы когда сравниваете два десятичных числа, Вы тоже сравниваете отдельно десятки и единицы и совмещаете по И? Нет? Ну, а чем 60-ричные числа хуже? За что Вы их так обижаете?
    Мон шер ами, я по каким-то (неизвестным мне) причинам решил помочь Вам разобраться. Но вот такая реакция мне не нравится. Я это называю хамством. Если я увижу (или мне померещится) что-то подобное ещё раз, я просто пошлю Вас на, и разбирайтесь сами в своих глюках работающих кодах. Договорились?
     
    ДеКодер нравится это.
  13. Вооо, спасибо за конструктивный ответ, сразу бы так обосновали, с примером
     
  14. Признаю, наговнокодил, но не хотел задеть чьи-то чувства :)
    Переделал на такой код:
    Код (C++):
    class LedLine{
      private:
        // лампа горит
        bool isOn = false;
        // порт вывода
        byte portOut;
        // имя порта
        String portName;
        // инвертирует состояние
        void InverseState(){
          isOn = !isOn;
        }
        // Перевод часов и минут в секунды
        int ToSeconds(byte hours, byte minuts){
            int result = (hours * 3600) + (minuts * 60);
           
            return result;
        }
       
      public:
        // активный период т.е. период в течение которого лампа активна
        Validity ActivePeriod;
        // проверка состояния
        void CheckState(){
            int tmp_seconds_start = ToSeconds(ActivePeriod.hourBegin, ActivePeriod.minutsBegin);
            int tmp_seconds_end = ToSeconds(ActivePeriod.hourEnd, ActivePeriod.minutsEnd);
            int tmp_seconds_current = ToSeconds(myTimer.Hours, myTimer.minutes);
           
            if(tmp_seconds_start < tmp_seconds_current && tmp_seconds_current < tmp_seconds_end){
                isOn = true;
                myBluetooth.println(portName + " : " + "Active");
            }
            else{
                isOn = false;
                myBluetooth.println(portName + " : " + "Deactive");
            }
        }
     
  15. Asper Daffy

    Asper Daffy Иксперд

    А что, интервалы с переходом через полночь запрещены? Если нет, то такой подход даже идейно работать не будет. Догадайтесь почему.

    Если же таких интервалов быть не может, то идейно, может и ничего, но на практике этот код не рабочий. По крайней мере на 8-битных ардуинах типа Уны/Наны и на всех прочих 8-битках он точно работать не будет.

    Слушайте, Вам же говорили как сделать правильно. Если старая как сам Си библиотека работы во временем, которая есть везде и даже описана в стандарте языка! Она всё это отлично делает. Чего Вам так неймётся чего-нибудь наколхозить? Тем более, что Вы не особо-то умеете это делать. Чего не воспользоваться готовым системным решением?
     
  16. они не нужны, ночью нужно спать :)
    Перевод в секунды нужен лишь для того, чтобы сделать "отсечки времени" - начала и окончания интервала, это самый верный способ определить "позицию" текущего времени относительно интервала
    уже проверяю, лампочки мигают как им положено во время
     
  17. Asper Daffy

    Asper Daffy Иксперд

    Ну я же Вам говорил, что Вы не умеете тестировать.

    Я никогда не говорю сразу в чём проблема (Вы, наверное заметили) потому что уважаю собеседника и всегда оставляю ему шанс разобраться самому. Но, если я говорю, что грабли - значит грабли - даже не сомневайтесь. Давайте, если Вы не поняли где они спрятаны, Вы будете спрашивать, а не спорить.

    Вот Ваша функция:
    Допустим время 20:45. Каков должен быть результат? 20 * 3600 + 45 * 60 = 74700. Так?

    А теперь запустите, и выведите в Serial результат, который выдаёт Ваша функция. Уверяю Вас, он Вам не понравится (ну, если Вы на Uno/Nano/Mega или ещё на чём восьмибитном).
     
    ДеКодер, SergeiL и Daniil нравится это.
  18. Спасибо большое, что уделяете мне время, Ну кто не мечтает написать свою ось :) ? Буквально недавно была хорошая статья на хабре про "велосипеды". Тестировать не особо получается, нет модульных тестов (как в других областях программирования на ЯВУ). Вечерком конечно попробую, с выводом информации в Serial и отпишусь, но полагаю, тут банальное переполнение при преобразовании, т.к. целочисленное (int) максимальным может быть 32767.
     
  19. SergeiL

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

    Тут не тестировать нужно, тут нужно думать на этапе написания кода. ;)
     
  20. Видимо из-за этого и работал код, что "переполнение" у всех одинаковое, т.к. тестировал в веченее время