Запуск функции по расписанию

Тема в разделе "Iskra JS, Espruino, Йодо", создана пользователем Joshua, 16 май 2016.

  1. Joshua

    Joshua Нерд

    Всем доброго времени суток.
    Решил попробовать собрать автоматику для аквариума с помощью iskraJS.
    На данный момент задумка такая:
    включение-отключение подсветки по расписанию;
    ежедневное срабатывание сервопривода на открытие-закрытие заслонки в кормушке;
    контроль температуры воды. при достижении нижнего или верхнего предела - СМС или email информирование.

    по модулям будут нужны термодатчик, управляющее реле для внешней подсветки, серво, WiFi модуль и RTC

    какой модуль wifi лучше взять для подключение и как реализовать запуск по расписанию?
     
    Последнее редактирование: 16 май 2016
  2. r1000ru

    r1000ru JS-технократ

    Добрый день.

    Wi-Fi модуль можно взять любой, например популярный ESP8266. Подключать можно напрямую, обвязка не требуется, так как на пинах 3.3 вольта. Регулятор на 3.3 вольта на Iskra JS тоже достаточно мощный, чтобы Wi-Fi работал без сбоев.

    Для запуска по таймеру, учитывая, что операции не требуют реального времени, имеет смысл использовать функцию setInterval с частотой 1000 миллисекунд (1 секунда) и банально в колбэке сравнивать текущее время и дату методом getTime c таблицей заданий, выполняемых по времени. Так же не забудьте поставить галочку в IDE: Communication->Set Current Time (установка времени с компьютера). Кстати время устанавливается в UTC без учета часового пояса. В идеале было бы здорово раз в сутки или при запуске получать время с SNTP сервера.
     
    Joshua нравится это.
  3. Joshua

    Joshua Нерд

    если использовать IDE Espruino
    вопрос открывания-закрывания решается прямо по мануалу.
    Код (Javascript):
    var servo= require("servo").connect(P13);


    var servoToggle = setInterval(function() {
      servo.move(0, 800, function() {
      sservo.move(1, 800);
    });

    }, 3000);

    а если использую IDE от Амперки, натыкаюсь на такие грабли:
    Код (Javascript):
    var servo = require('@amperka/servo').connect(P13).write(0);
    var setServo1 = setInterval(function () {
        servo.write(90);
        var setServo2 = setInterval(function () {
            servo.write(0);

        }, 1000);
       
    }, 1000);
    setInterval один в другом вызывают рассинхронизацию в работе, а других способов возврата в нулевое положение я не нашел

    Сорри за нубские вопросы
     
  4. r1000ru

    r1000ru JS-технократ

    А зачем вы запускаете столько интервалов? Они же множатся при каждом срабатывании основного, отсюда и рассинхронизация. Вот к примеру код, который будет двигать серву раз в 5 секунд на 90 градусов, закрывая через секунду.
    Код (Javascript):
    var servo = require('@amperka/servo').connect(P13);

    // Закроем по умолчанию
    servo.write(0);

    // Заставляем работать каждые 5 секунд
    setInterval(function() {
      // Повернули серву
      servo.write(90);
      // Через 1 секунду...
      setTimeout(function() {
        // закрыли вернули серву на исходную
        servo.write(0);
      }, 1000);
    }, 5000);
     
     
    Joshua нравится это.
  5. Joshua

    Joshua Нерд

    Спасибо, я тормозил с таймаутом. не знал как правильно описать.
    теперь буду пробовать таймер прикручивать и условия для срабатывания по времени

    и такой еще момент - если подключить к компу и залить программу - то все работает. но если отключить питание и подключить по новой - то не стартует
    насколько я понял в IDE за это отвечает пункт "Save on send" в разделе communication, но если его отмечаю, во время загрузки появляется ошибка в консоли:
    Prompt not detected - uload failed. Trying to recover...

    что может быть не так?
     
    Последнее редактирование: 18 май 2016
  6. r1000ru

    r1000ru JS-технократ

    С подобным поведением тоже столкнулся, причина не понятна, но постараемся исправить в ближайшем обновлении прошивки. Для того чтобы заработало сохранение на текущей версии - просто перезалейте прошивку из Settings->Flasher->Flash Firmware.

    Галку Save on Send рекомендую снять. Во первых запись вашего кода занимает время и это не удобно при отладке, во вторых тратятся циклы стирания/записи микроконтроллера. Он конечно рассчитан на большое количество, но зачем их тратить, если можно обойтись без этого? Сохранить загруженную прошивку можно командой save();, введя ее в консоле
     
  7. troiden2k

    troiden2k Нерд

    А как заставить этот код выполниться 2 или 3 раза подряд и остановиться? Отправив систему в глубокий сон до следующей активации, например, с помощью ик пульта.
     
    Последнее редактирование: 27 янв 2021