прошу подсказки по orangepi Zero + Armbian + node.js

Тема в разделе "Raspberry Pi", создана пользователем Joshua, 25 июн 2017.

  1. Joshua

    Joshua Нерд

    Доброго времени суток.
    прошу прощения что немного не в тему, но вроде как по тематике ближе всего
    проблема в следующем:
    накидал проект для мониторинга аквариума с использованием того что в теме

    разделил на два модуля.
    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 часов работы модуль дисплея выгружается из памяти.
    помогите понять почему
     
    Последнее редактирование: 26 июн 2017
  2. Igor68

    Igor68 Гуру

    Вы на Raspberry... на JS. Простите, но не понятно. А как определяете, что модуль выгружается. Смотрите так?:
    Код (Bash):

    ps -A | grep <имя процесса>
     
    Честно не могу понять... в какой среде выполняется?
     
  3. Igor68

    Igor68 Гуру

    Простите... только что прочитал про node.js
     
  4. Joshua

    Joshua Нерд

    определяю просто. htop и по процессам
    модуля, который отвечает за индикацию нет в активный. остается только отвечающий за кнопки-реле
     
  5. Igor68

    Igor68 Гуру

    А если в этом:
    Код (Javascript):

    setTimeout(() => run(), 100);
     
    Вы увеличите интервал... повторение ошибки будет?
     
  6. Joshua

    Joshua Нерд

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

    я на setTimeout перешел из-за того, что она не должна, по логике, сохранять данных и затирает все что в ней выполнялось после выполнения
    при использовании setInterval работало максимум 2 часа при любой задержке
     
  7. Igor68

    Igor68 Гуру

    И ещё интресно как поведёт себя вот этот кусок:
    Код (Javascript):

    var myip=ip.address();
    lcd.println( 'IP= '+myip, 4 );
     
    Если сеть на секунду отвалится... надеюсь у вас статический IP?
     
  8. Joshua

    Joshua Нерд

    это только вывод. не будет сети - укажет 127.0.0.1
    после появления - возьмет полученный ып и отдаст на дисплей
    для чего сделано:
    в будущем планирую поднять веб сервер и нужно будет знать адрес, куда стучаться для контроля и настроек
     
  9. Igor68

    Igor68 Гуру

    В том-то и дело, что я не знаю node.js... потому и спросил.
    Ранее... когда применял C# (под виндой ещё)... применял такое:
    Код (Javascript):

    try
    {
       ... тут код
       .....
    }
    catch
    {
       ... тут обрабатывал ошибочные ситуации
       ... иначе программа обваливалась
    }
     
    Имеется ли у Вас возможность это применять в вызываемой функции?
    У вас и I2C и сеть применяется... как ведут те объекты, что вызываете. Может имеет смысл в программе блокировать выход по сбою в работе с этими элементами.
     
  10. Joshua

    Joshua Нерд

    https://www.npmjs.com/package/ip

    этот модуль не работает с сетью. он предназначен исключительно для выдачи инфо
    склоняюсь что все таки виновата интервальная функция. буду думать как счетчик срабатываний увидеть или скинуть