- سنقوم بانشاء واجهة بسيطة للمكالمات الهاتفية ابستخدام TFT LCD 2.8 مع بوردة ESP8266 Nodemcu نحتاج في كثير من الأحيان إلى جهاز في الوقت الفعلي للمراقبة والعمل عن بُعد. قد لا يكون الهاتف المحمول أو الكمبيوتر المحمول مناسبًا لهذا الغرض لأننا لا نحتاج إلى تفاعلات كثيرة والجهاز بحاجة إلى العمل على مدار الساعة طوال أيام الأسبوع. يمكننا إنشاء مثل هذا الجهاز عن طريق توصيل شاشة تعمل باللمس مع nodemcu. لنرى كيف يمكننا توصيل الاثنين وترميزهما للتفاعل
- المكونات الرئيسية :
- ESP8266 NODEMCU
- 2.8INCH TFT LCD DISPLAY
- JUMPER WIRES
- مخطط الرسم البياني :
- تحميل كود أردوينو :
// Project creates a simple interface of phone calling with ESP8266
// By : DIY Channel
// My YouTube Channel :https://www.youtube.com/c/DIYChannel2019
#include <Arduino.h>
#include <SPI.h>
#include "Adafruit_ILI9341esp.h"
#include "Adafruit_GFX.h"
#include "XPT2046.h"
#define TFT_DC 2
#define TFT_CS 15
/******************* UI details */
#define BUTTON_X 40
#define BUTTON_Y 100
#define BUTTON_W 60
#define BUTTON_H 30
#define BUTTON_SPACING_X 20
#define BUTTON_SPACING_Y 20
#define BUTTON_TEXTSIZE 2
// text box where numbers go
#define TEXT_X 10
#define TEXT_Y 10
#define TEXT_W 220
#define TEXT_H 50
#define TEXT_TSIZE 3
#define TEXT_TCOLOR ILI9341_MAGENTA
// the data (phone #) we store in the textfield
#define TEXT_LEN 12
char textfield[TEXT_LEN+1] = "";
uint8_t textfield_i=0;
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC);
XPT2046 touch(/*cs=*/ 4, /*irq=*/ 5);
/* create 15 buttons, in classic candybar phone style */
char buttonlabels[15][5] = {"Send", "Clr", "End", "1", "2", "3", "4", "5", "6", "7", "8", "9", "*", "0", "#" };
uint16_t buttoncolors[15] = {ILI9341_DARKGREEN, ILI9341_DARKGREY, ILI9341_RED,
ILI9341_BLUE, ILI9341_BLUE, ILI9341_BLUE,
ILI9341_BLUE, ILI9341_BLUE, ILI9341_BLUE,
ILI9341_BLUE, ILI9341_BLUE, ILI9341_BLUE,
ILI9341_ORANGE, ILI9341_BLUE, ILI9341_ORANGE};
Adafruit_GFX_Button buttons[15];
void setup() {
// put your setup code here, to run once:
delay(1000);
Serial.begin(115200);
SPI.setFrequency(ESP_SPI_FREQ);
tft.begin();
touch.begin(tft.width(), tft.height()); // Must be done before setting rotation
Serial.print("tftx ="); Serial.print(tft.width()); Serial.print(" tfty ="); Serial.println(tft.height());
tft.fillScreen(ILI9341_BLACK);
// Replace these for your screen module
touch.setCalibration(1832, 262, 264, 1782);
// create buttons
for (uint8_t row=0; row<5; row++) {
for (uint8_t col=0; col<3; col++) {
buttons[col + row*3].initButton(&tft, BUTTON_X+col*(BUTTON_W+BUTTON_SPACING_X),
BUTTON_Y+row*(BUTTON_H+BUTTON_SPACING_Y), // x, y, w, h, outline, fill, text
BUTTON_W, BUTTON_H, ILI9341_WHITE, buttoncolors[col+row*3], ILI9341_WHITE,
buttonlabels[col + row*3], BUTTON_TEXTSIZE);
buttons[col + row*3].drawButton();
}
}
// create 'text field'
tft.drawRect(TEXT_X, TEXT_Y, TEXT_W, TEXT_H, ILI9341_WHITE);
}
void loop() {
// put your main code here, to run repeatedly:
uint16_t x, y;
if (touch.isTouching())
touch.getPosition(x, y);
// go thru all the buttons, checking if they were pressed
for (uint8_t b=0; b<15; b++) {
if (buttons[b].contains(x, y)) {
//Serial.print("Pressing: "); Serial.println(b);
buttons[b].press(true); // tell the button it is pressed
} else {
buttons[b].press(false); // tell the button it is NOT pressed
}
}
// now we can ask the buttons if their state has changed
for (uint8_t b=0; b<15; b++) {
if (buttons[b].justReleased()) {
// Serial.print("Released: "); Serial.println(b);
buttons[b].drawButton(); // draw normal
}
if (buttons[b].justPressed()) {
buttons[b].drawButton(true); // draw invert!
// if a numberpad button, append the relevant # to the textfield
if (b >= 3) {
if (textfield_i < TEXT_LEN) {
textfield[textfield_i] = buttonlabels[b][0];
textfield_i++;
textfield[textfield_i] = 0; // zero terminate
//fona.playDTMF(buttonlabels[b][0]);
}
}
// clr button! delete char
if (b == 1) {
textfield[textfield_i] = 0;
if (textfield > 0) {
textfield_i--;
textfield[textfield_i] = ' ';
}
}
// update the current text field
Serial.println(textfield);
tft.setCursor(TEXT_X + 2, TEXT_Y+10);
tft.setTextColor(TEXT_TCOLOR, ILI9341_BLACK);
tft.setTextSize(TEXT_TSIZE);
tft.print(textfield);
// its always OK to just hang up
if (b == 2) {
//status(F("Hanging up"));
//fona.hangUp();
}
// we dont really check that the text field makes sense
// just try to call
if (b == 0) {
//status(F("Calling"));
//Serial.print("Calling "); Serial.print(textfield);
//fona.callPhone(textfield);
}
delay(100); // UI debouncing
}
}
}
-------------------------------------------------------------------------
esp8266,esp8266 box,esp8266 12e,esp8266mod,esp8266 case,blynk esp8266,esp8266 alexa,esp8266 errors,esp8266 series,esp8266 nodemcu,nodemcu esp8266,esp8266 example,esp8266 project,esp8266 projects,esp8266 tutorial,neopixel esp8266,esp8266 enclosure,web side on esp8266,esp8266 web server,esp8266 datasheet,esp8266 project box,esp8266 smartwatch,esp8266 project case,esp8266 iot projects,esp8266 access point,esp8266 smart config,best esp8266 projects,esp8266 as wifi router,esp8266 captive portal
No comments:
Post a Comment