Дисплей Nextion: азы. Arduino, ESP8266.

Тема в разделе "Глядите, что я сделал", создана пользователем ИгорьК, 9 авг 2016.

Метки:
  1. ИгорьК

    ИгорьК Гуру

    Ошибся. topic:
    nextion/p2t4/state
     
  2. Securbond

    Securbond Гуру

    Можете прокомментировать эти строчки ?
    Код (Javascript):
    if(string.find(topic,"state"))==nilthen
             local top =string.gsub(topic, mClnt.."/","")
           if top =="dim"then
     
  3. ИгорьК

    ИгорьК Гуру

    Комментарий: уже сам все забыл :)
    Не нужен там state. На его отсутствие и проверка.
     
    Последнее редактирование: 15 ноя 2016
  4. Securbond

    Securbond Гуру

    Буду читать про работу с строками в LUA, может что-то и получится. Вода камень точит......
     
  5. ИгорьК

    ИгорьК Гуру

    Это реальный код дисплея, что у меня работает на первой странице. Он не только отражает данные, но и работает с выключателями и слайдером. К сожалению в ближайшие несколько дней только на планшете и посидеть разумно объяснить не получится.
    Сам жалею что не комментирую - со временем забываю.
    С другой стороны, в lua, к сожалению, нет минификаторов как в js. Или я не знаю их. Полезная вещь.
     
  6. Securbond

    Securbond Гуру

    С вашим разобраться тяжеловато. Сделал так:
    Код (Javascript):
    Broker="192.168.0.100"
    port=1883
    myClient="Nextion"
    iogin=""
    pass=""
    m = mqtt.Client( myClient, 120, login, pass)
    m:lwt("nextion/", "By!", 0, 0)

    function run_main_prog()
      m:on("message", function(conn, topic, data)
      if (string.find(topic, "nextion")) ~= nil then
     
    local page = string.sub(topic, 9, 13)
    local el = string.sub(topic, 15, 17)
    -- print (page)
    -- print (el)

      topic = page..'.'..el..'.txt='..'\"'..data..'\"'..'\255\255\255'
      uart.write(0,topic)
           
        end
       
    end)
    end

    tmr.alarm(0, 1000, 1, function()
      if wifi.sta.status() == 5 and wifi.sta.getip() ~= nil then
      tmr.stop(0)
      m:connect(Broker, port, 0, function(conn)
      print("Mqtt Connected to: " .. Broker)
      m:subscribe("#",0, function(conn)
      run_main_prog()
      end)
      end)
      end
    end)
    И итемы прописываю так:
    Код (Text):
    Number page0t0 "Темп коридор [%.2f °C]" (Nextion01) { mqtt=">[mosquitto:nextion/page0/t0:command:*:default]" }
    Number page0t1 "Влаж коридор [%.2f %%]" (Nextion01) { mqtt=">[mosquitto:nextion/page0/t1:command:*:default]" }
    Number page0t5 "Темп спальня [%.2f °C]" (Nextion01) { mqtt=">[mosquitto:nextion/page0/t5:command:*:default]" }
    Number page0t6 "Влаж спальня [%.2f %%]" (Nextion01) { mqtt=">[mosquitto:nextion/page0/t6:command:*:default]" }
     
    ИгорьК нравится это.
  7. ИгорьК

    ИгорьК Гуру

    Работает - и славно. Я не выкладывал этот код - только Вам мозг размять, он еще в стадии ранней беты и осмысления находится. И собственный протокол еще не выработался. Глубокой зимой буду переделывать - осенью более важные задачи были. Да и сейчас еще не завершены.
     
  8. Securbond

    Securbond Гуру

    Все равно спасибо. Мне экранчик только вчера приехал, еще разбираться и разбираться... Да и до Вашего понимания Lua, мне еще шКодить и шКодить...
     
  9. VXXXV

    VXXXV Нуб

    Подскажите, при пересылки с ардуино на дисплей строки, точнее там температура до десятых, а на дисплеи еще и сотые в виде ноля показываются. Можно ли как то убрать сотые? Функция передачи как в этой теме.
     
  10. ИгорьК

    ИгорьК Гуру

    Посмотрите внимательнее что Вы отправляете.
    Здесь много всяких функций - Вы бы точнее указали на что ссылаетесь.
    Некстион нули не добавляет - полагаю, они с Ардуино приходят.
     
  11. VXXXV

    VXXXV Нуб

    Функция:
    Код (C++):
    void printNextion(const char* data, String top, String page = "0"){
        String spage = "page"+page+"."+top+".txt=\"";
        Serial2.print(spage);
        Serial2.print(data);
        Serial2.print("\"");
        Serial2.write(0xFF);
        Serial2.write(0xFF);
        Serial2.write(0xFF);
    }
    Код (C++):
    forNext = String(Tout);          
    printNextion(forNext.c_str(),"temp_out","0");
    В переменную Tout уже и константы записывал в виде 24.5, и все равно на дисплеи 24.50
     
  12. ИгорьК

    ИгорьК Гуру

    Исходное преобразование у Вас температуры в стринг вот в этой строке:
    Код (C++):
    forNext = String(Tout);  
    Она и дает Вам ноль, который, затем, отправляется на Nextion.
    Проверьте это, выведя в Serial переменную forNext.

    Чтобы избавиться от нуля, нужно задействовать функцию sprintf, насколько мне помнится.
    Сходу не помогу - уже подзабыл Си, а разбираться пока нет времени. Вы задайте вопрос в отдельной теме - как из float сделать String с одной цифрой после точки - Вам мгновенно ответят. Здесь полно зубров.
     
  13. ИгорьК

    ИгорьК Гуру

    Хотя можно воспользоваться функцией substring()
    Отрезать от начала и до предпоследнего символа.
    Код (C++):
    forNext = String(Tout);
    uint8_t end = forNext.length()
    String toNext = forNext.substring(0, (end - 1))
    printNextion(toNext.c_str(),"temp_out","0");
     
  14. VXXXV

    VXXXV Нуб

    Спасибо) Помогло.
     
  15. werdy64

    werdy64 Нерд

    Добрый день. С наступающим Новым Годом. Можно еще и небольшой элегантный финт ушами сделать в виде реализации т.н. длительного нажатия, что бы долго не ждать с инкрементацией или декрементацией значений после запятой.
     
    ИгорьК нравится это.
  16. ИгорьК

    ИгорьК Гуру

    Можно. Таймеры есть - значит можно.
     
  17. vvr

    vvr Инженерище

    Хотя вопрос немного не по теме, но всё же рискну спросить.
    Работаю с дисплеем с упрощённой библиотекой из-за недостаточных знаний)))
    Вроде всё получается.
    Возможно ли чтобы срабатывание кнопки на дисплее могло определяться условиями на мк, например состоянием концевика или значением температуры?
     
  18. ИгорьК

    ИгорьК Гуру

    Можно. Оператор "if" есть - значит можно :)
    Но изучить вопрос придется.
     
    Последнее редактирование: 10 янв 2017
  19. Sputnik-e

    Sputnik-e Нуб

    Здравствуйте!
    Уважаемый ИгорьК, подскажите пожалуйста.
    Не могу написать алгоритм, если быть точнее написал, но он не совсем работает (я новичок в этом деле)
    Постараюсь объяснить суть:
    Есть обратный таймер, по умолчанию он должен считать от числа 30 в числовом поле view
    Есть поле chtime в которое можно ввести любое число до 99 (находится на другой странице) и это число присваивается переменной v0.
    Если при запуске таймера v0.val=0 и в поле chtime.val=0, то таймер включается по умолчанию v0.val=30, а если в поле chtime введено какое либо число, таймер начинает отсчет от этого числа.
    if(va0.val==0)
    {
    va0.val=page2.chtime.val
    }else if(page2.chtime.val==0)
    {
    va0.val=30
    }
    va0.val=va0.val-1
    view.val=va0.val
    if(va0.val==0)
    {
    tm0.en=0
    view.val=0
    page page0
    }

    И вот ни как не получается, помогите пожалуйста
     
  20. ИгорьК

    ИгорьК Гуру

    Помогу, но не знаю когда. До компьютера доберусь не раньше чем через два дня.
    Вы не забыли сделать все элементы глобальными, иначе работать не будет.