Всем привет! Вот дождался прибыл ко мне TFT дисплей 2,4 дюйма. Первое что хотелось бы реализовать на нем это использование его как обычного выключателя света. Кто знает как сделать буду благодарен за информацию, так как я не понимаю как управлять устройствами с Ардуино, если экран занимает все входы и выходы. В частности пока надо вывести на экран две кноки вкл и выкл и присобачить к этому реле. Arduino uno НЕ НАДО ПОДНИМАТЬ ЭТИ ВОПРОСЫ Про то что глупая затея и зачем тебе это надо прошу не писать. Планируется в дальнейшем управление системами дома с панелек установленных вместо выключателей в стене, они не дороги и могут быть намного функциональнее обычных выключателей. Про телефон знаю, что можно и с него управлять, эти экраны лишь часть системы и должны быть в стене.
я сам ковырялся с этим вопросом, кое что набросал для примера. но под экран 480:320 для отображения русских букв подключи либу. которую прикрепил к сообщению. а для управления нагрузкой надо реле подключать. По поводу подключения пинов самому интересно, но УНО для этих целей врятли годится, дисплей занимает 8 бит, и ножек практически не остается, но говорю не уверенно) сам начинающий. но если использовать SD ног не останется точно) Код (C++): #include <Adafruit_GFX.h> // Core graphics library #include <MCUFRIEND_kbv.h> #include <TouchScreen.h> #include <EEPROM.h> #include <printrus.h> //тач скрин #define YP A1 // must be an analog pin, use "An" notation! #define XM A2 // must be an analog pin, use "An" notation! #define YM 7 // can be a digital pin #define XP 6 // can be a digital pin TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300); #define BLACK 0x0000 #define BLUE 0x001F #define RED 0xF800 #define GREEN 0x07E0 #define CYAN 0x07FF #define MAGENTA 0xF81F #define YELLOW 0xFFE0 #define WHITE 0xFFFF #define TEST 0x1BF5 #define JJCOLOR 0x1CB6 //ораньжевый #define JJORNG 0xFD03 int homePage; int settings; int blv; int barv; int backlightbox; int press=0; //меняем цвет при нажатии //настройка тача #define TS_MINX 190 #define TS_MINY 130 #define TS_MAXX 860 #define TS_MAXY 900 //чувствительность нажатия на тач #define MINPRESSURE 10 #define MAXPRESSURE 1000 #define LCDROTATION 0 int ledPin = 11; MCUFRIEND_kbv tft; void setup(void) { Serial.begin(9600); Serial.println(F("TFT LCD test")); pinMode(ledPin, OUTPUT); tft.reset(); tft.begin(0x9488); tft.fillScreen(BLACK); tft.setRotation(LCDROTATION); blv = EEPROM.read(1); tft.setTextColor(WHITE); home(); } void home(){ homePage=1; //главная активна ///////////////////////////////////// 1 /////////////////////// tft.setTextSize(2); // tft.fillRect(0,0,320,87, BLUE); // tft.drawRect(0,0,320,87, WHITE); tft.setCursor(100,10); tft.println(utf8rus("Разетка 1")); tft.setTextSize(3); tft.drawRect(20,40,130,45, CYAN); //ободок кнопки 1 tft.drawRect(170,40,130,45, CYAN); //ободок кнопки 2 tft.fillRect(21,41,128,43, JJORNG); // кнопка 1 tft.fillRect(171,41,128,43, JJORNG); //кнопка 2 tft.setCursor(60,53); tft.println(utf8rus("Вкл")); tft.setCursor(200,53); tft.println(utf8rus("Выкл")); //////////////////////////////// 2 /////////////////////////// tft.setTextSize(2); //tft.fillRect(0,90,320,72, BLUE); //tft.drawRect(0,90,320,72, WHITE); tft.setCursor(100,93); tft.println(utf8rus("Разетка 2")); tft.setTextSize(3); tft.drawRect(20,115,130,45, CYAN); //ободок кнопки 3 tft.drawRect(170,115,130,45, CYAN); //ободок кнопки 4 tft.fillRect(21,116,128,43, JJORNG); //кнопка 3 tft.fillRect(171,116,128,43, JJORNG); //кнопка 4 tft.setCursor(60,128); tft.println(utf8rus("Вкл")); tft.setCursor(200,128); tft.println(utf8rus("Выкл")); ///////////////////////////////////// 3 /////////////////////// tft.setTextSize(2); // tft.fillRect(0,165,320,72, BLUE); //tft.drawRect(0,165,320,72, WHITE); tft.setCursor(100,167); tft.println(utf8rus("Разетка 3")); tft.setTextSize(3); tft.drawRect(20,190,130,45, CYAN); //ободок кнопки 5 tft.drawRect(170,190,130,45, CYAN); //ободок кнопки 6 tft.fillRect(21,191,128,43, JJORNG); //кнопка 5 tft.fillRect(171,191,128,43, JJORNG); //кнопка 6 tft.setCursor(60,200); tft.println(utf8rus("Вкл")); tft.setCursor(200,200); tft.println(utf8rus("Выкл")); } void loop() { TSPoint p = ts.getPoint(); //pinMode(XP, OUTPUT); pinMode(XM, OUTPUT); pinMode(YP, OUTPUT); // pinMode(YM, OUTPUT); #if LCDROTATION == 0 if (p.z > MINPRESSURE && p.z < MAXPRESSURE) { // scale from 0->1023 to tft.width p.x = map(p.x, TS_MINX, TS_MAXX, tft.width(), 0); p.y = map(p.y, TS_MINY, TS_MAXY, tft.height(), 0); Serial.print("X = "); Serial.print(p.x); Serial.print("\tY = "); Serial.print(p.y); Serial.print("\tPressure = "); Serial.println(p.z); } #elif LCDROTATION == 1 #elif LCDROTATION == 2 #elif LCDROTATION == 3 #endif if (p.x > 10 && p.x < 100 && p.y > 30 && p.y < 85 && homePage== 1){//кновка 1 Serial.print("\n pressed button 1 \n"); press=1; if (press==1){ tft.setTextSize(3); tft.fillRect(21,41,128,43, GREEN); // кнопка 1 tft.setCursor(60,53); tft.println(utf8rus("Вкл")); delay(150); tft.fillRect(21,41,128,43, JJORNG); // кнопка 1 tft.setCursor(60,53); tft.println(utf8rus("Вкл")); press=0; } } if (p.x > 115 && p.x < 176 && p.y > 30 && p.y < 85 && homePage== 1){//кновка 2 Serial.print("\n pressed button 2 \n"); press=2; if (press==2){ tft.setTextSize(3); tft.fillRect(171,41,128,43, GREEN); //кнопка 2 tft.setCursor(200,53); tft.println(utf8rus("Выкл")); delay(150); tft.fillRect(171,41,128,43, JJORNG); //кнопка 2 tft.setCursor(200,53); tft.println(utf8rus("Выкл")); press=0; } } if (p.x > 10 && p.x < 104 && p.y > 121 && p.y < 160 && homePage== 1){//кновка 3 Serial.print("\n pressed button 3"); press=3; if (press==3){ tft.setTextSize(3); tft.fillRect(21,116,128,43, GREEN); //кнопка 3 tft.setCursor(60,128); tft.println(utf8rus("Вкл")); delay(150); tft.fillRect(21,116,128,43, JJORNG); //кнопка 3 tft.setCursor(60,128); tft.println(utf8rus("Вкл")); press=0; } } if (p.x > 110 && p.x < 198 && p.y > 121 && p.y < 160 && homePage== 1){//кновка 4 Serial.print("\n pressed button 4"); press=4; if (press==4){ tft.setTextSize(3); tft.fillRect(171,116,128,43, GREEN); //кнопка 4 tft.setCursor(200,128); tft.println(utf8rus("Выкл")); delay(150); tft.fillRect(171,116,128,43, JJORNG); //кнопка 4 tft.setCursor(200,128); tft.println(utf8rus("Выкл")); press=0; } } if (p.x > 22 && p.x < 113 && p.y > 190 && p.y < 235 && homePage== 1){//кновка 5 Serial.print("\n pressed button 5"); press=5; if (press==5){ tft.setTextSize(3); tft.fillRect(21,191,128,43, GREEN); //кнопка 5 tft.setCursor(60,200); tft.println(utf8rus("Вкл")); delay(150); tft.fillRect(21,191,128,43, JJORNG); //кнопка 5 tft.setCursor(60,200); tft.println(utf8rus("Вкл")); press=0; } } if (p.x > 120 && p.x < 228 && p.y > 190 && p.y < 235 && homePage== 1){//кновка 6 Serial.print("\n pressed button 6"); press=6; if (press==6){ tft.setTextSize(3); tft.fillRect(171,191,128,43, GREEN); //кнопка 6 tft.setCursor(60,53); tft.println(utf8rus("Вкл")); delay(150); tft.fillRect(171,191,128,43, JJORNG); //кнопка 6 tft.setCursor(200,200); tft.println(utf8rus("Выкл")); press=0; } settings=1; tft.fillRect(0,0,320,480, BLACK); settingsscr(); } // backlight buttons if (p.y >25 && p.y < 65 && p.x > 0 && p.x < 45 && settings == 1) { Serial.print("\n pressed button backlight --"); Serial.print("\n "); blightdown(); } if (p.y > 25 && p.y < 67 && p.x > 150 && p.x < 180 && settings == 1) { Serial.print("\n pressed backlight ++"); Serial.print("\n "); blightup(); } if (p.y > 147 && p.y < 195 && p.x > 54 && p.x < 160 && settings == 1) { // exit settings page tft.fillRect(0,0,320,480, BLACK); // tft. settings=0; // вышли из натсроек homePage=1; // активируем главноге меню // EEPROM.write(1, esleep);// EEPROM.write(1, blv); // сохраняет в первую ячейку памяти значение blv tft.setCursor(60,240); tft.setTextSize(4); tft.print(utf8rus("Сохранено")); delay(1000); tft.fillRect(0,0,320,480, BLACK); home(); // } } void settingsscr() { homePage=0; settings=1; // backlight level tft.setTextColor(WHITE); tft.setTextSize(3); tft.fillRect(0, 20, 60, 50, RED); tft.drawRect(0, 20, 60, 50, WHITE); tft.drawRect(80, 20, 160, 50, JJCOLOR); tft.fillRect(260, 20, 60, 50, GREEN); tft.drawRect(260, 20, 60, 50, WHITE); tft.setCursor(22, 33); tft.print("-"); tft.setCursor(282, 33); tft.print("+"); tft.setTextSize(1); tft.setCursor(120, 31); tft.print("Backlight Level"); tft.drawRect(110, 48, 100, 10, WHITE); blbar(); // sleep time tft.setTextSize(3); tft.fillRect(0, 80, 60, 50, RED); tft.drawRect(0, 80, 60, 50, WHITE); tft.drawRect(80, 80, 160, 50, JJCOLOR); tft.fillRect(260, 80, 60, 50, GREEN); tft.drawRect(260, 80, 60, 50, WHITE); tft.setCursor(22, 93); tft.print("-"); tft.setCursor(282, 93); tft.print("+"); tft.setTextSize(1); tft.setCursor(130, 91); tft.print("Sleep Time"); //save and exit tft.drawRect(80, 140, 160, 50, JJCOLOR); tft.setCursor(120, 160); tft.print("Save and Exit"); } void blbar() { // this function fills the yellow bar in the backlight brightness adjustment if (blv < barv) { tft.fillRect(111, 49, 98, 8, BLACK); } backlightbox = map(blv, 1, 255, 0, 98); tft.fillRect(111, 49, backlightbox, 8, YELLOW); barv = blv; delay(5); } void blightup() { // increase the backlight brightness blv = blv + 1; if (blv >= 255) { blv = 255; } analogWrite(ledPin, blv); blbar(); } void blightdown() { // decrease the backlight brightness blv = blv - 1; if (blv <= 1) { blv = 1; } analogWrite(ledPin, blv); blbar(); }
An4ous Дисплейчик у вас вроде такого, можно полюбопытствовать Ещё хотелось уточнить про работу тача, он адекватно себя ведет, как со стабильностью его работы и точностью позиционирования? Я правильно понял из кода, что вот эти условия отвечают за нажатия в конкретное место дисплея по координатам? Код (C++): if (p.x > 120 && p.x < 228 && p.y > 190 && p.y < 235 && homePage== 1){//кновка 6 Со временем хочу заказать такой дисплейчик с тачем, а пока собираю информацию про них.
именно такой) ну дисплейчик первый так что сравнивать несчем. но кнопки работают отлично, как и сам тач. Да, когда все условия выполнены кнопка срабатывает, и добавил переменную, с ее помощью можно организовать подменю) пример тому 6я кнопка. там хотелось бы реализовать подсветку дисплея на шим. но дисплей не поддерживает его. и еще если будете брать именно на МК ILI9488 как по ссылке, то используйте библиотеку MCUFRIEND_kbv а не Adafruit_TFTLCD. 2я либа работает в 2 раза медленнее, первая довольно шустрая)
а какую библиотеку вы использовали? у меня такой же дисплейчик, но не знаю на каком чипе он, пришел с китая с треснутым сенсором, я так его и забросил не включив даже
Добрый день. Можете подсказать какие-нибудь обучающие статьи по работе с дисплеями. Особенно интересуют примеры создания меню на дисплее. Заранее, спасибо.