Про зажигание лампочек.

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

  1. ИгорьК

    ИгорьК Гуру

    Посоветуйте, что читать на тему JS в микроконтроллерах?
    С синтаксисом разобраться более менее не сложно, но вот алгоритмизация в чтиве идет везде на тему сайтостроения.
    Увидеть способ последовательного зажигания лампочек - проблема.
    Неужели выписывать его алгоритмами Си?
    Код (C++):
    uint8_t pin[] = {1,2,3,4};
    for(int i = 0; i<4; i++) {
      for(int j = 0; j < 255; j++) {
        analogWrite(pin[i],j);
        delay(30); // Знаю я, знаю что это неправильно!
      }
    }
     
    Последнее редактирование: 16 мар 2016
  2. nailxx

    nailxx Официальный Нерд Администратор

    А вот нет ещё книг по JS в контроллерах. Профессиональнее (грубо) с JS’ом работают те, кто пишет под сервак на Node.js. Видимо там какие-то паттерны и подходы ловить стоит.

    Очевидно нам стоит накупить книг по JavaScript, выбрать из них парочку достойных внимания и поставить в ассортимент.

    P.S.

    Код (Javascript):

    var Leds = require('@amperka/led');
    var leds = [
      Leds.connect(P4),
      Leds.connect(P13),
      Leds.connect(A0),
      Leds.connect(A3)
    ];

    var anim = require('@amperka/animation').create({
      from: 0,
      to: 1,
      duration: 3,
      updateInterval: 0.01,
      loop: true
    });

    anim.on('update', function(progress) {
      leds.forEach(function(led) {
        led.turnOn().brightness(progress);
      });
    });

    anim.play();
     
     
    ИгорьК нравится это.
  3. ИгорьК

    ИгорьК Гуру

    нда... Ну, ничего, ничего... Разберемся :) Функции, принимающие функции как аргумент - это прикольно. Я еще в Lua заметил такое явление. Здесь тоже будет :)
     
  4. ИгорьК

    ИгорьК Гуру

    Значицца так. Задачка из первого поста решается с привлечением замыканий следующим образом:

    Код (Javascript):
    var leds = [LED1,LED2,LED3,LED4];
    function lightsLed() {
        var startLed = 0;
        var stopLed = 10;
        var inc = 1;
        var nextLed = 0;
        var cicles = leds.length;

        var a = setInterval(function() {
          analogWrite(leds[nextLed], startLed/10);
          startLed = startLed + inc;

          if (startLed == stopLed){
            startLed = 0;
            nextLed = nextLed +1;
            print("nextLed: ", nextLed);
            if(nextLed == cicles) {
              clearInterval(a) ;
            }
          }
        }, 100);
        return a;
    }

    lightsLed();
    print("Urrrraaaaaaa!");
    В чем преимущество такого решения, по сравнению с Си? В том, что получилась асинхронная функция.
    "Urrrraaaaaaa!" ,будет напечатано раньше, чем
    nextLed: 1
    nextLed: 2
    nextLed: 3
    nextLed: 4

    На чем я тупо засел? На выражении:
    Код (C++):
    if (startLed == 10)
    когда оно было
    Код (C++):
    if (startLed == 1.0)
    то есть работал с точками.
     
    Последнее редактирование: 17 мар 2016
  5. ИгорьК

    ИгорьК Гуру

    Еще простой снипет про помигать:
    Код (Javascript):

    var leds = [LED1,LED3,LED4,LED2];

    var flag = true;
    var cicles = 100;
    var step = 0;
    var freq = 500;

    var ledsSwitch = function(what){
      leds.forEach(
        function switchOn(value){
        value.write(what); }
       );};

    var a = setInterval(function(){
      if(flag) {
        flag = false;
        ledsSwitch(1);
      }
      else {
        flag = true;
        ledsSwitch(0);
      }
      step +=1;
      if(cicles == step ){
        clearInterval(a);
        ledsSwitch(0);
      }
    }, freq);
     
  6. nailxx

    nailxx Официальный Нерд Администратор

    Можно и так. Способов сделать одно и то же — множество.

    В программах сложнее, чем тривиальные я пропагандирую семантическое программирование. Например, если у светодиода есть понятие яркости, стоит прямо так и писать «эй, светодиод, а ну ка такую яркость выстави». Т.е. обращение идёт не к пинам, а к конечному устройству.

    Для простых случаев, конечно, это может оказаться стрельбой из гаубицы по воробьям.
     
  7. ИгорьК

    ИгорьК Гуру

    Как было сказано ранее, целевая аудитория этой платы - программисты JS и дети. Я не программист, значит второе :)
     
  8. ИгорьК

    ИгорьК Гуру

    Скажите, пожалуйста, почему не работает этот код для сообщений типа "1:1":
    Код (Javascript):
    serial.on('data', function(data) {
      inByte = String(data);
      print("InByte = "+inByte+" And Char Code is: "+inByte.charCodeAt(0));
    // вот это не работает. оно пропускает и "\n" и "\r":
      if  (inByte.charCodeAt(0) !== 10 || inByte.charCodeAt(0) !== 13) {
        command += inByte;
      }
      print("Command = "+command);
      print("Command Length Is: "+command.length);
     
    В результате command станновится равным "1:1\r\n" c длинной сообщения 5 вместо 3.
     
  9. nailxx

    nailxx Официальный Нерд Администратор

    Потому что событие вызывается 1 раз с полной `data`. А проверяете вы только нулевой символ. Возможно вам нужно:

    Код (Javascript):
    serial.on('data', function(data) {
      var command = ('' + data).trim();
      print("Command =", command);
      print("Command Length Is:", command.length);
     
     
    ИгорьК нравится это.
  10. ИгорьК

    ИгорьК Гуру

    Нет:
    4213412412.jpg

    Работает код:
    23412341243.jpg

    Не работает как раз тот что закомментирован.
     
  11. nailxx

    nailxx Официальный Нерд Администратор

    Тьфу ты… У вас написано «если чар не равен 10 или не равен 13». Чему-то из этого он определённо не равен всегда.
     
  12. ИгорьК

    ИгорьК Гуру

    Как работает Ваш код:
    777777777.jpg
    55555.jpg

    То есть в моем случае когда идет конкатенция с символом с кодом более 13(перевод каретки) - все работает. Но хотелось бы научиться "отлавливать" этот "\n".
     
  13. ИгорьК

    ИгорьК Гуру

    Нужно чтобы 10 или 13 не попадали в результирующий стринг. И чтобы, с другой стороны, отловленное "\n"(х0D) говорило о том, что прием команды закончен.
     
  14. nailxx

    nailxx Официальный Нерд Администратор

    В снипете

    Код (Javascript):
    if  (inByte.charCodeAt(0) !== 10 || inByte.charCodeAt(0) !== 13) {
        command += inByte;
      }
    нужно заменить || на &&
     
    ИгорьК нравится это.
  15. ИгорьК

    ИгорьК Гуру

    "Семен Семеныч..." Нда... перегрелся я... :) Конечно работает!
     
    Последнее редактирование: 25 мар 2016
  16. ИгорьК

    ИгорьК Гуру

    Маленький снипет про зажигание лампочек. Плавно зажигает и гасит.
    Код (Javascript):
    var ledWrite = function(led, start, stop, timeout) {
      var nowLight = start;
      var nowStop  = stop;
      var direction = (start <= stop) ? 1 : -1;
      var nowTimeout = timeout;

      var writeNow = setInterval (function(){
        analogWrite(led, nowLight/100, { freq : 200 });
        if (nowLight == nowStop) {
          clearInterval(writeNow);
        }
        else{
          nowLight = nowLight + direction;
        }
      }, nowTimeout);
    };
     
    Еще:
    Код (Javascript):
    var ledWrite = function(led, start, stop, timeout) {
      led = led || LED1;
      start = start || 0;
      if(stop == "undefined") stop = Number(100);
      timeout = timeout || 50;
     
      var nowLight = start;
      print("nowLight = "+nowLight);
      var nowStop  = stop;
      print("nowStop= "+nowStop);
      var nowTimeout = timeout;
      print ("nowTimeout = "+ nowTimeout);

      var direction = (start <= stop) ? 1 : -1;

      var writeNow = setInterval (function(){
        analogWrite(led, nowLight/100, { freq : 200 });
        if (nowLight == nowStop) {
          clearInterval(writeNow);
        }

        else{
          nowLight = nowLight + direction;
        }
      }, nowTimeout);
    };
     
     
    Последнее редактирование: 25 мар 2016
  17. SirYorik

    SirYorik Нуб

    мдэ. буквы вроде как и в си, латинские, а смысл не проясняется.

    "х || 100" это вот что просходит, логическое выражение с или?

    а замыкание что такое?

    ledWrite это новая фукция?
    start,stop,timeout - что это и в каких еденицах?
     
    Последнее редактирование: 25 мар 2016
  18. ИгорьК

    ИгорьК Гуру

    а = х || 100 - а будет равно х, а если он не определен, то 100.
    Только у меня это почему-то не работает. Пришлось убрать.

    Про замыкание лучше читать в книжке. Здесь, в этом сниппете, замыкания нет.
     
  19. SirYorik

    SirYorik Нуб

    вкнижке - в которой? из комплекта йоды? а если нету?

    { freq : 200 } откуда и зачем сие?
     
  20. ИгорьК

    ИгорьК Гуру

    Нет у меня такого комплекта. Книжки - про JavaScript. Их полно. Изучаем общую часть, которая есть в каждой.

    Поняв JavaScript, гарантирую, Вы будете с любовью программировать ESP8266 на Lua.

    Это, скажем так, частота ШИМ. Здесь - 200 изменений в секунду. Если, например, поставить 10 - будет хорошо заметное мерцание с изменением яркости. Прикольный эффект.
     
    SirYorik нравится это.