IskraJS + Troyka meteo + Troyka barometer

Тема в разделе "Iskra JS, Espruino, Йодо", создана пользователем Sergey Proskurnya, 19 апр 2019.

  1. Новичок в схемотехнике и всяком таком DIY, но решил сделать метеостанцию для своего хобби.

    Итак, есть IskraJS + Troyka Shield v2 + Troyka барометер + Troyka цифровой метеомодуль.
    Искра подключена, IDE настроен, видит плату и библиотеки Амперки, код заливается.

    Но не могу добиться одновременной работы означенных модулей.
    По отдельности - работают, выдают корректные значения.
    Я уж читал про I2C на wiki Амперки, просматривал проекты, но инфы для нубов реально мало.
    Во многих проектах или не используется IskraJS, а какие-то другие платы или не используется Troyka Shield v2 или не используются одновременно несколько I2C-устройств.

    Вот такой код:
    Код (Javascript):
    I2C1.setup({sda: SDA, scl: SCL, bitrate: 400000});
    var meteoSensor = require('[USER=5565]@amperka[/USER]/meteo-sensor').connect({i2c: I2C1});

    setInterval(() => {
      meteoSensor.read(function(err, data) {
        if (err) {
          console.log(err);
        } else {
          console.log("Temp is: " + data.tempC + " C, " + "Hum is: " + data.humidity + " %");
        }
      });
    }, 3000);


    I2C2.setup({sda: P0, scl: P1, bitrate: 400000});
    I2C3.setup({sda: P11, scl: P12, bitrate: 400000});

    var baro = require('[USER=5565]@amperka[/USER]/barometer').connect({i2c: I2C3, repeatabulity: 'HIGH'});
    baro.init();

    setInterval(() => {
      print(baro.read('mmHg') + ", " + baro.temperature('C'));
    }, 3000);
    Причём, данные с метео-сенсора получаются, а барометр валится на "baro.init();" по read timeout c I2C.
    Если заменить "i2c: I2C3" в методе "connect" у барометра на настроенный "i2c: I2C2" тоже ошибка.

    Заранее спасибо.

    Проект замечательный, давно мечтал заняться чем-то таким "железячным", но без сурового входа в схемотехнику, но что-то пошло не так... :))
     
    Последнее редактирование: 19 апр 2019
  2. ИгорьК

    ИгорьК Гуру

  3. Поправил пост, спасибо за замечание.

    А по существу есть что сказать?
    Это же должна быть элементарная вещь, продуманная создателями Амперки.
     
  4. ИгорьК

    ИгорьК Гуру

    Я не сотрудник Амперки. И искрой JS занимаюсь от случая к случаю.


    Вам бы, во-первых, почитать про JavaScript побольше, а во-вторых, если модули сидят на одной шине, то надо проверить их адреса на совпадение.

    В общем, это либо проблема непонимания основ языка, что лечится книжкой, либо адреса датчиков на шине, коль по отдельности все работает.
     
  5. По JS - вроде бы основы знаю. По-крайней мере, в том куске кода, что я привёл, синтаксических ошибок нет. Модули работают по-отдельности.

    >> Я не сотрудник Амперки. И искрой JS занимаюсь от случая к случаю.
    А я не вам персонально это писал. Надеюсь, что здесь периодически появляются ответственные за обратную связь и развитие проекта.

    >> либо адреса датчиков на шине, коль по отдельности все работает.
    Нашёл адрес метео-датчика (http://amperka.ru/product/troyka-meteo-sensor#docs): 0x44 (по умолчанию) / 0x45

    Адрес барометра в wiki (http://wiki.amperka.ru/продукты:troyka-barometer) такой: 0b1011100 (0x5C). Т.е. адреса вроде бы разные, должно работать...
     
  6. ИгорьК

    ИгорьК Гуру

    JavaScript - это не основы, это логика программирования.
    Код - каша. Сначала сделайте все настройки. Потом организуйте опрос.

    У вас в коде происходит одновременный опрос датчиков, полагаю, это не правильно.
    Вам необходимо сделать его последовательным и некоторым промежутком.

    Вы (практически одновременно) запускаете два таймера да на одно время. Так не делается.
     
    Sergey Proskurnya нравится это.
  7. В браузере и NodeJS - делается.
    Т.к. запуск двух и более таймеров (на одно время или разное) не лимитируется ECMA.

    За подсказку - спасибо, но это именно ограничения платформы, про которые пока не понятно где читать.
     
  8. ИгорьК

    ИгорьК Гуру

    Думаю, это плохая практика.


    На сайте espruino.com
     
    acos и Sergey Proskurnya нравится это.
  9. Ещё раз спасибо, вам Амперка должна бы приплачивать за поддержку :)

    А можно вдогонку, так сказать, ещё чайниковский вопрос про I2C.
    Вот здесь: http://wiki.amperka.ru/js:iskra_js (в распиновке) написано, что у IskraJS есть I2C1, I2C2 и I2C3.
    Подскажите, пожалуйста, в случае использования Troyka Shield v2 есть соответствие между физическим расположением I2C Troyka-модуля на шилде (там группы контактов, обозначенные как A, B и C) и параметром "i2c" при обращении в программе к сенсору (как это здесь принято называть, "скетче"?) - I2C1, I2C2 и I2C3?

    То есть, если сенсор воткнут в группу I2C контактов "A", то нужно использовать I2C1(PrimaryI2C), если в "B" - то I2C2 и т.д. (или другое соотнесение). Или это никак не связано?
     
  10. acos

    acos Официальный гик Администратор

    Нет, это никак не связано. Всё подключается к Primary I2C
    к I2C можно подключать до 127 устройств (расширенный режим не берём) подключённых в параллель.
    Вот хорошая статья про её работу http://easyelectronics.ru/interface-bus-iic-i2c.html

    Мне не понятно, как у вас подключены модули? То есть вы подключили сами модули к физически разным портам I2C или к одному и тому же?
    Если у них разные адреса, то можно подключать к одному и тому же.
    Ну и в коде да, какая-то каша