Всем привет. В скором времени собираюсь в отпуск и озадачился автономной работой своего аквариума. Задачи: 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);
Привет! Думаю, проблему с out of memory можно решить, если сделать setInterval(light_and_servo,1000); с большим периодом (например, раз в час), а ещё в конце функции light_and_servo вставить строчку process.memory();, чтобы запустить сборщик мусора. По часам пока не решили проблему. А так, штука получается интересная, поделитесь фоточками и описанием проекта?
Очень очень грустно. Потому как для проектов именно такого типа (незамысловатых, простых по коду, не требовательных к точности работы с временными интервалами) и предназначена плата.