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

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

Метки:
  1. Mozgoklui

    Mozgoklui Нуб

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

    Belkin Гик

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

    Belkin Гик

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

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

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

    parovoZZ Гуру

    USB ttl очень просто делается из леонардо и его клонов.
     
  5. 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;
    }
     
  6. Belkin

    Belkin Гик

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

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

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

    Mozgoklui Нуб

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

    Belkin Гик

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

    timon Нерд

    Это почему так? Самый мелкий 320х240 у меня прекрасно работает от бортового питания, которое из USB или повербанка телефонного.
     
  10. Belkin

    Belkin Гик

    Предупреждение в столь категоричной форме потому, что далеко не все задумываются о возможностях ИП на Ардуино, пока не спалят... ;)
     
    timon нравится это.
  11. casius

    casius Нуб

    Подскажите, как можно передать значение одной глобальной переменной с одной страницы в текстовое поле на другой странице внутри NEXTION?
     
  12. Belkin

    Belkin Гик

    <ваша страница>.<текстовое поле>.txt = <переменная>.val
    Можно
    <ваша страница>.<текстовое поле>.txt = <страница с переменной>.<переменная>.val

    Только не забывайте о соответствии типов.
    Если переменная числовая, то в текстовое поле ее не запихнете, надо преобразовывать в txt