Проблема вывода информации на tft 2.4 от bme280

Тема в разделе "Arduino & Shields", создана пользователем prostokorol, 27 ноя 2020.

  1. prostokorol

    prostokorol Нерд

    Помогите разобраться, уже всю голову сломал. Ардуино UNO с шилдом tft 2.4 и датчиком bme280 через I2C. Отдельно могу отобразить скетчем на экране дисплея, отдельно могу через ком порт увидеть работу датчика, а вот данные датчика не выходит вывести на экран. В чем ошибка ?

    Код (C++):
    #define SEALEVELPRESSURE_HPA (1013.25)                  // Задаем высоту

    #include <Adafruit_GFX.h>    // Ядро графической библиотеки
    #include <Adafruit_TFTLCD.h> // Специфика аппаратного обеспечения
    #include <MCUFRIEND_kbv.h>   // Специфика работы с разными чипами

    // *** Define Touchscreen Pin
    #define YP A1
    #define XM A2
    #define YM 5
    #define XP 6


    // *** Define Pin of LCD used
    #define LCD_CS A3
    #define LCD_CD A2
    #define LCD_WR A1
    #define LCD_RD A0
    #define LCD_RESET A4

    // *** Define Name of Color
    #define BLACK   0x0000
    #define WHITE   0xFFFF
    #define RED     0xF800
    #define GREEN   0x07E0
    #define BLUE    0x001F
    #define CYAN    0x07FF
    #define MAGENTA 0xF81F
    #define YELLOW  0xFFE0
    #define GREY    0x2108

    MCUFRIEND_kbv tft; //инициализация объекта дисплея

    #include <Wire.h>                                         // Подключаем библиотеку Wire                  
    #include <Adafruit_Sensor.h>                              // Подключаем библиотеку Adafruit_Sensor
    #include <Adafruit_BME280.h>                              // Подключаем библиотеку Adafruit_BME280
    #define SEALEVELPRESSURE_HPA (1013.25)                    // Задаем высоту              
    #define BME280_ADDRESS                (0x76)

    #define MINPRESSURE 10
    #define MAXPRESSURE 1000

    Adafruit_BME280 bme280; // BME280 на I2C

    void setup(void) {


    Serial.begin(9600);
       //Wire.begin(5/*D1*/, 4/*D3*/); delay(10);
      Serial.println(F("BME280 test"));

      if (!bme280.begin()) {
        Serial.println("Could not find a valid BME280 sensor, check wiring!");
        while (1);
      }

      delay(1000);


      tft.reset(); //сброс дисплея
      tft.begin(); //инициализация дисплея
    tft.fillScreen(BLACK); //дисплей залить черным


        //1 горизонтальная линий
        int w = tft.width();
        tft.drawFastHLine(0, 40, w, WHITE);  // draw horizontal white line at position (0, 30)
          tft.drawFastHLine(0, 80, w, WHITE);  // draw horizontal white line at position (0, 30)

        tft.setCursor(22, 10); //установить курсор в позицию 0,0 (левый верхний угол)
        tft.setTextColor(YELLOW); //установка цвета текста (белый)
        tft.setTextSize(2); //установка размера текста
        tft.println("WEATHER STATION"); //вывести надпись

       
    }
    char _buffer[11];
    void loop() {
    delay(1000);


    // read temperature, humidity and pressure from the BME280 sensor
      float temp = bme280.readTemperature();  // get temperature in °C
      float humi = bme280.readHumidity();     // get humidity in %
      float pres = bme280.readPressure();     // get pressure in Pa

      // print data on the display
      // 1: print temperature (in °C)
      if(temp < 0)    // if temperature < 0
        sprintf( _buffer, "-%02u.%02u", (int)abs(temp), (int)(abs(temp) * 100) % 100 );
      else            // temperature >= 0
        sprintf( _buffer, " %02u.%02u", (int)temp, (int)(temp * 100) % 100 );
      tft.setTextColor(RED, BLACK);  // set text color to red and black background
      tft.setCursor(15, 34);
      tft.print(_buffer);
      tft.drawCircle(173, 40, 4, RED);  // print degree symbol ( ° )
      tft.drawCircle(173, 40, 5, RED);
      tft.setCursor(183, 34);
      tft.print("C");

      // 2: print humidity
      sprintf( _buffer, "%02u.%02u %%", (int)humi, (int)(humi * 100) % 100 );
      tft.setTextColor(CYAN, BLACK);  // set text color to cyan and black background
      tft.setCursor(39, 123);
      tft.print(_buffer);

      // 3: print pressure (in hPa)
      sprintf( _buffer, "%04u.%02uhPa", (int)(pres/100), (int)((uint32_t)pres % 100) );
      tft.setTextColor(YELLOW, BLACK);  // set text color to yellow and black background
      tft.setCursor(0, 212);
      tft.print(_buffer);



      delay(1000);

    }
     
    Последнее редактирование модератором: 27 ноя 2020
  2. prostokorol

    prostokorol Нерд

    Подскажите новичку, не проходите мимо :(
     
  3. prostokorol

    prostokorol Нерд

    написал немного по другому, но суть не поменялась. загорается экран, появляется надпись METEO. потом экран сбрасывается до белого и температура не отображается.
    Код (C++):
    #include <SPFD5408_Adafruit_GFX.h>  
    #include <SPFD5408_Adafruit_TFTLCD.h>
    #include <SPFD5408_TouchScreen.h>
                     
    #include <Adafruit_Sensor.h>                              // Подключаем библиотеку Adafruit_Sensor
    #include <Adafruit_BME280.h>                              // Подключаем библиотеку Adafruit_BME280
    #define SEALEVELPRESSURE_HPA (1013.25)                    // Задаем высоту                
    #define BME280_ADDRESS                (0x76)

    Adafruit_BME280 bme280; // BME280 на I2C

    // *** Define Touchscreen Pin
    #define YP A1
    #define XM A2
    #define YM 5
    #define XP 6

    // *** Define Value of Touchscreen input
    #define TS_MINX 125
    #define TS_MINY 85
    #define TS_MAXX 965
    #define TS_MAXY 905
    TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300);

    // *** Define Pin of LCD used
    #define LCD_CS A3
    #define LCD_CD A2
    #define LCD_WR A1
    #define LCD_RD A0
    #define LCD_RESET A4

    // *** Define Name of Color
    #define BLACK   0x0000
    #define WHITE   0xFFFF
    #define RED     0xF800
    #define GREEN   0x07E0
    #define BLUE    0x001F
    #define CYAN    0x07FF
    #define MAGENTA 0xF81F
    #define YELLOW  0xFFE0
    #define GREY    0x2108

    Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);

    #define MINPRESSURE 10
    #define MAXPRESSURE 1000

    // Meter colour schemes
    #define RED2RED 0
    #define GREEN2GREEN 1
    #define BLUE2BLUE 2
    #define BLUE2RED 3
    #define GREEN2RED 4
    #define RED2GREEN 5

    unsigned long millist;
    String txt1="";

    void setup() {
     
    Serial.begin(9600);
      bme280.begin();// initialize the BME280 sensor
      tft.reset();
      tft.begin(0x9341);  //Or replace it with 0x9325, 0x9228, 0x9230
      tft.setRotation(1); //
       tft.setCursor(22, 10);
        tft.setTextColor(YELLOW);
        tft.setTextSize(2);
       tft.print("METEO");
    }

    void loop() {

    delay(1000);
    if(millis()-millist>=5000) {

            tft.reset();

    txt1="Temp=";

             txt1= txt1+String(bme280.readTemperature());

             txt1= txt1+" *C";
        tft.setCursor(122, 10);
        tft.setTextColor(YELLOW);
        tft.setTextSize(2);
        tft.print(txt1);
       
    millist=millis();
    }

    }
     
  4. Andrey12

    Andrey12 Гик

    А в первом скетче он у тебя выводил на дисплей строку ?
    Код (C++):
    tft.println("WEATHER STATION");//вывести надпись
    Если да то поставь после строк
    Код (C++):
    if(temp <0)   // if temperature < 0
       sprintf( _buffer, "-%02u.%02u", (int)abs(temp), (int)(abs(temp)*100)%100);
    else           // temperature >= 0
       sprintf( _buffer, " %02u.%02u", (int)temp, (int)(temp *100)%100);
      tft.setTextColor(RED, BLACK);// set text color to red and black background
      tft.setCursor(15, 34);
      tft.print(_buffer);
    вывод в Serial
    Код (C++):
    Serial.print("Temperature - "); Serial.println(_buffer);
    Что покажет в Serial?
     
  5. SergeiL

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

    в массив размерностью 11 байт:
    Не поместится.
    Завершающий '\0' будет записан в 12 элемент, то есть испортит память за массивом.
     
  6. prostokorol

    prostokorol Нерд

    Строку показывает нормально с двумя линиями, потом уходит в белый экран и все...
    На добавление показывает ошибку
    exit status 1
    'temp' was not declared in this scope
    на самую первую строчку if(temp <0)// if temperature < 0
     
  7. prostokorol

    prostokorol Нерд

    Я не совсем понимаю что мне исправить надо :(
     
  8. SergeiL

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

    Размер буфера должен быть минимум 12. Больше можно, меньше - нет.
     
  9. prostokorol

    prostokorol Нерд

    я увеличиваю значение (char _buffer[11];), но ничего не меняется....
     
  10. Andrey12

    Andrey12 Гик

    Вот код, он компилируется, но у меня не установлена библиотека bme280, все что ее катается закомментировал.
    Раз в секунду в сериал должны выводится значения переменных temp, humi. pres
    Так же они должны отобразиться на дисплее. Работает? Если заработает будем думать дальше.

    Код (C++):

    #define SEALEVELPRESSURE_HPA (1013.25)                  // Задаем высоту

    #include <Adafruit_GFX.h>    // Ядро графической библиотеки
    #include <Adafruit_TFTLCD.h> // Специфика аппаратного обеспечения
    #include <MCUFRIEND_kbv.h>   // Специфика работы с разными чипами

    // *** Define Touchscreen Pin
    #define YP A1
    #define XM A2
    #define YM 5
    #define XP 6


    // *** Define Pin of LCD used
    #define LCD_CS A3
    #define LCD_CD A2
    #define LCD_WR A1
    #define LCD_RD A0
    #define LCD_RESET A4

    // *** Define Name of Color
    #define BLACK   0x0000
    #define WHITE   0xFFFF
    #define RED     0xF800
    #define GREEN   0x07E0
    #define BLUE    0x001F
    #define CYAN    0x07FF
    #define MAGENTA 0xF81F
    #define YELLOW  0xFFE0
    #define GREY    0x2108

    MCUFRIEND_kbv tft; //инициализация объекта дисплея

    #include <Wire.h>                                         // Подключаем библиотеку Wire                
    //#include <Adafruit_Sensor.h>                              // Подключаем библиотеку Adafruit_Sensor
    //#include <Adafruit_BME280.h>                              // Подключаем библиотеку Adafruit_BME280
    //#define SEALEVELPRESSURE_HPA (1013.25)                    // Задаем высоту
    //#define BME280_ADDRESS                (0x76)

    #define MINPRESSURE 10
    #define MAXPRESSURE 1000

    //Adafruit_BME280 bme280; // BME280 на I2C

    char _buffer[32];

    void setup(void) {
      Serial.begin(9600);
      Serial.println(F("BME280 test"));

      //Wire.begin();

      // if (!bme280.begin()) {
      //   Serial.println("Could not find a valid BME280 sensor, check wiring!");
      //   while (1);
      // }

      delay(1000);


      tft.reset(); //сброс дисплея
      tft.begin(); //инициализация дисплея
      tft.fillScreen(BLACK); //дисплей залить черным


      //1 горизонтальная линий
      int w = tft.width();
      tft.drawFastHLine(0, 40, w, WHITE);  // draw horizontal white line at position (0, 30)
      tft.drawFastHLine(0, 80, w, WHITE);  // draw horizontal white line at position (0, 30)

      tft.setCursor(22, 10); //установить курсор в позицию 0,0 (левый верхний угол)
      tft.setTextColor(YELLOW); //установка цвета текста (белый)
      tft.setTextSize(2); //установка размера текста
      tft.println("WEATHER STATION"); //вывести надпись


    }


    void loop() {
      // read temperature, humidity and pressure from the BME280 sensor
    //  float temp = bme280.readTemperature();  // get temperature in °C
    //  float humi = bme280.readHumidity();     // get humidity in %
    //  float pres = bme280.readPressure();     // get pressure in Pa

      float temp = 36.6;
      float humi = 70;
      float pres = 753;

      // print data on the display
      // 1: print temperature (in °C)
      if (temp < 0)   // if temperature < 0
        sprintf( _buffer, "-%02u.%02u", (int)abs(temp), (int)(abs(temp) * 100) % 100 );
      else            // temperature >= 0
        sprintf( _buffer, " %02u.%02u", (int)temp, (int)(temp * 100) % 100 );
      tft.setTextColor(RED, BLACK);  // set text color to red and black background
      tft.setCursor(15, 34);
      tft.print(_buffer);
      Serial.print(F("temperature - ")); Serial.println(_buffer);
      tft.drawCircle(173, 40, 4, RED);  // print degree symbol ( ° )
      tft.drawCircle(173, 40, 5, RED);
      tft.setCursor(183, 34);
      tft.print("C");

      // 2: print humidity
      sprintf( _buffer, "%02u.%02u %%", (int)humi, (int)(humi * 100) % 100 );
      tft.setTextColor(CYAN, BLACK);  // set text color to cyan and black background
      tft.setCursor(39, 123);
      tft.print(_buffer);
      Serial.print(F("humidity - ")); Serial.println(_buffer);

      // 3: print pressure (in hPa)
      sprintf( _buffer, "%04u.%02uhPa", (int)(pres / 100), (int)((uint32_t)pres % 100) );
      tft.setTextColor(YELLOW, BLACK);  // set text color to yellow and black background
      tft.setCursor(0, 212);
      tft.print(_buffer);
      Serial.print(F("pressure - ")); Serial.println(_buffer);



      delay(1000);

    }
     
  11. prostokorol

    prostokorol Нерд

    Все работает, на экране отображает и мою надпись и значения 36.59 70.00 0007.53. СОМ порт тоже каждую секунду пишет значения
     
  12. Andrey12

    Andrey12 Гик

    А ты уверен что модуль BME280 работает?

    Загрузи вот в таком виде, что в сериал выдает?

    Если Сериал пустой то попробуй раскомментировать 51 строку - //Wire.begin(); и попробуй еще раз.
    Если будет опять пустой то будем отдельно смотреть что с BME280.

    Код (C++):
    #define SEALEVELPRESSURE_HPA (1013.25)                  // Задаем высоту

    #include <Adafruit_GFX.h>    // Ядро графической библиотеки
    #include <Adafruit_TFTLCD.h> // Специфика аппаратного обеспечения
    #include <MCUFRIEND_kbv.h>   // Специфика работы с разными чипами

    // *** Define Touchscreen Pin
    #define YP A1
    #define XM A2
    #define YM 5
    #define XP 6


    // *** Define Pin of LCD used
    #define LCD_CS A3
    #define LCD_CD A2
    #define LCD_WR A1
    #define LCD_RD A0
    #define LCD_RESET A4

    // *** Define Name of Color
    #define BLACK   0x0000
    #define WHITE   0xFFFF
    #define RED     0xF800
    #define GREEN   0x07E0
    #define BLUE    0x001F
    #define CYAN    0x07FF
    #define MAGENTA 0xF81F
    #define YELLOW  0xFFE0
    #define GREY    0x2108

    MCUFRIEND_kbv tft; //инициализация объекта дисплея

    #include <Wire.h>                                         // Подключаем библиотеку Wire                
    #include <Adafruit_Sensor.h>                              // Подключаем библиотеку Adafruit_Sensor
    #include <Adafruit_BME280.h>                              // Подключаем библиотеку Adafruit_BME280
    #define SEALEVELPRESSURE_HPA (1013.25)                    // Задаем высоту
    #define BME280_ADDRESS                (0x76)

    #define MINPRESSURE 10
    #define MAXPRESSURE 1000

    Adafruit_BME280 bme280; // BME280 на I2C

    char _buffer[32];

    void setup(void) {
      Serial.begin(9600);
      Serial.println(F("BME280 test"));

      //Wire.begin();

       if (!bme280.begin()) {
         Serial.println("Could not find a valid BME280 sensor, check wiring!");
         while (1);
       }

      delay(1000);


      tft.reset(); //сброс дисплея
      tft.begin(); //инициализация дисплея
      tft.fillScreen(BLACK); //дисплей залить черным


      //1 горизонтальная линий
      int w = tft.width();
      tft.drawFastHLine(0, 40, w, WHITE);  // draw horizontal white line at position (0, 30)
      tft.drawFastHLine(0, 80, w, WHITE);  // draw horizontal white line at position (0, 30)

      tft.setCursor(22, 10); //установить курсор в позицию 0,0 (левый верхний угол)
      tft.setTextColor(YELLOW); //установка цвета текста (белый)
      tft.setTextSize(2); //установка размера текста
      tft.println("WEATHER STATION"); //вывести надпись


    }


    void loop() {
      // read temperature, humidity and pressure from the BME280 sensor
      float temp = bme280.readTemperature();  // get temperature in °C
      float humi = bme280.readHumidity();     // get humidity in %
      float pres = bme280.readPressure();     // get pressure in Pa

      //float temp = 36.6;
      //float humi = 70;
      //float pres = 753;

      // print data on the display
      // 1: print temperature (in °C)
      if (temp < 0)   // if temperature < 0
        sprintf( _buffer, "-%02u.%02u", (int)abs(temp), (int)(abs(temp) * 100) % 100 );
      else            // temperature >= 0
        sprintf( _buffer, " %02u.%02u", (int)temp, (int)(temp * 100) % 100 );
      tft.setTextColor(RED, BLACK);  // set text color to red and black background
      tft.setCursor(15, 34);
      tft.print(_buffer);
      Serial.print(F("temperature - ")); Serial.println(_buffer);
      tft.drawCircle(173, 40, 4, RED);  // print degree symbol ( ° )
      tft.drawCircle(173, 40, 5, RED);
      tft.setCursor(183, 34);
      tft.print("C");

      // 2: print humidity
      sprintf( _buffer, "%02u.%02u %%", (int)humi, (int)(humi * 100) % 100 );
      tft.setTextColor(CYAN, BLACK);  // set text color to cyan and black background
      tft.setCursor(39, 123);
      tft.print(_buffer);
      Serial.print(F("humidity - ")); Serial.println(_buffer);

      // 3: print pressure (in hPa)
      sprintf( _buffer, "%04u.%02uhPa", (int)(pres / 100), (int)((uint32_t)pres % 100) );
      tft.setTextColor(YELLOW, BLACK);  // set text color to yellow and black background
      tft.setCursor(0, 212);
      tft.print(_buffer);
      Serial.print(F("pressure - ")); Serial.println(_buffer);



      delay(1000);

    }
     
  13. prostokorol

    prostokorol Нерд

    Экран стал белым, а в сериал норм инфа
    temperature - 18.37
    humidity - 63.83 %
    pressure - 0964.15hPa
    temperature - 18.37
    humidity - 63.04 %
    pressure - 0964.12hPa
    До этого я все по тдельности проверил, экранчиек рисовался всем, в сериал запускал вывод информации. А вот вывести на экран от датчика не могу, экранчик заливается белым и усе, пустота
     
  14. Andrey12

    Andrey12 Гик

    В общем понял я в чем дело.
    У тебя же используется A4 как ресет дисплея!
    #define LCD_RESET A4 - А4 это не что иное как SDA у I2C. Как только I2C начинает по твоим запросам слать данные, LCD и сбрасывается.
    Переключи этот пин на Reset ардуины и будет тебе счастье :) Если провода то несложно сделать, если у тебя шилд то надо выпаять из шилда штырек, и проводом подпаять контакт LCD_RST на reset ардуины. Но все делать надо аккуратно чтоб не сломать и не спалить.

    Прописать LCD_RESET все равно надо , можно например так #define LCD_RESET A3 там у дисплея cs линия, дернется при инициализации, ниче страшного не должно происходить.
     
  15. prostokorol

    prostokorol Нерд

    Странно конечно, но датчик у меня выведен на отдельные пины у ардуино (SCL и SDA), пины экрана я не задействовал. Я могу конечно выпаять пин сброс экрана, но что бы его перепаять на резет ардуинки там сопротивление надо из того что я нагуглил, а оно ко мне еще с китая не пришло ))) А если его просто не подключать и убрать из скетча обращение на сброс ? что бы проверить догадку....
     
  16. Andrey12

    Andrey12 Гик

    Ну отдельные пины SDA и SCL это те же самые А4 и А5 если есть тестер можешь прозвонить самостоятельно, они соединены.
    Просто иногда для удобства подключения делают дополнительные контактные площадки.
    К Reset не надо никакого резистора? с чего бы? А где нагуглил пришли почитаю.

    Хорошо, если без резистора страшно, удали из гребенки штырек LCD_RST , припаяй с обратной стороны LCD_RST штырьку SD_SS, который подключается к цифровому выводу 10 ардуины, там резистор не нужен, напиши #define LCD_RESET 10
    Но это при условии что не используешь SD карту на шилде дисплея.
     
  17. prostokorol

    prostokorol Нерд

    БЛАГОДАРЮ!!!!! Итогом я освободил А4 и перебросил его на сброс ардуино. Прописал #define LCD_RESET RST и все заработало!!!! Теперь буду допиливать графику !!!
    P.S только вот через минуты три экран сбрасывается на белый и усе, потом пусто. Пытаюсь перезалить и виснет на стадии загрузки. Сменой порта и какими то танцами с бубном могу перезалить, но потом происходит так же все ....
    P/P/S перезаливкой разных скетчей и возвратом все на место я его еле вернул к жизни.... Что то видимо идет не так, когда А4 напрямую припаен к RST ардуино
     
    Последнее редактирование: 30 ноя 2020
  18. prostokorol

    prostokorol Нерд


    вот тут где то с 3 минуты он про резет говорит и там сопротивлением он соеденил
     
    Andrey12 нравится это.
  19. Andrey12

    Andrey12 Гик

    Ага глянул, погуглил, оказывается распространенная проблема. Но в видео наверное неправильно товарищ перевел с форума ардуино решение проблемы. Там в некоторых постах пишут что или подсоедините к RESET ардуины или подтяните к +5V резистором 10кОм. Вот например https://forum.arduino.cc/index.php?topic=447062.msg3076056#msg3076056 или тут https://forum.arduino.cc/index.php?topic=625747.msg4238163#msg4238163
    Либо пишут что соединяют с ресет https://forum.arduino.cc/index.php?topic=209161.msg3508767#msg3508767
    Потому как RESET ардуины и так подтянут к +5 резистором. Вот на схеме ниже это видно. То есть соединить RST дисплея и RESET ардуины это то же самое что подтянуть RST дисплея к +5 через резистор.

    А вот почему дисплей белеет и потом ардуина не заводится это вопрос. В коде точно ничего больше не меняли? Может быть и код виноват. Размер буфера достаточный? Выше писали об что будут проблемы с buffer[11]...

    Как вариант, можете соеденить и резистором, думаю хуже не будет. Отпишитесь про результат.

    upload_2020-11-30_8-49-3.png
     
  20. akl

    akl Гуру

    што? :eek:
     
    Andrey12 нравится это.