EEPROM at Iskra JS? (!)

Тема в разделе "Iskra JS, Espruino, Йодо", создана пользователем ИгорьК, 16 авг 2016.

  1. sys

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

    Спасибо, интересненько, добавил в закладки
     
  2. Unixon

    Unixon Оракул Модератор

    Ну вот именно затем, что там честный побайтный EEPROM вместо перетирания и перезаписи всей страницы флэша каждый раз.
     
  3. ИгорьК

    ИгорьК Гуру

    ИМХО, простота и скорость программирования JS, возможности процессора во многих случаях позволяют сделать выбор в пользу Искры JS перед avr.
    EEPROM? "Это не баг, это фича". Если у меня будет ДОМАШНИЙ (а под заказ и со сложными устройствами я не работаю) проект, оторый потребует честного EEPROM - я сделаю его на AVR. Но такого пока не видно.

    Обойти эту проблему можно разными путями. И паяльником (припаять SD карту совсем не сложно, как выяснилось, никакие переходники не нужны), и, например, задействуя возможности ESP8266, которая будет работать в паре с устройством.
    И просто получая информацию от OpenHab.
     
  4. ANV

    ANV Гуру

    Если в проекте уже есть DS1307, то можно в нее сохранить, к вашим услугам аж 56 байт памяти
     
    sys и ИгорьК нравится это.
  5. ИгорьК

    ИгорьК Гуру

    Спасибо. Отличная мысль. Но в привязке к устройству идут лишь датчики температуры, влажности и реле.
    Да, собственно, это реально не проблема. Можно обойти.
    Хотя, действительно, неожиданность, что так с ней, EEPROM... :)
     
  6. sys

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

    На самом деле я бы не отказался бы от EEPROM на новых версиях Iskra JS pro/mini/nano/micro. Даже больше - я очень бы хотел ее там видеть! Ибо возможность хранить данные без подключения доп средств, особенно при создании компактных девайсов/гаджетов, довольно сильно повысит привлекательность таких плат.

    P.S. я даже продублирую это в хотелки, да простят меня модераторы
     
  7. DrOnJD

    DrOnJD Нерд

    Поддерживаю. Делаю велокомпьютер и по итогу нужно хранить минимальное кол-во данных, а хранить негде. И чисто теоретически Pico работает от 2500 мА/ч. 2,5 года, но я не хотел бы надеяться на такую отказоустойчивость.
     
  8. ИгорьК

    ИгорьК Гуру

    На отдельную тему не тянет, поделюсь опытом здесь.
    Берем Iskra Pico, AT24C04B, два резистора по 10 ком и соединям так:
    Drawing1.jpg

    Источник здесь.
    Небольшой код с короткими, как у Буратино, мыслями .
    Код (Javascript):
    var cl = console.log; // Так короче смотреть в экран

    // Инициализация I2C номер 1 на двух пинах
    I2C1.setup({scl:B8,sda:B9});

    // Так положено запускать модуль
    // var eeprom=require("AT24").connect(i2c, pagesize, capacity, i2caddress);

    // В связи с нашей микросхемой это получается так
    // первая шина, 8 байт страничка, 4 кб всего, 0 - адрес,
    // потому что все три адресные ноги прижаты к земле
    var eeprom=require("AT24").connect(I2C1, 8, 4, 0);

    // Просто массив для записи,
    // но особо обратите внимание на последние три цифры
    var dt = ["H",2,3,4,5,6,7,8,9,10,11,12,254,255,256,257];
    // Пишем массив с адреса 0
    eeprom.write(0,dt);
    // Чтение 16 байт
    var a = eeprom.read(0,16);

    // Напечатаем что получится. Чтобы понимать во что превращается переменная а
    cl(a);

    // То же, но чтобы был ясен подход и что там стало с последними двумя цифрами
    a.forEach(function(x) {
      cl(x);
    });

    // Куда же без приветствия
    var d = "Hello, World!";
    // Таким образом, eeprom.write принимает на запись массивы И стринги
    eeprom.write(50,d);

    var s = eeprom.read(50, d.length);
    var j, i;
    var res = "";
    // Таким путем восстанавливаем строку
    for(i = 0, j = s.length; i < j; i++){
      var st = String.fromCharCode(s[i]);
      res = res + st;
    }
    cl(res);
    // Или так:
    res = "";
    s.forEach(function(x) {
      res = res + String.fromCharCode(x);
    });
    cl(res);

     
     
    Последнее редактирование: 10 ноя 2016
    sys и DrOnJD нравится это.
  9. DrOnJD

    DrOnJD Нерд

    Вероятно не Iskra Pico ((( Я уже обрадовался, что Амперка свою пику выпустила. А статейку вероятно стоило бы оформить как отдельную тему, очень полезная. Я вот как front-end программист вижу ваш код не оптимальным, но вот как человек который в основном пишет сайты, я не представлял как нормально взаимодействовать с этим чипом. Действительно полезная информация, спасибо.

    P.S. я не силен в даташитах, не нашел какое кол-во данных можно туда разместить. Подскажите пожалуйста.
     
  10. ИгорьК

    ИгорьК Гуру

    Дык... Исправляйте скорее! Я JS изучаю по рассказам бабушки :)
    4K = (512 x 8), т.е. 4 096 ячеек памяти.
     
  11. ИгорьК

    ИгорьК Гуру

    Это Nucleo F401. Вполне себе ничего плата для JS. Только там надо чуть паяльником пройтись.
     
  12. DrOnJD

    DrOnJD Нерд

    Код (Javascript):
    var cl = console.log; // Так короче смотреть в экран

    // Инициализация I2C номер 1 на двух пинах
    I2C1.setup({scl:B8,sda:B9});

    // Так положено запускать модуль
    // var eeprom=require("AT24").connect(i2c, pagesize, capacity, i2caddress);

    // В связи с нашей микросхемой это получается так
    // первая шина, 8 байт страничка, 4 кб всего, 0 - адрес,
    // потому что все три адресные ноги прижаты к земле
    var eeprom=require("AT24").connect(I2C1, 8, 4, 0);

    // Просто массив для записи,
    // но особо обратите внимание на последние три цифры
    var dt = ["H",2,3,4,5,6,7,8,9,10,11,12,254,255,256,257];
    // Пишем массив с адреса 0
    eeprom.write(0,dt);
    // Чтение 16 байт
    var a = eeprom.read(0,16);

    // Напечатаем что получится. Чтобы понимать во что превращается переменная а
    cl(a);
    // после cl(a); принято в коммментарии писать результат, что-бы человеру читающему код не обязательно было его поспроизводить для того что-бы понять

    // То же, но чтобы был ясен подход и что там стало с последними двумя цифрами
    a.forEach(function(x) {
      cl(x);
    });

    // Куда же без приветствия
    var d = "Hello, World!";
    // Таким образом, eeprom.write принимает на запись массивы И стринги
    eeprom.write(50,d);

    var s = eeprom.read(50, d.length);
    var j, i;
    var res = "";
    // Таким путем восстанавливаем строку

    for(i = 0, j = s.length; i < j; i++){
      res += s[i];
    }
    cl(res);
    // Или так:
    res = "";
    s.forEach(function(x) {
      res += x;
    });
    cl(res);
    // Или так:
    res = s.join('');
    cl(res);
     
    Плата прекрасная для своих задач, тем не менее Pico в разы меньше.
     
    ИгорьК нравится это.
  13. ИгорьК

    ИгорьК Гуру

    Код (Javascript):
    res = s.join('');
    Не получится, потому как это будет одна длииииииинная стринг-цифра, начинающаяся с 70
    Код (Javascript):
    s.forEach(function(x) {
      res += x;
    });
    Не получится тоже. То же самое будет. Без String.fromCharCode() не обойтись.
     
  14. DrOnJD

    DrOnJD Нерд

    Т.е. результатом eeprom.read(50, d.length) будет не массив из строк? В этом случае еще раз подтверждается, что знание JS !== навыкам работы с контроллерами.
     
  15. ИгорьК

    ИгорьК Гуру

    1321234234.jpg
     
  16. DrOnJD

    DrOnJD Нерд

    Для меня не ясно что такое Uint8Array, вменяемого объяснения не встречал. Видел не раз как это применяется, но вот как это использовать уразуметь не могу. Из вашего примера могу предположить что это массив адресов.
     
  17. ИгорьК

    ИгорьК Гуру

    https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Uint8Array
     
    sys нравится это.
  18. ИгорьК

    ИгорьК Гуру

  19. sys

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

  20. ИгорьК

    ИгорьК Гуру

    Эх... куплю все таки Pico завтра. Не то чтобы жаба душит... но осадок какое-то возникает :)