Code review

Тема в разделе "Iskra JS, Espruino, Йодо", создана пользователем JefAir, 22 апр 2017.

Метки:
  1. JefAir

    JefAir Нерд

    Всем привет.

    В скором времени собираюсь в отпуск и озадачился автономной работой своего аквариума.

    Задачи:
    1. Включать свет в 8 утра и выключать в 23 вечера.
    2. Кормить рыб в 8.15 и 22.45.

    Имеется:
    1. Iskra js
    2. Микросервопривод FS90
    3. Зуммер
    4. Реле
    5. Часы реального времени

    Для решения первой задачи приспособлено реле, а для решения второй приспособлен нехитрый механизм с сервоприводом.

    Собственно, вся механика работает, но не уверен в своем коде, так как во время тестирования, проскакивали ошибки.

    По ошибкам были:
    • нет соединения с rtc
    • out of memory
    Ошибки плавающие, но после их появления скетч окончательно переставал работать.
    Была идея раз в час, для профилактики, перезагружать искру. Но встроенная функция reset(); для этого не подошла.

    Поэтому буду признателен, если кто-нибудь взглянет на скетч и предложит какие-нибудь варианты по оптимизации.

    Код (Javascript):
    PrimaryI2C.setup({sda: SDA, scl: SCL, bitrate: 400000});
    var rtc = require('@amperka/rtc').connect(PrimaryI2C);
    var relay = require('@amperka/relay').connect(P1);
    var servo = require('@amperka/servo').connect(P2);
    var buzzer = require('@amperka/buzzer').connect(P3);

    //При включении в сеть издается звук
    function beep_one(){
        buzzer.beep(.5);
    }

    //Управление светом в заданное время (Вкл с 08 до 23) и однократный поворот серво
    function light_and_servo(){
        // задаем переменные времени, опираясь на модуль rtc
        var timestamp = rtc.getTime('unixtime') * 1000;
        var t = new Date(timestamp);
        var timeUTC = t.toUTCString();
        var rtc_hours = t.getHours();
        var rtc_minutes = t.getMinutes();
        var rtc_seconds = t.getSeconds();

        // Функция поворота серво
        function kormi(){
            servo.write(179);
            function servo0(){
                servo.write(0);
            }
            setTimeout(servo0, 500);
        }

        // Функции вкл и выкл света
        function ledOn(){
            LED1.write(1);
            relay.turnOn();
        }
        function ledOff(){
            LED1.write(0);
            relay.turnOff();
        }

        //Включение и выключение света в 8 и 23 соответственно
        if ((rtc_hours >=8) && (rtc_hours < 23)) {
            ledOn();
        } else {
            ledOff();
        }

        //Включение серво по расписанию в 8.15 и в 22.45
        if (((rtc_hours === 8) && (rtc_minutes === 15) && (rtc_seconds === 1)) || ((rtc_hours === 22) && (rtc_minutes === 45) && (rtc_seconds === 1))) {
            kormi();
        }

        // console.log(timeUTC);
        // console.log(rtc_hours, 'H');
        // console.log(rtc_minutes, 'M');
        // console.log(rtc_seconds, 'S');
    }

    setTimeout(beep_one, 1500);
    setInterval(light_and_servo, 1000);
     
     
  2. Morgan

    Morgan Гик

    Привет!

    Думаю, проблему с out of memory можно решить, если сделать setInterval(light_and_servo,1000); с большим периодом (например, раз в час), а ещё в конце функции light_and_servo вставить строчку process.memory();, чтобы запустить сборщик мусора.

    По часам пока не решили проблему.

    А так, штука получается интересная, поделитесь фоточками и описанием проекта?
     
  3. JefAir

    JefAir Нерд

    Спасибо!
    Обязательно поделюсь когда всё закончу :)
     
  4. Korobas

    Korobas Нерд

    arkadyf нравится это.
  5. ИгорьК

    ИгорьК Гуру

    Очень очень грустно. Потому как для проектов именно такого типа (незамысловатых, простых по коду, не требовательных к точности работы с временными интервалами) и предназначена плата.
     
  6. sys

    sys Злобный Буратино Модератор

    попробуйте еще и битрейт скинуть до 100000