ecp8266 + ssd1306 +Lua, требуется помощь!

Тема в разделе "ESP8266, ESP32", создана пользователем Shimano, 7 сен 2018.

  1. Shimano

    Shimano Нерд

    Собственно недавно начал изучение Луа и данного модуля, хотя с оледом уже давненько был знаком, собственно вопрос, как обеспечить на данном дисплее динамическое отображение к примеру одной меняющейся переменной, при этом, нужно выводить еще и статическую информацию? сильно не пинайте
    Код (C++):
    -- Variables
    sda = 1 -- SDA Pin
    scl = 2 -- SCL Pin

    b=1
    a=1

    function init_OLED(sda,scl) --Set up the u8glib lib
    sla = 0x3C
    i2c.setup(0, sda, scl, i2c.SLOW)
    disp = u8g.ssd1306_128x64_i2c(sla)
    disp:setFont(u8g.font_6x10)
    disp:setFontRefHeightExtendedText()
    disp:setDefaultForegroundColor()
    disp:setFontPosTop()
    --disp:setRot180() -- Rotate Display if needed
    end

    function print_OLED()
    disp:firstPage()
    repeat

    disp:drawStr(5, 10, str1)
    disp:drawPixel(a,b)
    disp:drawStr(5, 26,"RAM "..node.heap())
    until disp:nextPage() == false

    end

    while a<=128 do
    a= a+1
    print(a)
    tmr.delay(100000)


    str1= a
    init_OLED(sda,scl)
    print_OLED()
    end


    в данном случае при изменении переменной "а", происходит мигание всего дисплея, знаю где то накосячил, но где ещё не понимаю, опыта мало 1.jpg
     
    Последнее редактирование: 7 сен 2018
  2. ИгорьК

    ИгорьК Гуру

  3. Mitrandir

    Mitrandir Гуру

    Вы в цикле производите инициализацию экрана. Зачем?
     
  4. ИгорьК

    ИгорьК Гуру

    Потому что при tmr.delay(100000) скорее всего все рушится.
     
  5. Mitrandir

    Mitrandir Гуру

    I2c стек же не держит состояния.. ему вроде как должно быть пофиг на задержку ВPRINTOLED оттстрелялся и все..
     
  6. ИгорьК

    ИгорьК Гуру

    Я предполагаю. Но в целом смысла нет, безусловно.
    Здесь же гораздо большая проблема нарисована.
     
  7. ИгорьК

    ИгорьК Гуру

  8. Shimano

    Shimano Нерд

    Код (C++):

    -- Variables
    sda = 1 -- SDA Pin
    scl = 2 -- SCL Pin

    b=1
    a=1

    function init_OLED(sda,scl) --Set up the u8glib lib
         sla = 0x3C
         i2c.setup(0, sda, scl, i2c.SLOW)
         disp = u8g.ssd1306_128x64_i2c(sla)
         disp:setFont(u8g.font_6x10)
     
    end

    -- Нужно так:
    init_OLED(sda,scl)
    printall = function()
        a = a+1
        print(a)
        str1 = a
        print_OLED()
    end

     


    -- Вызов функции через 100 мс
    tmr.create():alarm(100, 1, function(t)
        if a > 128 then
            t:stop() -- Останавливаем этот таймер
            t:unregister() -- Отменяем регистарцию таймера
            t = nil -- Уничтожаем его
        else
            printall()-- Выполняем необходимую функцию
        end
    end)

    function print_OLED()
    disp:firstPage()
    repeat
    disp:drawStr(5, 10,a)
    disp:drawPixel(a,b)
    disp:drawStr(5, 26,"RAM "..node.heap())
    until disp:nextPage() == false
    end

     

    Поправил, теперь всё верно? правда есть проблемка, доходя до 11 всё сбрасывается и начинается по новой.И ещё вопрос не разъясните ли применение функции printall? может я что то не понял
     
    Последнее редактирование: 8 сен 2018
  9. ИгорьК

    ИгорьК Гуру

    Не знаю что отвечать на подобные вопросы.
    Я пишу тему по изучению Lua, но индивидуальным коучингом заниматься желания нет.
     
  10. Shimano

    Shimano Нерд

    да я как бы не напрашивался в ученики, ладно буду сам разбираться, спасибо и на этом.Правда всё равно не понятно, почему досчитав до 11 контроллер перезагружается, я изменял значения в таймере и начиная с 500 мс, сброс прекращается
     
  11. ИгорьК

    ИгорьК Гуру

    Это как раз понятно - идет взаимодействие по шине i2c. Шина имеет определенную скорость.
    Если пытаться гнать данные слишком быстро, начинает возникать очередь, которая имеет предельный размер. Достигли - крах.
     
  12. Shimano

    Shimano Нерд

    Спасибо за пояснение, совсем забыл за два года деградации.
    Parameters

    • id always 0
    • pinSDA 1~12, IO index
    • pinSCL 1~12, IO index
    • speed only i2c.SLOW supported
    • значит в есп не предусмотрено переключение скорости передачи?Помню давно занимался аврками, так там с этим проблем не было
     
  13. ИгорьК

    ИгорьК Гуру

    SmartSelect_20180909-122848_Opera Mini.jpg

    SmartSelect_20180909-123151_Opera Mini.jpg
     
  14. Shimano

    Shimano Нерд

    ещё раз спасибо большое,проглядел, завтра обязательно попробую
     
  15. ИгорьК

    ИгорьК Гуру

    Что? Там больше slow только для esp32.
     
  16. ИгорьК

    ИгорьК Гуру

    Если говорить о вашем скрипте, то его можно переписать.
    Предполагаю, что функция print_OLED() не успевает выдать всю информацию на дисплей, а таймер дергает ее вновь и вновь.
    Одно решение вы нашли - уменьшить скорость вызовов таймера.
    Другое решение - считать отработку print_OLED() событием и ориентироваться на него.

    Хотя, это лишь предположение. Если скорость вывода устраивает - можно не убиваться.
     
  17. Shimano

    Shimano Нерд

    32-я уже в пути, и не одна, жаль что на 8266 эти режимы недоступны, а насчёт события подумаю, как это реализовать.Странно что на авр не было проблем с выводом динамических данных, хотя авры значительно уступают по ттх еспшкам.
     
  18. Shimano

    Shimano Нерд

    Всё, разобрался в причине.В есп8266 нет аппаратного i2c в этом вся и проблема, да и на различных форумах на неё из за этого плюются.Что ж придётся ждать 32 и на ней играться с оледом
     
  19. ИгорьК

    ИгорьК Гуру

    Надеюсь, все кто плюется - те и есть крутые прогеры :)
     
  20. SergeiL

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

    Тут проверил ESP, в плане долгих циклов в loop(), в среде Arduino IDE обнаружил следующее:
    WDT срабатывает если цикл в loop дольше 1,69сек. Похоже на 1,7 настроен.
    Если вставлять delay(1); раз в 1, 68сек то все работает нормально с циклом в loop() по минуте.