Ребятки, помогите чайнику разобраться с кодом, чёй то никак не могу вкурить как вывести температуру от датчика DS18B20 на экран дисплея SSD1306 ? Код (Javascript): PrimaryI2C.setup({sda: SDA, scl: SCL, bitrate: 100000}); var oneWire = new OneWire(P10); var sensor = require("DS18B20").connect(oneWire); setInterval(function() { var temperature = sensor.getTemp(); sensor.getTemp(function (temp) { console.log("Temp "+temp+" °C"); }); }, 10000); var lcd; function onInit() { lcd = require("SSD1306").connect(PrimaryI2C); } function showTemperature(temp) { lcd.clear(); lcd.setFontBitmap(); lcd.drawString("Temp",1,0); lcd.drawLine(0,10,84,10); lcd.setFontVector(20); lcd.drawString(temp,1,15); lcd.flip(); } onInit();
У вас, товарищ, все нормально с областями видимости переменных? Внутри таймера вы получаете температуру. Функция показа температуры за пределами таймера. 1. Напишите функцию показа на дисплее перед таймером. 2. Вызывайте эту функцию в калбэке sensor.getTemp(function... после console.log... 3. На кой шут вы внутри таймера два раза подряд опрашиваете датчик? Получаете данные в var temperature где они и гибнут. Подумайте над логикой своего кода.
Какой хороший человек ! Мильён Вам благодарностей !!! А не подскажите, как уменьшить значение до десятой доли, а то выводит до тысячных ?
может не так выразился... выводит так значение: 25,652, а хотелось бы 26,6... если делить или умножать, то просто точка сместиться в значении...
Не стесняйся, попробуй что я сказал по пунктам и расскажи что получилось. Код (Javascript): temp = Math.round(temp*10)/10; Смотри, здесь сначала температура умножается на 10, потом округляется, потом делится на 10. Все как я и писал раньше.
Теоретически есть ещё вариант: Код (Javascript): temp = temp.toFixed(1) Но реализовано ли это в данной железке я не знаю. И, главное, я ей вообще не занимаюсь и не знаю JS
Вай, и снова мильён благодарностей, все работает... Код (Javascript): PrimaryI2C.setup({sda: SDA, scl: SCL, bitrate: 100000}); var oneWire = new OneWire(P10); var sensor = require("DS18B20").connect(oneWire); var lcd = require("SSD1306").connect(PrimaryI2C); setInterval(function() { var temperature = sensor.getTemp(); sensor.getTemp(function (temp) { temp = Math.round(temp*10)/10; lcd.setFontBitmap(); lcd.setFontVector(11); lcd.drawString("Temperature",26,0); lcd.drawLine(0,15,128,15); lcd.setFontVector(34); lcd.drawString(temp,20,22); lcd.flip(); lcd.clear(); }); }, 1000);
И чисто практически, если дергать DS18b20 каждую секунду, то он сам от себя будет греться. Поэтому, реже...
ага, работает... пока для отладки пусть греется, потом, конечно, такой необходимости не будет.... эт только начало ))))
та не.... но Вы не теряйтесь, мало ли чего таже теперь и так работает Код (Javascript): PrimaryI2C.setup({sda: SDA, scl: SCL, bitrate: 100000}); var oneWire = new OneWire(P10); var sensor = require("DS18B20").connect(oneWire); var lcd = require("SSD1306").connect(PrimaryI2C); var targetTemp = 30; setInterval(function() { sensor.getTemp(function (temp) { function setHeater(isOn) { digitalWrite(LED1, isOn); digitalWrite(A0, !isOn); } if (temp < targetTemp-1) setHeater(true); if (temp > targetTemp+1) setHeater(false); temp = Math.round(temp*10)/10; lcd.setFontBitmap(); lcd.setFontVector(11); lcd.drawString("Temperature",26,0); lcd.drawLine(0,15,128,15); lcd.setFontVector(34); lcd.drawString(temp,20,22); lcd.flip(); lcd.clear(); }); }, 1000);
Славно. Но если там что-то греется, то надо почитать про PID-регулирование. Без этого, конечно, будет работать но температура может сильно колебаться. Хотя все зависит от конкретной ситуации. Обычно для температуры достаточно PI-регулятора. Ну и про то, что есть ШИМ. Тоже полезная штука.