Iskra js и oled дисплей

Тема в разделе "Iskra JS, Espruino, Йодо", создана пользователем miwany, 25 фев 2023.

  1. miwany

    miwany Нерд

    Ребятки, помогите чайнику разобраться с кодом, чёй то никак не могу вкурить как вывести температуру от датчика 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();
     
  2. ИгорьК

    ИгорьК Гуру

    У вас, товарищ, все нормально с областями видимости переменных?

    Внутри таймера вы получаете температуру.
    Функция показа температуры за пределами таймера.

    1. Напишите функцию показа на дисплее перед таймером.
    2. Вызывайте эту функцию в калбэке sensor.getTemp(function... после console.log...
    3. На кой шут вы внутри таймера два раза подряд опрашиваете датчик? Получаете данные в var temperature где они и гибнут.

    Подумайте над логикой своего кода.
     
  3. miwany

    miwany Нерд

    Какой хороший человек ! Мильён Вам благодарностей !!!
    А не подскажите, как уменьшить значение до десятой доли, а то выводит до тысячных ?
     
  4. ИгорьК

    ИгорьК Гуру

    1. Умножить на 10
    2. Math.round()
    3. Поделить на 10
     
  5. miwany

    miwany Нерд

    может не так выразился...
    выводит так значение: 25,652, а хотелось бы 26,6...
    если делить или умножать, то просто точка сместиться в значении...
     
  6. ИгорьК

    ИгорьК Гуру

    Не стесняйся, попробуй что я сказал по пунктам и расскажи что получилось.

    Код (Javascript):
    temp = Math.round(temp*10)/10;
    Смотри, здесь сначала температура умножается на 10, потом округляется, потом делится на 10. Все как я и писал раньше.
     
    Последнее редактирование: 26 фев 2023
    miwany нравится это.
  7. ИгорьК

    ИгорьК Гуру

    Теоретически есть ещё вариант:
    Код (Javascript):
    temp = temp.toFixed(1)
    Но реализовано ли это в данной железке я не знаю. И, главное, я ей вообще не занимаюсь и не знаю JS :)
     
  8. miwany

    miwany Нерд

    Вай, и снова мильён благодарностей, все работает...

    Код (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);
     
    ИгорьК нравится это.
  9. ИгорьК

    ИгорьК Гуру

    Удали строчку:
    Код (Javascript):
    var temperature = sensor.getTemp();
    Будет работать?
     
  10. ИгорьК

    ИгорьК Гуру

    И чисто практически, если дергать DS18b20 каждую секунду, то он сам от себя будет греться. Поэтому, реже...
     
    miwany нравится это.
  11. miwany

    miwany Нерд

    ага, работает...
    пока для отладки пусть греется, потом, конечно, такой необходимости не будет.... эт только начало ))))
     
    ИгорьК нравится это.
  12. ИгорьК

    ИгорьК Гуру

    Объяснять в чем дело надо?
     
  13. miwany

    miwany Нерд

    та не.... :):):)
    но Вы не теряйтесь, мало ли чего ;););)

    таже теперь и так работает

    Код (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);
     
    ИгорьК нравится это.
  14. ИгорьК

    ИгорьК Гуру

    Славно. Но если там что-то греется, то надо почитать про PID-регулирование. Без этого, конечно, будет работать но температура может сильно колебаться. Хотя все зависит от конкретной ситуации.

    Обычно для температуры достаточно PI-регулятора. Ну и про то, что есть ШИМ. Тоже полезная штука.