DHT 11 и Iskra Js — не присваивает значение переменной

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

  1. Dmytriy

    Dmytriy Нерд

    Привет всем,
    Есть проект, нужно поддерживать температуру путём включения и выключения реле при условии определённой температуры.
    Датчики температуры которые использую: 1 датчик от амперки (аналоговый термометр) и DHT11;

    С первого датчика получить данные и присвоить их переменной не составило труда. А вот DHT11 проблемный: я его подключил и с помощью когда с http://www.espruino.com/DHT11 получил данные о температуре и влажности. Но когда я пытаюсь присвоить данные температуры из DHT-11 нужной переменной — выдаёт undefined.

    Для проверки в return писал 2 — всё равно выдаёт undefined.

    Подскажите, пожалуйста, как и что исправить?


    Код программы:
    Код (Javascript):
    var relay1 = new Pin(P7);
    var relay2 = new Pin(P6);
    var relay3 = new Pin(P5);

    var therm1 = require('@amperka/thermometer')
    .connect(A4);

    var therm2 = require("DHT11").connect(P2);
    therm2.read(function (a) {console.log("Temp is "+a.temp.toString()+" and RH is "+a.rh.toString());});


    /* Main Code */

    function lightControl() {
      /*Temperature Values*/
      var celsius = therm1.read('C');
      var celsius2 = therm2.read(function(a) {
        return a.temp.toString();
      });

      console.log("Therm1:", celsius.toFixed(1), "->",
                  "Therm2:", celsius2, "->");


      /*Relay 1 Control*/
      if (celsius > 25) {
        relay1.write(1);
        console.log("Relay 1 is Off");

      } else if (celsius < 23){
          relay1.write(0);
          console.log("Relay 1 is On");
      }


      /*Relay 2 Control*/
      if (celsius2 > 25) {
        relay2.write(1);
        console.log("Relay 2 is Off");

      } else if (celsius < 23){
          relay2.write(0);
          console.log("Relay 2 is On");
      }
    }

    setInterval(lightControl, 1000);

     
     

    Вложения:

  2. sys

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

    Как Вы думаете, куда вернет значение return? И еще раз прочитайте, что делает .read(function(a){...}).
    Мне что-то подсказывает, что присвоение значения надо делать внутри, вместо return.
     
  3. Dmytriy

    Dmytriy Нерд

    Спасибо за ответ. Я новичёк и не имею больших познаний в js. Не могли бы вы подсказать, как реализовать правильно мою затею: снять температуру с датчика → сравнить их с пороговыми значениями?
     
  4. sys

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

    Попробуйте так:

    Код (Javascript):

    ...
      var celsius2;
      therm2.read(function(a) {
        celsius2 = a.temp.toString();
      });
    ...
     
    Для DHT11 метод .read считывает показания и передает в функцию в виде параметра a (function(a){...}) внутри которой Вы и можете работать с этим значением.
     
  5. Dmytriy

    Dmytriy Нерд

    Спасибо, правда есть ещё одна проблемка, внутри функции переменная считывается и выводится в консоль, но глобавльно она не изменяется:

    Код (Javascript):
     var celsius3;
        therm3.read(function(a) {
        celsius3 = a.temp.toString();
        console.log(celsius3); //выводит в консоль правильное значение
        return;
      });

      console.log("Therm1:", celsius.toFixed(1), "->",
                  "Therm2:", celsius2, "->",
                  "Therm3:", celsius3); //выводит undefined
    Да, как решение добавить if внутрь функции. Но хотелось бы переназначать её глобально
     
  6. sys

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

    уберите return - он не нужен.
     
    Последнее редактирование: 1 май 2017
  7. sys

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

    проверил - у меня все работает. Но...
    Есть одна загвоздка. Выводы асинхронны и имеют разное время исполнения - вывод в методе .read срабатывает позже, чем вывод в основной функции.
    Соответственно и присвоение происходит позже, чем Вы вывели информацию.
    Либо засовывать внутрь, либо задавать таймаут на услвные операции, либо добавлять событийность
     
  8. Dmytriy

    Dmytriy Нерд

    Спасибо большое, все заработало. Пока просто засунул if в тело функции. А расскажите, если хотите, как добавить тайм-аут или собитейность. Или киньте ссылкой :)
     
  9. sys

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

    про setTimeout() можете почитать в вики - http://wiki.amperka.ru/js:builtins

    а про событийность... я имел ввиду что-то наподобие Promise - https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/Promise

    Как простой вариант:

    Код (Javascript):

    var celsius3;

    var promise = new Promise(function(resolve, reject) {
      therm3.read(function(a) {
         celsius3 = a.temp.toString();
         resolve();
      });
    });

    promise.then(function(){console.log("Therm3:", celsius3);});