Доброго времени суток. прошу прощения что немного не в тему, но вроде как по тематике ближе всего проблема в следующем: накидал проект для мониторинга аквариума с использованием того что в теме разделил на два модуля. 1-ый - управление кнопками и реле 2-ой - вывод инфо на дисплей 1-ый: Код (Javascript): var gpiobutton = require('gpiobutton'); var buttonSpec = {gpiono:19}; var buttonSpec2 = {gpiono:18}; var buttonL = new gpiobutton.button(buttonSpec); var buttonF = new gpiobutton.button(buttonSpec2); var onoff = require('onoff'); var Gpio = onoff.Gpio, relayIn1 = new Gpio(2,'out' ); relayIn2 = new Gpio(6,'out' ); buttonL.on("buttonpress", function(event) { var value = (relayIn1.readSync()+1) % 2; relayIn1.write(value, function() { // console.log("Changed LED state to: " + value); }); }); buttonF.on("buttonpress", function(event) { var value = (relayIn2.readSync()+1) % 2; relayIn2.write(value, function() { // console.log("Changed LED state to: " + value); }); }); 2-ой: Код (Javascript): //read gpio state // var valueL=1; var valueF=1; var onoff = require('onoff'); var Gpio = onoff.Gpio, relayIn1 = new Gpio(2,'out' ); relayIn2 = new Gpio(6,'out' ); var light = 'Light ON '; var fito = 'Fito ON' //LCD part var ip = require('ip'); var ds18b20 = require('ds18b20'); var LCD = require('lcdi2c'); var sleep = require('sleep'); var lcd = new LCD( 0, 0x27, 20, 4 ); //lcd.createChar(0,[0x18,0x18,0x3,0x4,0x4,0x4,0x3] ); var now = 0; lcd.on(); //lcd.setBacklight(); lcd.clear(); lcd.home(); function run() { now = new Date(); var time1 = now.toLocaleTimeString([], {hour: '2-digit', minute:'2-digit', hour12: false}); var date1 = now.toLocaleDateString([], {month: 'long',day: 'numeric', year: 'numeric'}); valueL = (relayIn1.readSync()) % 2; valueF = (relayIn2.readSync()) % 2; // console.log('value= '+value) if (valueL==0){ light = 'Light ON '; } else light = 'Light OFF'; if (valueF==0){ fito = 'Fito ON '; } else fito = 'Fito OFF'; //Print and check for errors. If errors found, shut down gently. lcd.println( date1 + ' ' + time1 + ' ', 1 ); lcd.println( light + ' | ' + fito, 2 ); lcd.println( 'Aqua Temp C = '+ ds18b20.temperatureSync('28-041663a8bcff') + ' ' , 3 ); var myip=ip.address(); lcd.println( 'IP= '+myip, 4 ); setTimeout(() => run(), 100); }; run(); проблема в том, что по истечении 3-4 часов работы модуль дисплея выгружается из памяти. помогите понять почему
Вы на Raspberry... на JS. Простите, но не понятно. А как определяете, что модуль выгружается. Смотрите так?: Код (Bash): ps -A | grep <имя процесса> Честно не могу понять... в какой среде выполняется?
определяю просто. htop и по процессам модуля, который отвечает за индикацию нет в активный. остается только отвечающий за кнопки-реле
А если в этом: Код (Javascript): setTimeout(() => run(), 100); Вы увеличите интервал... повторение ошибки будет?
попробую до секунды подниму, скажу через несколько часов, что получится я на setTimeout перешел из-за того, что она не должна, по логике, сохранять данных и затирает все что в ней выполнялось после выполнения при использовании setInterval работало максимум 2 часа при любой задержке
И ещё интресно как поведёт себя вот этот кусок: Код (Javascript): var myip=ip.address(); lcd.println( 'IP= '+myip, 4 ); Если сеть на секунду отвалится... надеюсь у вас статический IP?
это только вывод. не будет сети - укажет 127.0.0.1 после появления - возьмет полученный ып и отдаст на дисплей для чего сделано: в будущем планирую поднять веб сервер и нужно будет знать адрес, куда стучаться для контроля и настроек
В том-то и дело, что я не знаю node.js... потому и спросил. Ранее... когда применял C# (под виндой ещё)... применял такое: Код (Javascript): try { ... тут код ..... } catch { ... тут обрабатывал ошибочные ситуации ... иначе программа обваливалась } Имеется ли у Вас возможность это применять в вызываемой функции? У вас и I2C и сеть применяется... как ведут те объекты, что вызываете. Может имеет смысл в программе блокировать выход по сбою в работе с этими элементами.
https://www.npmjs.com/package/ip этот модуль не работает с сетью. он предназначен исключительно для выдачи инфо склоняюсь что все таки виновата интервальная функция. буду думать как счетчик срабатываний увидеть или скинуть