Witam wszystkich maniaków Arduino. Już na samym wstępie moi drodzy chciałbym powiedzieć wam, w sumie o swoim napotkanym problemie. Otóż buduje własny projekt nawadniania do ogrodu na bazie ekranu tft 3.5 taki jak ten ,,shield" do arduino uno
.
Przez to że używam tej nakładki niestety brakło mi pinów na to żeby móc swobodnie podpiąć np klawiaturę (nie muszę jej podpinać bo ekran jest dotykowy, ale wiadomo na zewnątrz czasem pada deszcz i zadecydowałem że zostane przy klawiaturze ). Aby podpiąć klawiaturę potrzebowałem użyć expandera.
Wszystko podłączyłem i testowałem. w momencie gdy uzywam tego programu :
wszystko działa ładnie pięknie i cudownie. Kłopoty zaczynają się w momencie jak próbuję połączyć funkcjonalność klawiatury oraz ekranu w jednym kodzie. Oto on
Problem pojawia się konkretnie w miejscu menu if == 6. W poprzednim ifie == 5 po przyciśnięciu przycisku na ekranie uruchamia się funkcja Ustaw_podlewanie(); rysująca moje menu a po wejściu w ifa==6 w miejscu char key = kpd.getKey(); program świruje, ekran robi się biały , a na porcie szeregowym podczas klikania w klawiature pojawiają się odwrócone znaki zapytania i za którymś kliknięciem wyswietli się np 5 lub inna cyferka którą klikam. Proszę bardzo o jakieś rady i wskazówki. Jedyne co mi do głowy przychodzi to, że może ekran też komunikuje się poprzez IC2 i nie mogą działać w tym samym czasie?
Poniżej załączam schemat
.
Przez to że używam tej nakładki niestety brakło mi pinów na to żeby móc swobodnie podpiąć np klawiaturę (nie muszę jej podpinać bo ekran jest dotykowy, ale wiadomo na zewnątrz czasem pada deszcz i zadecydowałem że zostane przy klawiaturze ). Aby podpiąć klawiaturę potrzebowałem użyć expandera.
Wszystko podłączyłem i testowałem. w momencie gdy uzywam tego programu :
Cytat:#include <Wire.h>
#include <Keypad_I2C.h>
#define Keypad_I2CADDR 0x38 // connect pin A0 of 2nd PCF8574 to 5V for address 0x21
// A0 , A1, A2 to ground
const byte ROWS = 4; // four rows
const byte COLS = 3; // four columns
char keys[ROWS][COLS] = {
{'1', '2', '3'},
{'4', '5', '6'},
{'7', '8', '9'},
{'#', '0', '*'}
};
byte rowPins[ROWS] = { 6, 5, 4, 3 };
byte colPins[COLS] = { 2, 1, 0 };
Keypad_I2C kpd( makeKeymap(keys), rowPins, colPins, ROWS, COLS, Keypad_I2CADDR );
void setup() {
Wire.begin();
kpd.begin( makeKeymap(keys) );
Serial.begin(9600);
}
void loop() {
char key = kpd.getKey();
if (key) {
Serial.println(key);
}
}
wszystko działa ładnie pięknie i cudownie. Kłopoty zaczynają się w momencie jak próbuję połączyć funkcjonalność klawiatury oraz ekranu w jednym kodzie. Oto on
Cytat:#include <Adafruit_TFTLCD.h>
#include <Adafruit_GFX.h>
#include <TouchScreen.h>
#include <Keypad_I2C.h>
#include <Wire.h>
#define LCD_CS A3
#define LCD_CD A2
#define LCD_WR A1
#define LCD_RD A0
#define LCD_RESET A4
#define Keypad_I2CADDR 0x38
#define TS_MINX 122
#define TS_MINY 111
#define TS_MAXX 942
#define TS_MAXY 890
#define YP A3
#define XM A2
#define YM 9
#define XP 8
#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 ORANGE 0xFCA0
#define PURPLE 0x780F
#define BROWN 0x8200
Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);
TouchScreen ts = TouchScreen(XP, YP, XM, YM, 364);
char aktualnaStrona = '0';
/* 0 - Menu glowne
* 1 - Wilgotnosci
* 2 - Menu Ustawien
* 3 - Ustawienia Czasu
* 4 - Ustawienia Daty
* 5 - Ustawienia Podlewania
* 6 - PN
* 7 - WT
* 8 - SR
* 9 - CZW
* 10 - PT
* 11 - SB
* 12 - ND
*/
const byte ROWS = 4; // four rows
const byte COLS = 3; // four columns
char keys[ROWS][COLS] = {
{'1', '2', '3'},
{'4', '5', '6'},
{'7', '8', '9'},
{'#', '0', '*'}
};
byte rowPins[ROWS] = { 6, 5, 4, 3 };
byte colPins[COLS] = { 2, 1, 0 };
Keypad_I2C kpd( makeKeymap(keys), rowPins, colPins, ROWS, COLS, Keypad_I2CADDR );
int DT[28] = {15,0,16,0, 15,0,16,0, 15,0,16,0, 15,0,16,0, 15,0,16,0, 15,0,16,0, 15,0,16,0};
void setup () {
tft.reset();
uint16_t identifier = tft.readID();
Wire.begin();
kpd.begin( makeKeymap(keys) );
tft.begin(0x9341);
Menu_glowne();
aktualnaStrona == '0';
}
void loop ()
{
if (aktualnaStrona == '0')
{
TSPoint p = ts.getPoint();
if (p.z > ts.pressureThreshhold)
{
p.x = map(p.x, TS_MAXX, TS_MINX, 0, 320);
p.y = map(p.y, TS_MAXY, TS_MINY, 0, 480);
if(p.x>240 && p.x<320 && p.y>320 && p.y<400 )
{
pinMode(XM, OUTPUT);
pinMode(YP, OUTPUT);
Wilgotnosc();
aktualnaStrona = '1';
}
if(p.x>240 && p.x<320 && p.y>400 && p.y<480 )
{
pinMode(XM, OUTPUT);
pinMode(YP, OUTPUT);
Ustawienia();
aktualnaStrona = '2';
}
}
}
if (aktualnaStrona == '1')
{
TSPoint p = ts.getPoint();
if (p.z > ts.pressureThreshhold)
{
p.x = map(p.x, TS_MAXX, TS_MINX, 0, 320);
p.y = map(p.y, TS_MAXY, TS_MINY, 0, 480);
if(p.x>240 && p.x<320 && p.y>0 && p.y<80 )
{
pinMode(XM, OUTPUT);
pinMode(YP, OUTPUT);
Menu_glowne();
aktualnaStrona = '0';
}
}
}
if (aktualnaStrona == '2')
{
TSPoint p = ts.getPoint();
if (p.z > ts.pressureThreshhold)
{
p.x = map(p.x, TS_MAXX, TS_MINX, 0, 320);
p.y = map(p.y, TS_MAXY, TS_MINY, 0, 480);
if(p.x>240 && p.x<320 && p.y>0 && p.y<80 )
{
pinMode(XM, OUTPUT);
pinMode(YP, OUTPUT);
Menu_glowne();
aktualnaStrona = '0';
}
if(p.x>200 && p.x<240 && p.y>30 && p.y<450 )
{
pinMode(XM, OUTPUT);
pinMode(YP, OUTPUT);
Ustawienia_czasu();
aktualnaStrona = '3';
}
if(p.x>140 && p.x<180 && p.y>30 && p.y<450 )
{
pinMode(XM, OUTPUT);
pinMode(YP, OUTPUT);
Ustawienia_daty();
aktualnaStrona = '4';
}
if(p.x>80 && p.x<120 && p.y>30 && p.y<450 )
{
pinMode(XM, OUTPUT);
pinMode(YP, OUTPUT);
Ustawienia_podlewania();
aktualnaStrona = '5';
}
}
}
if (aktualnaStrona == '3')
{
TSPoint p = ts.getPoint();
if (p.z > ts.pressureThreshhold)
{
p.x = map(p.x, TS_MAXX, TS_MINX, 0, 320);
p.y = map(p.y, TS_MAXY, TS_MINY, 0, 480);
if(p.x>240 && p.x<320 && p.y>0 && p.y<80 )
{
pinMode(XM, OUTPUT);
pinMode(YP, OUTPUT);
Ustawienia();
aktualnaStrona = '2';
}
}
}
if (aktualnaStrona == '4')
{
TSPoint p = ts.getPoint();
if (p.z > ts.pressureThreshhold)
{
p.x = map(p.x, TS_MAXX, TS_MINX, 0, 320);
p.y = map(p.y, TS_MAXY, TS_MINY, 0, 480);
if(p.x>240 && p.x<320 && p.y>0 && p.y<80 )
{
pinMode(XM, OUTPUT);
pinMode(YP, OUTPUT);
Ustawienia();
aktualnaStrona = '2';
}
}
}
if (aktualnaStrona == '5')
{
TSPoint p = ts.getPoint();
if (p.z > ts.pressureThreshhold)
{
p.x = map(p.x, TS_MAXX, TS_MINX, 0, 320);
p.y = map(p.y, TS_MAXY, TS_MINY, 0, 480);
if(p.x>240 && p.x<320 && p.y>0 && p.y<80 )
{
pinMode(XM, OUTPUT);
pinMode(YP, OUTPUT);
Ustawienia();
aktualnaStrona = '2';
}
if(p.x>220 && p.x<300 && p.y>380 && p.y<460 )
{
pinMode(XM, OUTPUT);
pinMode(YP, OUTPUT);
Ustaw_podlewanie();
aktualnaStrona = '6';
}
}
}
if (aktualnaStrona == '6')
{
Serial.begin(9600);
char key = kpd.getKey();
switch (key) {
case '1':
Serial.println("1");
break;
case '2':
Serial.println("2");
break;
case '3':
Serial.println("3");
break;
case '4':
Serial.println("4");
break;
case '5':
Serial.println("5");
break;
case '6':
Serial.println("6");
break;
case '7':
Serial.println("7");
break;
case '8':
Serial.println("8");
break;
case '9':
Ustawienia_podlewania();
aktualnaStrona = '5';
break;
}
}
}
void Menu_glowne () {
tft.setRotation(1);
tft.fillScreen(WHITE); //tlo
tft.drawRoundRect(0,0,80,80,10, BLACK); //Ustawienia
tft.fillRoundRect(1,1, 78,78,10,RED);
tft.drawRoundRect(80,0,80,80,10, BLACK); //Wilgotnosc
tft.fillRoundRect(81,1, 78,78,10,RED);
tft.fillRect(320,0,160,60,BLACK); //Bloczek na czas
tft.drawRect(325,5,150,50,WHITE);
tft.fillRect(0,160,68,160,RED); //Dni tygodnia po kolei
tft.fillRect(68,160,68,160,ORANGE);
tft.fillRect(136,160,68,160,YELLOW);
tft.fillRect(204,160,68,160,GREEN);
tft.fillRect(272,160,68,160,CYAN);
tft.fillRect(336,160,68,160,BLUE);
tft.fillRect(404,160,76,160,PURPLE);
tft.setTextColor(BLACK); //Czcionka 1
tft.setTextSize(1);
tft.setCursor(10,85);
tft.print("USTAWIENIA");
tft.setCursor(90,85);
tft.print("WILGOTNOSC");
tft.setTextSize(2); //Czcionka 2
tft.setTextSize(3); //Czcionka 3
tft.setCursor(15,170);
tft.print("Pn");
tft.setCursor(83,170);
tft.print("Wt");
tft.setCursor(151,170);
tft.print("Sr");
tft.setCursor(215,170);
tft.print("Czw");
tft.setCursor(287,170);
tft.print("Pt");
tft.setCursor(355,170);
tft.print("Sb");
tft.setCursor(423,170);
tft.print("Nd");
tft.setCursor(150,110);
tft.print("Menu Glowne");
tft.setCursor(0,210); //PN
tft.print(DT[0]);
tft.setCursor(35,210);
tft.print(DT[1]);
tft.setCursor(0,250);
tft.print(DT[2]);
tft.setCursor(35,250);
tft.print(DT[3]);
tft.setCursor(68,210); //WT
tft.print(DT[4]);
tft.setCursor(102,210);
tft.print(DT[5]);
tft.setCursor(68,250);
tft.print(DT[6]);
tft.setCursor(102,250);
tft.print(DT[7]);
tft.setCursor(136,210); //SR
tft.print(DT[8]);
tft.setCursor(170,210);
tft.print(DT[9]);
tft.setCursor(136,250);
tft.print(DT[10]);
tft.setCursor(170,250);
tft.print(DT[11]);
tft.setCursor(204,210); //CZW
tft.print(DT[12]);
tft.setCursor(238,210);
tft.print(DT[13]);
tft.setCursor(204,250);
tft.print(DT[14]);
tft.setCursor(238,250);
tft.print(DT[15]);
tft.setCursor(272,210); //PT
tft.print(DT[16]);
tft.setCursor(306,210);
tft.print(DT[17]);
tft.setCursor(272,250);
tft.print(DT[18]);
tft.setCursor(306,250);
tft.print(DT[19]);
tft.setCursor(340,210); //SB
tft.print(DT[20]);
tft.setCursor(374,210);
tft.print(DT[21]);
tft.setCursor(340,250);
tft.print(DT[22]);
tft.setCursor(374,250);
tft.print(DT[23]);
tft.setCursor(408,210); //ND
tft.print(DT[24]);
tft.setCursor(442,210);
tft.print(DT[25]);
tft.setCursor(408,250);
tft.print(DT[26]);
tft.setCursor(442,250);
tft.print(DT[27]);
tft.setTextSize(4); // Czcionka 4
tft.setTextColor(WHITE);
tft.setCursor(30,26);
tft.print("*");
tft.setCursor(110,26);
tft.print("C");
}
void Wilgotnosc ()
{
tft.fillScreen(WHITE);
tft.drawRoundRect(50,90,380,180,5, BLACK); //Ogrod
tft.fillRoundRect(51,91,378,178,5,BROWN);
tft.fillRect(50,165,20,30,BLACK); //Drzwi do folii
tft.setTextColor(BLACK);
tft.setTextSize(3);
tft.setCursor(150,20);
tft.print("WILGOTNOSC");
Back();
}
void Ustawienia ()
{
tft.fillScreen(WHITE);
Back();
tft.drawRoundRect(30,80,420,40,10, BLACK); //Ustawienia
tft.fillRoundRect(31,81,418,38,10, RED);
tft.drawRoundRect(30,140,420,40,10, BLACK); //Ustawienia
tft.fillRoundRect(31,141,418,38,10, RED);
tft.drawRoundRect(30,200,420,40,10, BLACK); //Ustawienia
tft.fillRoundRect(31,201,418,38,10, RED);
tft.setTextColor(WHITE);
tft.setTextSize(3); //Czcionka 3
tft.setCursor(100,88);
tft.print("USTAWIENIA CZASU");
tft.setCursor(100,148);
tft.print("USTAWIENIA DATY");
tft.setCursor(55,208);
tft.print("USTAWIENIA PODLEWANIA");
tft.setCursor(150,30);
tft.setTextColor(BLACK);
tft.print("USTAWIENIA");
}
void Ustawienia_czasu ()
{
tft.fillScreen(WHITE);
tft.setCursor(150,30);
tft.setTextColor(BLACK);
tft.print("PODAJ CZAS");
Back();
Accept();
}
void Ustawienia_daty ()
{
tft.fillScreen(WHITE);
tft.setCursor(130,30);
tft.setTextColor(BLACK);
tft.print("PODAJ DATE");
Back();
Accept();
}
void Ustawienia_podlewania ()
{
tft.fillScreen(WHITE);
Back();
tft.setTextSize(3);
tft.setTextColor(BLACK);
tft.drawRoundRect(20,20,80,80,10, BLACK); //Pn
tft.fillRoundRect(21,21,78,78,10, RED);
tft.setCursor(45,45);
tft.print("Pn");
tft.drawRoundRect(120,20,80,80,10, BLACK); //Wt
tft.fillRoundRect(121,21,78,78,10, ORANGE);
tft.setCursor(145,45);
tft.print("Wt");
tft.drawRoundRect(220,20,80,80,10, BLACK); //Sr
tft.fillRoundRect(221,21,78,78,10, YELLOW);
tft.setCursor(245,45);
tft.print("Sr");
tft.drawRoundRect(320,20,80,80,10, BLACK); //Czw
tft.fillRoundRect(321,21,78,78,10, GREEN);
tft.setCursor(335,45);
tft.print("Czw");
tft.drawRoundRect(20,120,80,80,10, BLACK); //Pt
tft.fillRoundRect(21,121,78,78,10, CYAN);
tft.setCursor(45,145);
tft.print("Pt");
tft.drawRoundRect(120,120,80,80,10, BLACK); //Sb
tft.fillRoundRect(121,121,78,78,10, BLUE);
tft.setCursor(145,145);
tft.print("Sb");
tft.drawRoundRect(220,120,80,80,10, BLACK); //Nd
tft.fillRoundRect(221,121,78,78,10, PURPLE);
tft.setCursor(245,145);
tft.print("Nd");
tft.drawRoundRect(320,120,80,80,10, BLACK); //All
tft.fillRoundRect(321,121,78,78,10, WHITE);
tft.setCursor(335,145);
tft.print("All");
tft.drawRoundRect(20,220,210,80,10, BLACK); //On
tft.fillRoundRect(21,221,208,78,10, GREEN);
tft.setCursor(110,245);
tft.print("ON");
tft.drawRoundRect(250,220,210,80,10, BLACK); //Off
tft.fillRoundRect(251,221,208,78,10, RED);
tft.setCursor(330,245);
tft.print("OFF");
}
void Back () //Bloczek powrot
{
tft.drawRect(420,0,60,60,BLACK);
tft.fillRect(421,1,58,58,RED);
tft.setTextColor(BLACK);
tft.setTextSize(1);
tft.setCursor(430,65);
tft.print("POWROT");
tft.setTextColor(WHITE);
tft.setTextSize(4);
tft.setCursor(443,17);
tft.print("B");
}
void Accept ()
{
tft.drawRect(420,260,60,60,BLACK);
tft.fillRect(421,261,58,58,RED);
tft.setTextColor(BLACK);
tft.setTextSize(1);
tft.setCursor(427,250);
tft.print("AKCEPTUJ");
tft.setTextColor(WHITE);
tft.setTextSize(4);
tft.setCursor(440,274);
tft.print("A");
}
void Ustaw_podlewanie ()
{
tft.fillScreen(WHITE);
tft.setCursor(20,30);
tft.setTextColor(BLACK);
tft.setTextSize(3);
tft.print("PODAJ CZAS PODLEWANIA");
Back();
Accept();
tft.setTextSize(3);
tft.setTextColor(BLACK);
tft.setCursor(10,150);
tft.print("15:15 - 15:30");
tft.setCursor(240,150);
tft.print("16:15 - 16:30");
}
Problem pojawia się konkretnie w miejscu menu if == 6. W poprzednim ifie == 5 po przyciśnięciu przycisku na ekranie uruchamia się funkcja Ustaw_podlewanie(); rysująca moje menu a po wejściu w ifa==6 w miejscu char key = kpd.getKey(); program świruje, ekran robi się biały , a na porcie szeregowym podczas klikania w klawiature pojawiają się odwrócone znaki zapytania i za którymś kliknięciem wyswietli się np 5 lub inna cyferka którą klikam. Proszę bardzo o jakieś rady i wskazówki. Jedyne co mi do głowy przychodzi to, że może ekran też komunikuje się poprzez IC2 i nie mogą działać w tym samym czasie?
Poniżej załączam schemat