Привет всем, Есть проект, нужно поддерживать температуру путём включения и выключения реле при условии определённой температуры. Датчики температуры которые использую: 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);
Как Вы думаете, куда вернет значение return? И еще раз прочитайте, что делает .read(function(a){...}). Мне что-то подсказывает, что присвоение значения надо делать внутри, вместо return.
Спасибо за ответ. Я новичёк и не имею больших познаний в js. Не могли бы вы подсказать, как реализовать правильно мою затею: снять температуру с датчика → сравнить их с пороговыми значениями?
Попробуйте так: Код (Javascript): ... var celsius2; therm2.read(function(a) { celsius2 = a.temp.toString(); }); ... Для DHT11 метод .read считывает показания и передает в функцию в виде параметра a (function(a){...}) внутри которой Вы и можете работать с этим значением.
Спасибо, правда есть ещё одна проблемка, внутри функции переменная считывается и выводится в консоль, но глобавльно она не изменяется: Код (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 внутрь функции. Но хотелось бы переназначать её глобально
проверил - у меня все работает. Но... Есть одна загвоздка. Выводы асинхронны и имеют разное время исполнения - вывод в методе .read срабатывает позже, чем вывод в основной функции. Соответственно и присвоение происходит позже, чем Вы вывели информацию. Либо засовывать внутрь, либо задавать таймаут на услвные операции, либо добавлять событийность
Спасибо большое, все заработало. Пока просто засунул if в тело функции. А расскажите, если хотите, как добавить тайм-аут или собитейность. Или киньте ссылкой
про 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);});