This is a 2D-Pager with 4" TFT touch screen.What would you do with that 2D-Pager ?- cheating in tests ?- send a handwritten love letter ?- draw a picture together ?- play a game of "tic tac toe" ?- sending tactical information ?Based on a esp32-dev board with serial communication via Bluetooth (HC-05)The HC-05 is contacted with a pin-header.. so in theory another module could be plugged in instead. For example a LoRa module (combined with a esp as UART -> LoRa bridge)This is the first technique demonstrator.To Do:1) I just found out the HC-05 Bluetooth module got a state pin, which could tell the esp32 if its connected to the other side. So I'll prepare a boot-/ "wait for sync"-screen, while unconnected.2) A button to reset the screen on both sides. I would love to have a dedicated button on top, but the space in the housing is getting less, so I have to put it on the screen - probably in the top left corner.
More information: Here
#include "FS.h"
#include <SPI.h>
#include <TFT_eSPI.h>
TFT_eSPI tft = TFT_eSPI();
//#include <SoftwareSerial.h>
//SoftwareSerial mySerial(16, 17); // RX, TX
#define CALIBRATION_FILE "/calibrationData1"
void setup(void) {
uint16_t calibrationData[5];
uint8_t calDataOK = 0;
Serial.begin(115200);
Serial2.begin(115200);
// mySerial.begin(38400);
Serial.println("starting");
tft.init();
// SPI.begin();
// SPI.setFrequency(1000000);
tft.setRotation(3);
tft.fillScreen(TFT_BLACK);
tft.setCursor(20, 0, 2);
tft.setTextColor(TFT_BLACK, TFT_WHITE); tft.setTextSize(1);
tft.println("calibration run");
// check file system
if (!SPIFFS.begin()) {
Serial.println("formating file system");
SPIFFS.format();
SPIFFS.begin();
}
// check if calibration file exists
if (SPIFFS.exists(CALIBRATION_FILE)) {
File f = SPIFFS.open(CALIBRATION_FILE, "r");
if (f) {
if (f.readBytes((char *)calibrationData, 14) == 14)
calDataOK = 1;
f.close();
}
}
if (calDataOK) {
// calibration data valid
tft.setTouch(calibrationData);
} else {
// data not valid. recalibrate
tft.calibrateTouch(calibrationData, TFT_WHITE, TFT_RED, 15);
// store data
File f = SPIFFS.open(CALIBRATION_FILE, "w");
if (f) {
f.write((const unsigned char *)calibrationData, 14);
f.close();
}
}
tft.fillScreen(TFT_WHITE);
}
static uint16_t color;
uint16_t x, y, xold, yold, r;
int inputcounter = 0, xin, yin, oldxin, oldyin;
int touched_status=0, touched_latch=0, rtouched_status=0, rtouched_latch=0, reciever_loop_counter=0;
char message[] = "",message_byte, message_segment[] = "";
void loop()
{
if (Serial2.available())
{ // If anything comes in Serial1 (pins 0 & 1)
message_byte=char(Serial2.read()); // input-Format: T x208 y214 N
Serial.print(message_byte); Serial.print("");
if(message_byte =='x')xin=Serial2.parseInt(); ////// Erst Nachricht einlesen, dann auswerten...
if(message_byte =='y')yin=Serial2.parseInt(); // jeder 2. Loopdurchgang werden er x und y aktuell sein
if(message_byte =='N')
{
rtouched_status=0; Serial.println(" rtouched_status=0 ");
reciever_loop_counter=0;
rtouched_latch=0;
}
if(message_byte =='T')
{
rtouched_status=1; Serial.println(" rtouched_status=1 ");
rtouched_latch=0; Serial.println(" rtouched_latch=0 ");
}
if(reciever_loop_counter>2 && reciever_loop_counter%2==0) // jeder 2. Loopdurchgang werden er x und y aktuell sein, darum %2
{
if (rtouched_status==1)
{
if(rtouched_latch==0)
{
oldxin=xin;
oldyin=yin;
rtouched_latch=1;
}
tft.drawLine(oldxin*2, oldyin*2, xin*2, yin*2, TFT_RED); Serial.println(" draw Line ");
}
if (rtouched_status==0)
{
tft.drawPixel(xin*2, yin*2, TFT_RED); Serial.print(" draw Pixel ");
}
oldxin=xin;
oldyin=yin;
}
reciever_loop_counter++;
}
/*
if (tft.getTouch(&x, &y))
{
if(touched_status==1)
{
tft.drawLine(xold, yold, x, y, TFT_BLACK);
}
if(touched_status==0)
{
if(touched_latch==0)
{
touched_latch=1;
}
tft.drawPixel(x, y, TFT_RED);
touched_status=1;
}
xold = x;
yold = y;
}
else
{
touched_status=0;
if(touched_latch==1)
{
touched_latch=0;
}
}
*/
//intx = atoi(123\0)
/*
for (int i = 0; i < message.length(); i++)
{
Serial.print(message[i]);
}
*/
if (tft.getTouch(&x, &y))
{
// tft_draw();
inputcounter++;
if(touched_status==1)
{
tft.drawLine(xold, yold, x, y, TFT_BLUE);
}
if(touched_status==0)
{
if(touched_latch==0)
{
Serial.print(" T");
Serial2.write("T");
touched_latch=1;
}
tft.drawPixel(x, y, TFT_BLUE);
touched_status=1;
}
// Serial.print(" x");Serial.print(lowByte(x));Serial.print(" y");Serial.print(lowByte(y));
// delay(10);
Serial2.write("x");
Serial2.print(lowByte(x/2)); Serial2.print("\0");
Serial2.write("y");
Serial2.print(lowByte(y/2)); Serial2.print("\0");
xold = x;
yold = y;
color += 200;
}
else
{
touched_status=0;
if(touched_latch==1)
{
Serial.println(" N");
Serial2.write("N\n");
touched_latch=0;
/*
Serial.print("Länge der nachricht: ");Serial.print(message.length());
for (int i = 0; i < message.length(); i++)
{
Serial.print(message[i]);
}
Serial.println();
for (int i = 0; i < message.length(); i++)
{
Serial2.write(message[i]); // Push each char 1 by 1 on each loop pass
delay(5);
}
message="";
Serial.print("Länge der nachricht: ");Serial.print(message.length());
*/
}
/*
Serial.print("Länge der nachricht: ");Serial.println(message.length());
for (int i = 0; i < message.length(); i++)
{
Serial2.write(message[i]);
Serial.write(message[i]);Serial.write(" ");
}
message="";
*/
}
}
void tft_draw()
{
tft.setCursor(5, 5, 2);
tft.printf("x: %i ", x);
tft.setCursor(5, 20, 2);
tft.printf("y: %i ", y);
}
Comments