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

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

Метки:
  1. Stimul

    Stimul Нуб

    Да нет, вроде все 20 страниц пролистал, возможно что то упустил, вечером гляну.
     
  2. Mozgoklui

    Mozgoklui Нуб

    Здравствуйте!
    Подскажите пожалуйста, как можно проверить работоспособность Rx Tx у дисплея? В связке с Ардуино Нано не работает обмен ни в одну из сторон. Грузил простейшие примеры, собранные в Flprog. Например вешал датчик ds18b20, отправлял с него данные через дуню в дисплей и параллельно в порт, порт получает, а дисплей (текстовое поле например) без изменений. И наоборот, пробовал включать led на 13 ноге ардуино сенсорной кнопкой на дисплее (ставил опцию Send в настройках кнопки), но дисплей ничего не отправляет... Подключал к разным пинам, менял rx tx контакты, без толку. Отдельно экран прогружается и работает штатно (гружу через SD, у меня нет USB TTL).

    Знания поверхностные, банально не знаю как протестировать rx tx на наличие хоть какого сигнала. Куда копать? И может ли flprog генерить неправильный код (нет знаний проверить)?
     
  3. Belkin

    Belkin Гик

    Тему с самого начала полистайте, а то - "сразу в лоб"...
     
  4. Mozgoklui

    Mozgoklui Нуб

    пролистывал. И месяца два назад, пока колдовал с программированием nextion отдельно от всего, и сейчас, когда с ардуино и остальными приборами поженить собрался тоже. Тема в закладках давно висит, экран я разрисовал как положено, красиво и функционально.
    А теперь вот такая засада... Может как-то можно тестером контакты те проверить? ну то есть жать на кнопку на экране и смотреть за сигналом? или там не определить будет?
    Посмотрел код, что с Flprog выпадает - вроде всё что надо есть, то есть три байта 0xff. Да и готовые чужие скетчи качал простейшие - без толку...
     
  5. Belkin

    Belkin Гик

    Тестером UART не проверить, нужен осциллограф, а лучше логический анализатор.
    Попробуйте на Ардуине соединить контакты TXD и RXD и отправить что-либо.
    Посылка эхом "вернется" в Ардуину.
    Если ответ будет, то тут все исправно.
    Как "ловить" ответ - решайте сами.

    PS. Надеюсь, дисплей и Ардуину соединяете "накрест" ?
    TXD -> RXD
    RXD -> TXD
    GND -> GND
     
    Mozgoklui нравится это.
  6. Mozgoklui

    Mozgoklui Нуб

    Знание у меня не шибкие увы... замыкать Rx Tx это 0 и 1? или найти скетч где они назначены на другие цифровые выходы? И при замыкании rx tx не будет ли проблем с заливкой скетча? Я просто по незнанию подозреваю что usb которым ардуина подключена к компу и rt tx как-то взаимосвязаны.
    Поискал темы по соединению rxtx в надежде найти готовый скетч, да не нашел. А те что нашел в подобных темах, выдают абракадабру в порт, вне зависимости от того, замкнуты или нет rxtx...
    Да. Пробовал как скетчи с rxtx (d0,d1) так и с цифровыми (d2,d3). И тот и тот вариант подключал и прямо и крест накрест, реакции ноль.
     
  7. Belkin

    Belkin Гик

    Замыкать - значит поставить между ними перемычку. ;)
    Лучше - вместо перемычки использовать резистор 100...200 Ом.
    "Прямо" или "накрест" - не страшно, просто в одном случае ("прямо") не будет работать.
    Главное, чтоб при экспериментах питание (+5в) не попало на линию TXD - кирдык ей обеспечен сразу, тогда только "к хирургу"...
     
  8. Mozgoklui

    Mozgoklui Нуб

    Я извиняюсь за неправильные выражения, попытаюсь снова. Пока делал скетчи (ну как делал, скачивал готовые для разных модулей) понял, что экран вешают либо напрямую на ноги ардуино, подписанные как Rx Tx (они собственно и обозначаются как 0 и 1), либо на другие цифровые входы, описывая их в скетче как serial. Вот я и спрашивал, что именно замыкать, родные входы или дигитальные, с указанием их в скетче. Чем замыкать я понимаю.
    Прямо и накрест пробовал по всякому, знаю что вреда не будет, но и реакции ноль.
    Что еще попробовать?
     
  9. Belkin

    Belkin Гик

    Неважно, какие ноги Ардуино у вас задействованы, аппаратные (подписанные) или программные, вами назначеные.
    Суть UART от этого не меняется, логика работы и схемотехника тоже, но только применительно к UART.

    Посему схема соединений будет всегда одна:
    Nextion Arduino
    TXD RXD
    RXD TXD
    GND GND

    Если "не работает", то:
    - у кого-то из этой пары "сдох" UART
    В случае с Ардуино можно попробовать использовать программный, задействовав любые ноги.
    Если проблема с дисплеем, то все гораздо хуже, у него нет другого какала связи с внешним миром...
    - у "кого-то" ;) что-то не так с отправкой/приемом данных
    Читаем тему сначала... ;)
     
  10. Mozgoklui

    Mozgoklui Нуб

    Вы хоть намекните, о чем искать в теме, я ее раза два проходил...
    Думаю с ардуино всё в порядке, но не знаю как проверить дисплей на связь..
     
  11. Belkin

    Belkin Гик

    Могу предложить конвертер USB-UART, например такой http://amperka.ru/collection/interfaces/product/troyka-usb-uart
    Вопрос в том, что надо видеть, что "прилетает" от дисплея.
    Чем это "увидеть" - вот для вас вопрос... ;)
    Насколько понимаю, кроме Ардуины и желания под руками ничего больше нет.
    Так нельзя. Чтоб что-то сделать, надо сначала инструментом "обрасти"... ;)
     
  12. Belkin

    Belkin Гик

    Я не видел вашего листинга, потому пока не смогу дать направления для поиска, а телепатией природа обделила... ;)
     
  13. Mozgoklui

    Mozgoklui Нуб

    Хм, а что такое листинг?)))
    Я usb ttl на всякий случай уже заказал с али, правда ждать долго.
    Из инструмента увы, дисплей, кучка китайских ардуино нано и еще большая куча модулей для ардуино, всякие там вайфаи и датчики.
     
  14. Belkin

    Belkin Гик

    Текст программы, по-местному "скетч"... ;)
    Сам я работаю с другим языком, а в Си - "как верный песик, все понятно, но говорить не умею"... ;)
    Не получается у меня как-то с ним дружбы... ;)
    Так попробуйте другую Ардуину хотя бы... ;)
    С учетом ранее изложенного.
     
  15. Belkin

    Belkin Гик

    Проверить отправку на дисплей можно так:
    - соединяем на Ардуино RX и TX (ранее было описано)
    - отправляем в UART цепочку байтов "для дисплея"
    - ловим ответ и сравниваем с отправкой
    - при совпадении на 100% (только так) зажигаем светодиод

    Проверить прием от дисплея:
    - соединяем дисплей и Ардуино (ранее было описано)
    - зная, что должен отправить дисплей, заранее "вписываем" в скетч
    - принудительно отправляем эти же данные с дисплея
    - сравниваем принятое с заранее записаным
    - при совпадении на 100% (только так) зажигаем светодиод

    Не вздумайте подавать +5в на дисплей от Ардуино !
    Для дисплея нужен самостоятельный блок питания !
     
  16. parovoZZ

    parovoZZ Гуру

    USB ttl очень просто делается из леонардо и его клонов.
     
  17. Mozgoklui

    Mozgoklui Нуб

    я попробовал собрать схему в flprog, т.к. программировать в ide не умею. Собрал как мог, по наитию, посмотрите пжлста
    IMG_7800.jpg
    поставил опрос usb юарта и отправку в текстовое поле t0 экрана. Попутно стоит чтение этой же переменной экрана, сравнение ее с отправленной и отправка в usb юарт. Экран вписан в ноги 2 и 3, которые и замкнул.
    IMG_7799.jpg
    Явно я что-то делаю не так, поскольку результата ноль...
    Вот скетч что выдал flprog:
    Код (C++):
    #include <SoftwareSerial.h>
    SoftwareSerial Serial100(2, 3);

    String _nextionSaveDataTXT_P0_E1;
    struct _nextionLissenStruct{
    char code;
    String result;
    long number;
    };
    _nextionLissenStruct _nextionTempLissen;
    String _RVFU1Data;
    bool _changeNumber1_Out = 0;
    int _changeNumber1_OLV;
    bool _nextionSetAttr1_isNU = 0;
    bool _nextionSetAttr1_oldState = 0;
    String _nextionGetValue1_outputValue;
    long _nextionGetValue1_StartTime;
    bool _nextionGetValue1_isNU = 0;
    unsigned long _stou1 = 0UL;
    void setup()
    {
    Serial100.begin(9600);
    Serial.begin(9600);
    Serial100.begin(9600);
    _stou1 = millis();
    nextionSendCommand("", 100);
    nextionSendCommand("page 0", 100);
    _nextionGetValue1_StartTime = millis();
    }
    void loop()
    {String _tempVariable_String;
    int _tempVariable_int;
    if (Serial.available()) { _readByteFromUART((Serial.read()),0);}




    //Плата:1
    if(_isTimer(_nextionGetValue1_StartTime, 1000)){ _nextionGetValue1_StartTime = millis(); _nextionGetValue1_isNU = 1; }
    if(_nextionGetValue1_isNU){_tempVariable_String = "get page0.t0.txt";
    _nextionTempLissen = nextionSendCommand(_tempVariable_String.c_str(), 100);
    if(_nextionTempLissen.code = 'p') {_nextionGetValue1_outputValue = _nextionTempLissen.result;};
    _nextionGetValue1_isNU = 0;}
    if ((((_RVFU1Data).toInt())) == (((_nextionGetValue1_outputValue).toInt()))){ if (_isTimer(_stou1, 1000 )) {Serial.print(_nextionGetValue1_outputValue); _stou1 = millis();}} else {_stou1 = millis();}
    if (_changeNumber1_Out) {_changeNumber1_Out = 0;} else {_tempVariable_int = ((_RVFU1Data).toInt());
    if (_tempVariable_int != _changeNumber1_OLV) {_changeNumber1_OLV = _tempVariable_int; _changeNumber1_Out = 1;}
    }
    if (_changeNumber1_Out) { if (! _nextionSetAttr1_oldState ) {_nextionSetAttr1_oldState = 1; _nextionSetAttr1_isNU = 1; _nextionSaveDataTXT_P0_E1 =  _RVFU1Data ;}} else {_nextionSetAttr1_oldState = 0;}if (_nextionSetAttr1_isNU) {_tempVariable_String = String("page0.t0.txt=\"") +_nextionSaveDataTXT_P0_E1 +String("\"");
    nextionSendCommand(_tempVariable_String.c_str(), 100);
    _nextionSetAttr1_isNU = 0; }



    }
    bool _isTimer(unsigned long startTime, unsigned long period )
      {
      unsigned long currentTime;
    currentTime = millis();
    if (currentTime>= startTime) {return (currentTime>=(startTime + period));} else {return (currentTime >=(4294967295-startTime+period));}
      }
    void _readByteFromUART(byte data,int port)
    {
    if (port==0){_RVFU1Data = String(char(data));}
    }
    struct _nextionLissenStruct nextionSendCommand(const char* cmd, byte port )
    {
    while (Serial100.available()){Serial100.read(); }
    Serial100.print(cmd);
    Serial100.write(0xFF);
    Serial100.write(0xFF);
    Serial100.write(0xFF);
    return nextionListen(port);
    }
    struct _nextionLissenStruct nextionListen( byte port )
    {
    byte _bite;
    byte _end = 0xff;
    byte cmd[100];
    int index = 0;
    _nextionLissenStruct temp;
    temp.result = "";
    temp.code = 'z';
    temp.number = 0;
    int countEnd = 0;
    delay(50);
    long startTime = millis();
    while(! (countEnd==3)) {
    while(Serial100.available()>0){
    if(Serial100.available()>0){
    _bite = Serial100.read();
    cmd[index] = _bite;
    index++;
    if(_bite == _end){countEnd++;}
    if(countEnd == 3){break;}
    }}
    if(_isTimer(startTime, 100)) {return temp;}
    }
      switch (cmd[0]) {
      case 0x66:
      temp.code = 'f';
      temp.result = String(cmd[1], DEC);
        return temp;
        break;
      case 0x70:
          temp.code = 'p';
        for (int i = 1; i < index - 3; i++) {
        temp.result += char(cmd[i]);}
        return temp;
        break;
    case 0x71:
          temp.code = 'q';
        temp.number = (cmd[4] << 24) | (cmd[3] << 16) | (cmd[2] << 8) | (cmd[1]);
        return temp;
        break;
      default:
        return temp;
        break;
      }  
      return temp;
    }
    int nextionAskPageNamper(byte port)
    {
    int result;
    _nextionLissenStruct temp;
    temp =  nextionSendCommand("sendme",port);
      if((temp.code == 'f')&&(temp.result != "")){result = temp.result.toInt();} else {result = -1;}
    return result;
    }
     
  18. Belkin

    Belkin Гик

    В принципе все верно, только нет физической индикации принятого по UART (светодиод).
    Другой же индикации никакой нет на Ардуино, цепляйте внешний.

    Скетч "от flprog" довольно скученный, лично мне более-менее стал понятен только после третьего прочтения... ;)
    На этом этапе хотелось бы, чтоб в нашу беседу влился "сишник"... ;)

    Единственное, что я понял (возможно ошибаюсь), вы ожидаете в качестве принятой строки "get page0.t0.txt".
    Это неверно, т.к. "get" - это внутренняя команда дисплея, она им не отправляется.
    В качестве "эха" надо ожидать "page0.t0.txt".
     
  19. Mozgoklui

    Mozgoklui Нуб

    Сейчас подправил, добавив диод на 13 пине.
    Нет, я ожидаю в ответ цифры, которые сам и отправлю в uart. То бишь цифры в формате string как считываются с юарта, так и сразу летят в nextion. Попутно они считываются с дисплея и сравниваются с отправленными на него (для этого числа конвертятся string-int, для сравнения), если совпадение есть - отправляются в uart. По факту что-то тут не так, засел сегодня буду думу думать.
     
  20. Belkin

    Belkin Гик

    Давайте для начала получим адекватное "эхо" по UART без дисплея... ;)
    Дисплейчик хоть какой-нибудь есть ? Прицепите к Ардуино и выкладывайте на него принятую посылку.
    Ну надо же хоть что-то видеть... ;)