Ребят, усть рабочие варианты для дисплея на st7735? Нужно подключить TFT 1.8 SPI 128X160 к NODE MCU Пробовал как в видео, но не пошло( Похоже библиотеку обновили Перепечатал скетч с видео. Код (C++): #include <Adafruit_GFX.h> // Core graphics library #include <Adafruit_ST7735.h> // Hardware-specific library for ST7735 #include <SPI.h> #define TFT_CS D1 #define TFT_RST D0 #define TFT_DC D2 Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST); const uint16_t grey = 0x5AEB; const uint16_t white = 0xFFFF; void setup(void) { //Serial.begin(115200); tft.initR(INITR_BLACKTAB); tft.setTextWrap(false); tft.fillScreen(white); tft.setTextColor(grey); tft.setTextSize(2); tft.setCursor(10, 10); tft.println("~ZAOYBSYA~"); tft.setTextSize(1); tft.setCursor(10, 30); tft.println("~~Nu sovsem zayobsya~~"); } void loop () { } похоже библиотеку серьёзно переделали. выдаёт ошибку: Код (C++): Arduino: 1.8.8 (Windows 10), Плата:"NodeMCU 1.0 (ESP-12E Module), 80 MHz, Flash, Enabled, 4M (no SPIFFS), v2 Lower Memory, Disabled, None, Only Sketch, 115200" C:\Users\serov\OneDrive\Documents\Arduino\libraries\Adafruit_ST7735_and_ST7789_Library\Adafruit_ST77xx.cpp: In constructor 'Adafruit_ST77xx::Adafruit_ST77xx(SPIClass*, int8_t, int8_t, int8_t)': C:\Users\serov\OneDrive\Documents\Arduino\libraries\Adafruit_ST7735_and_ST7789_Library\Adafruit_ST77xx.cpp:74:24: error: invalid conversion from 'SPIClass*' to 'int8_t {aka signed char}' [-fpermissive] spiClass, cs, dc, rst) { ^ In file included from C:\Users\serov\OneDrive\Documents\Arduino\libraries\Adafruit_ST7735_and_ST7789_Library\Adafruit_ST77xx.h:31:0, from C:\Users\serov\OneDrive\Documents\Arduino\libraries\Adafruit_ST7735_and_ST7789_Library\Adafruit_ST77xx.cpp:25: C:\Users\serov\OneDrive\Documents\Arduino\libraries\Adafruit_GFX_Library/Adafruit_SPITFT.h:121:5: error: initializing argument 3 of 'Adafruit_SPITFT::Adafruit_SPITFT(uint16_t, uint16_t, int8_t, int8_t, int8_t, int8_t, int8_t, int8_t)' [-fpermissive] Adafruit_SPITFT(uint16_t w, uint16_t h, ^ exit status 1 Ошибка компиляции для платы NodeMCU 1.0 (ESP-12E Module). Этот отчёт будет иметь больше информации с включенной опцией Файл -> Настройки -> "Показать подробный вывод во время компиляции" библиотека https://github.com/adafruit/Adafruit-ST7735-Library
Скетч из примера библиотеки имеет такой вид: Код (C++): /************************************************************************** This is a library for several Adafruit displays based on ST77* drivers. Works with the Adafruit 1.8" TFT Breakout w/SD card ----> http://www.adafruit.com/products/358 The 1.8" TFT shield ----> https://www.adafruit.com/product/802 The 1.44" TFT breakout ----> https://www.adafruit.com/product/2088 as well as Adafruit raw 1.8" TFT display ----> http://www.adafruit.com/products/618 Check out the links above for our tutorials and wiring diagrams. These displays use SPI to communicate, 4 or 5 pins are required to interface (RST is optional). Adafruit invests time and resources providing this open source code, please support Adafruit and open-source hardware by purchasing products from Adafruit! Written by Limor Fried/Ladyada for Adafruit Industries. MIT license, all text above must be included in any redistribution **************************************************************************/ #include <Adafruit_GFX.h> // Core graphics library #include <Adafruit_ST7735.h> // Hardware-specific library for ST7735 #include <Adafruit_ST7789.h> // Hardware-specific library for ST7789 #include <SPI.h> #ifdef ADAFRUIT_HALLOWING #define TFT_CS 39 // Hallowing display control pins: chip select #define TFT_RST 37 // Display reset #define TFT_DC 38 // Display data/command select #define TFT_BACKLIGHT 7 // Display backlight pin #else // For the breakout board, you can use any 2 or 3 pins. // These pins will also work for the 1.8" TFT shield. #define TFT_CS 10 #define TFT_RST 9 // Or set to -1 and connect to Arduino RESET pin #define TFT_DC 8 #endif // OPTION 1 (recommended) is to use the HARDWARE SPI pins, which are unique // to each board and not reassignable. For Arduino Uno: MOSI = pin 11 and // SCLK = pin 13. This is the fastest mode of operation and is required if // using the breakout board's microSD card. // For 1.44" and 1.8" TFT with ST7735 (including HalloWing) use: Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST); // For 1.54" TFT with ST7789: //Adafruit_ST7789 tft = Adafruit_ST7789(TFT_CS, TFT_DC, TFT_RST); // OPTION 2 lets you interface the display using ANY TWO or THREE PINS, // tradeoff being that performance is not as fast as hardware SPI above. //#define TFT_MOSI 11 // Data out //#define TFT_SCLK 13 // Clock out //Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCLK, TFT_RST); float p = 3.1415926; void setup(void) { Serial.begin(9600); Serial.print(F("Hello! ST77xx TFT Test")); #ifdef ADAFRUIT_HALLOWING // HalloWing is a special case. It uses a ST7735R display just like the // breakout board, but the orientation and backlight control are different. tft.initR(INITR_HALLOWING); // Initialize HalloWing-oriented screen pinMode(TFT_BACKLIGHT, OUTPUT); digitalWrite(TFT_BACKLIGHT, HIGH); // Backlight on #else // Use this initializer if using a 1.8" TFT screen: tft.initR(INITR_BLACKTAB); // Init ST7735S chip, black tab // OR use this initializer (uncomment) if using a 1.44" TFT: //tft.initR(INITR_144GREENTAB); // Init ST7735R chip, green tab // OR use this initializer (uncomment) if using a 0.96" 180x60 TFT: //tft.initR(INITR_MINI160x80); // Init ST7735S mini display // OR use this initializer (uncomment) if using a 1.54" 240x240 TFT: //tft.init(240, 240); // Init ST7789 240x240 #endif Serial.println(F("Initialized")); uint16_t time = millis(); tft.fillScreen(ST77XX_BLACK); time = millis() - time; Serial.println(time, DEC); delay(500); // large block of text tft.fillScreen(ST77XX_BLACK); testdrawtext("Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur adipiscing ante sed nibh tincidunt feugiat. Maecenas enim massa, fringilla sed malesuada et, malesuada sit amet turpis. Sed porttitor neque ut ante pretium vitae malesuada nunc bibendum. Nullam aliquet ultrices massa eu hendrerit. Ut sed nisi lorem. In vestibulum purus a tortor imperdiet posuere. ", ST77XX_WHITE); delay(1000); // tft print function! tftPrintTest(); delay(4000); // a single pixel tft.drawPixel(tft.width()/2, tft.height()/2, ST77XX_GREEN); delay(500); // line draw test testlines(ST77XX_YELLOW); delay(500); // optimized lines testfastlines(ST77XX_RED, ST77XX_BLUE); delay(500); testdrawrects(ST77XX_GREEN); delay(500); testfillrects(ST77XX_YELLOW, ST77XX_MAGENTA); delay(500); tft.fillScreen(ST77XX_BLACK); testfillcircles(10, ST77XX_BLUE); testdrawcircles(10, ST77XX_WHITE); delay(500); testroundrects(); delay(500); testtriangles(); delay(500); mediabuttons(); delay(500); Serial.println("done"); delay(1000); } void loop() { tft.invertDisplay(true); delay(500); tft.invertDisplay(false); delay(500); } void testlines(uint16_t color) { tft.fillScreen(ST77XX_BLACK); for (int16_t x=0; x < tft.width(); x+=6) { tft.drawLine(0, 0, x, tft.height()-1, color); delay(0); } for (int16_t y=0; y < tft.height(); y+=6) { tft.drawLine(0, 0, tft.width()-1, y, color); delay(0); } tft.fillScreen(ST77XX_BLACK); for (int16_t x=0; x < tft.width(); x+=6) { tft.drawLine(tft.width()-1, 0, x, tft.height()-1, color); delay(0); } for (int16_t y=0; y < tft.height(); y+=6) { tft.drawLine(tft.width()-1, 0, 0, y, color); delay(0); } tft.fillScreen(ST77XX_BLACK); for (int16_t x=0; x < tft.width(); x+=6) { tft.drawLine(0, tft.height()-1, x, 0, color); delay(0); } for (int16_t y=0; y < tft.height(); y+=6) { tft.drawLine(0, tft.height()-1, tft.width()-1, y, color); delay(0); } tft.fillScreen(ST77XX_BLACK); for (int16_t x=0; x < tft.width(); x+=6) { tft.drawLine(tft.width()-1, tft.height()-1, x, 0, color); delay(0); } for (int16_t y=0; y < tft.height(); y+=6) { tft.drawLine(tft.width()-1, tft.height()-1, 0, y, color); delay(0); } } void testdrawtext(char *text, uint16_t color) { tft.setCursor(0, 0); tft.setTextColor(color); tft.setTextWrap(true); tft.print(text); } void testfastlines(uint16_t color1, uint16_t color2) { tft.fillScreen(ST77XX_BLACK); for (int16_t y=0; y < tft.height(); y+=5) { tft.drawFastHLine(0, y, tft.width(), color1); } for (int16_t x=0; x < tft.width(); x+=5) { tft.drawFastVLine(x, 0, tft.height(), color2); } } void testdrawrects(uint16_t color) { tft.fillScreen(ST77XX_BLACK); for (int16_t x=0; x < tft.width(); x+=6) { tft.drawRect(tft.width()/2 -x/2, tft.height()/2 -x/2 , x, x, color); } } void testfillrects(uint16_t color1, uint16_t color2) { tft.fillScreen(ST77XX_BLACK); for (int16_t x=tft.width()-1; x > 6; x-=6) { tft.fillRect(tft.width()/2 -x/2, tft.height()/2 -x/2 , x, x, color1); tft.drawRect(tft.width()/2 -x/2, tft.height()/2 -x/2 , x, x, color2); } } void testfillcircles(uint8_t radius, uint16_t color) { for (int16_t x=radius; x < tft.width(); x+=radius*2) { for (int16_t y=radius; y < tft.height(); y+=radius*2) { tft.fillCircle(x, y, radius, color); } } } void testdrawcircles(uint8_t radius, uint16_t color) { for (int16_t x=0; x < tft.width()+radius; x+=radius*2) { for (int16_t y=0; y < tft.height()+radius; y+=radius*2) { tft.drawCircle(x, y, radius, color); } } } void testtriangles() { tft.fillScreen(ST77XX_BLACK); int color = 0xF800; int t; int w = tft.width()/2; int x = tft.height()-1; int y = 0; int z = tft.width(); for(t = 0 ; t <= 15; t++) { tft.drawTriangle(w, y, y, x, z, x, color); x-=4; y+=4; z-=4; color+=100; } } void testroundrects() { tft.fillScreen(ST77XX_BLACK); int color = 100; int i; int t; for(t = 0 ; t <= 4; t+=1) { int x = 0; int y = 0; int w = tft.width()-2; int h = tft.height()-2; for(i = 0 ; i <= 16; i+=1) { tft.drawRoundRect(x, y, w, h, 5, color); x+=2; y+=3; w-=4; h-=6; color+=1100; } color+=100; } } void tftPrintTest() { tft.setTextWrap(false); tft.fillScreen(ST77XX_BLACK); tft.setCursor(0, 30); tft.setTextColor(ST77XX_RED); tft.setTextSize(1); tft.println("Hello World!"); tft.setTextColor(ST77XX_YELLOW); tft.setTextSize(2); tft.println("Hello World!"); tft.setTextColor(ST77XX_GREEN); tft.setTextSize(3); tft.println("Hello World!"); tft.setTextColor(ST77XX_BLUE); tft.setTextSize(4); tft.print(1234.567); delay(1500); tft.setCursor(0, 0); tft.fillScreen(ST77XX_BLACK); tft.setTextColor(ST77XX_WHITE); tft.setTextSize(0); tft.println("Hello World!"); tft.setTextSize(1); tft.setTextColor(ST77XX_GREEN); tft.print(p, 6); tft.println(" Want pi?"); tft.println(" "); tft.print(8675309, HEX); // print 8,675,309 out in HEX! tft.println(" Print HEX!"); tft.println(" "); tft.setTextColor(ST77XX_WHITE); tft.println("Sketch has been"); tft.println("running for: "); tft.setTextColor(ST77XX_MAGENTA); tft.print(millis() / 1000); tft.setTextColor(ST77XX_WHITE); tft.print(" seconds."); } void mediabuttons() { // play tft.fillScreen(ST77XX_BLACK); tft.fillRoundRect(25, 10, 78, 60, 8, ST77XX_WHITE); tft.fillTriangle(42, 20, 42, 60, 90, 40, ST77XX_RED); delay(500); // pause tft.fillRoundRect(25, 90, 78, 60, 8, ST77XX_WHITE); tft.fillRoundRect(39, 98, 20, 45, 5, ST77XX_GREEN); tft.fillRoundRect(69, 98, 20, 45, 5, ST77XX_GREEN); delay(500); // play color tft.fillTriangle(42, 20, 42, 60, 90, 40, ST77XX_BLUE); delay(50); // pause color tft.fillRoundRect(39, 98, 20, 45, 5, ST77XX_RED); tft.fillRoundRect(69, 98, 20, 45, 5, ST77XX_RED); // play color tft.fillTriangle(42, 20, 42, 60, 90, 40, ST77XX_GREEN); }
Возникли пара вопросов по скетчу, надеюсь поможете. Вот мой скетч, который показания датчика шлёт в сервис https://cayenne.mydevices.com Код (C++): #include <Adafruit_Sensor.h> #include <Wire.h> #include <CayenneMQTTESP8266.h> #include <Adafruit_BMP280.h> #include <SimpleTimer.h> extern "C" { #include "user_interface.h"; } char ssid[] = "ASUS-CDC0" ; char wifiPassword[] = "00000000" ; SimpleTimer timer; char username[] = "be69a3-11e9-ba40-5d168a516101" ; char password[] = "3f6b82d32ed8fd523c5857b9" ; char clientID[] = "ecff01c0-36b5-4fe3d2557533" ; float in_216184383_1; float in_216184383_2; float Temperature_145241870_1; float Pressure_145241870_1; float Altitude_145241870_1; #define SEALEVELPRESSURE_HPA_145241870_1 (1013.25) Adafruit_BMP280 bmp_145241870_1; // I2C float in_216184383_3; int in_216184383_4; int ESP8266_AnalogInputValue; unsigned long ESP8266_AnalogInputValue_StR; void setup() { ESP8266_AnalogInputValue_StR = millis() + 500 ; Cayenne.begin(username, password, clientID, ssid, wifiPassword); timer.setInterval(5000L, sendUptime_216184383_1); timer.setInterval(30000L, sendUptime_216184383_2); if (!bmp_145241870_1.begin()) { bmp_145241870_1.readTemperature(); while (1); } timer.setInterval(300000L, sendUptime_216184383_3); timer.setInterval(1500L, sendUptime_216184383_4); } void loop() {if(_isTimer(ESP8266_AnalogInputValue_StR, 500)) { ESP8266_AnalogInputValue_StR = millis(); ESP8266_AnalogInputValue = analogRead(A0); } //Плата:1 //Наименование:Esp Cayenne.loop(); timer.run(); { Temperature_145241870_1 = bmp_145241870_1.readTemperature(); Pressure_145241870_1 = bmp_145241870_1.readPressure() / 100.0F * 0.7500; Altitude_145241870_1 = bmp_145241870_1.readAltitude(1032.4); } in_216184383_3 = Altitude_145241870_1; in_216184383_2 = Pressure_145241870_1; in_216184383_1 = Temperature_145241870_1; in_216184383_4 = ESP8266_AnalogInputValue; } 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 sendUptime_216184383_1() { Cayenne.virtualWrite( 0 , in_216184383_1 ); } void sendUptime_216184383_2() { Cayenne.virtualWrite( 1 , in_216184383_2 ); } void sendUptime_216184383_3() { Cayenne.virtualWrite( 2 , in_216184383_3 ); } void sendUptime_216184383_4() { Cayenne.virtualWrite( 3 , in_216184383_4 ); } Хочу эти данные так же вывести на дисплей, но поскольку я чайник, из кода примера мне тяжело выделить нужное. Поправьте что не так(продолжение ниже).
То что нужно прописать библиотеки и инициализировать дисплей, я разобрался Код (C++): #include <Adafruit_GFX.h> // Core graphics library #include <Adafruit_ST7735.h> // Hardware-specific library for ST7735 #include <Adafruit_ST7789.h> // Hardware-specific library for ST7789 #include <SPI.h> #ifdef ADAFRUIT_HALLOWING #define TFT_CS 39 // Hallowing display control pins: chip select #define TFT_RST 37 // Display reset #define TFT_DC 38 // Display data/command select #define TFT_BACKLIGHT 7 // Display backlight pin #else // For the breakout board, you can use any 2 or 3 pins. // These pins will also work for the 1.8" TFT shield. #define TFT_CS 10 #define TFT_RST 9 // Or set to -1 and connect to Arduino RESET pin #define TFT_DC 8 #endif Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST); а вот дальше хуже( как я понимаю void tftPrintTest()- отвечает за вывод текста на экран, но как заставить выводить показания датчика, это вопрос! такая конструкция не работает: void tftPrintTest() { tft.setTextWrap(false); tft.fillScreen(ST77XX_BLACK); tft.setCursor(0, 30); tft.setTextColor(ST77XX_RED); tft.setTextSize(1); tft.println("Temperature_145241870_1"); }
Экран TFT 1.8 дюйма, подключение и вывод текста с NodeMCU, в данном видео вывод данных о YouTube канале. Спасибо за просмотр, критика принимается ))