Problem z kodem

Masz problem, z którym nie możesz sobie poradzić? Pisz śmiało!
ODPOWIEDZ
Kuba323
Młodszy majsterkowicz
Posty: 9
Rejestracja: 12 sie 2017, 15:00

Problem z kodem

Post autor: Kuba323 » 12 sie 2017, 15:12

Witam, niedawno zacząłem się interesować elektroniką (Arduino), mam za sobą kilka projektów, ale natknąłem się właśnie na problem. Chciałbym zrobić stację pogody na dotykowym wyświetlaczu z zegarem i żeby pokazywało mi temperaturę na polu i piecu oraz wilgotność drogą radiową (nie jestem jeszcze w posiadaniu przekaźników). Problem mam z kodem:

Kod: Zaznacz cały

#include <DS3231.h>
#include <SPFD5408_Adafruit_GFX.h>
#include <SPFD5408_Adafruit_TFTLCD.h> 
#include <SPFD5408_TouchScreen.h>
#include <Wire.h>


DS3231 clock;
RTCDateTime dt;

#define LCD_CS A3
#define LCD_CD A2
#define LCD_WR A1
#define LCD_RD A0
#define LCD_RT 10


#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  0xFD20      
#define GreenYellow 0xAFE5
#define Navy     0x000F      
#define DarkGreen   0x03E0     
#define DarkCyan  0x03EF    
#define Maroon   0x7800    
#define Purple  0x780F     
#define Olive  0x7BE0      
#define LightGrey  0xC618      
#define DarkGrey  0x7BEF

#define TS_MINX 100
#define TS_MINY 100
#define TS_MAXX 1000
#define TS_MAXY 1000


Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RT); 

#define YP A2
#define XM A3 
#define YM 8  
#define XP 9

#define MINPRESSURE 200
#define MAXPRESSURE 350


TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300);


char page;

static unsigned long lWaitMillis;

void setup() {
  
tft.reset();
tft.begin(0x9341);
page = 0;
Serial.begin(9600);
 
  Serial.println("Initialize DS3231");
clock.begin();
 dt = clock.getDateTime();
 clock.setDateTime(2017, 8, 12, 14, 47, 00);
 
 ekranstartowy();
}
void loop() {

{dotyk();}


}

void dotyk () {
TSPoint p = ts.getPoint();
 if (p.z > MINPRESSURE && p.z < MAXPRESSURE){
 p.x = map(p.x, TS_MAXX, TS_MINX, 240, 0);
   p.y = map(p.y, TS_MAXY, TS_MINY,320, 0);
 if (page == 0) {


         
   if(p.x>100 && p.x<155 && p.y>50 && p.y<300){ 
   
  
    
    pinMode(XM, OUTPUT);
    pinMode(YP, OUTPUT);



drawpg ();
  page = 1;
   
} 
   
if(p.x>150 && p.x<200 && p.y>50 && p.y<300){
    
   
    
    pinMode(XM, OUTPUT);
    pinMode(YP, OUTPUT);
 
drawtemp ();
 page = 2;
  }
}
 }
  if (page == 1) { 

   
if(p.x>50 && p.x<100 && p.y>50 && p.y<300){ 
    
    
    pinMode(XM, OUTPUT);
    pinMode(YP, OUTPUT);


  
ekranstartowy(); 
  page = 0; 
 }
}
if (page == 2) {
 
    

if(p.x>50 && p.x<100 && p.y>50 && p.y<300) {
    
    
    
    pinMode(XM, OUTPUT);
    pinMode(YP, OUTPUT);
    


ekranstartowy(); 
page = 0;
}
}

}


void ekranstartowy (){

tft.fillScreen(DarkCyan);
tft.setTextSize(2);
tft.setTextColor(Orange);
tft.setCursor(10,10);
tft.print("Data:");
tft.println(clock.dateFormat("d-m-Y", dt)) ;
tft.drawLine(0,33, 10000, 40, Orange);
tft.setCursor(10,40);
tft.print("Godzina:");
tft.println(clock.dateFormat("H:i", dt));
tft.drawLine(0,65, 10000, 40,  Orange);
tft.setCursor(10,72);
tft.print("Temperatura:");
tft.setCursor(150,72);
tft.print(clock.readTemperature()); 
tft.drawLine(0,95, 10000, 40,  Orange);
tft.fillRect(10,110, 220, 80,  DarkGreen);
tft.setTextSize(3);
tft.setTextColor(Orange);
tft.setCursor(20,120);
tft.print("Pogoda na ");
tft.setCursor(20, 150);
tft.print("polu");
tft.fillRect(10,210, 220, 80, DarkGreen);
tft.setTextSize(3);
tft.setTextColor( Orange);
tft.setCursor(20,220);
tft.print("Temperatura");
tft.setCursor(20, 250);
tft.print("na piecu");

}
void drawpg () {

tft.fillScreen(DarkCyan);
tft.setTextSize(3);
tft.fillRect(10,20,220,80, DarkGreen);
tft.setTextColor(Orange);
tft.setCursor(80,50);
tft.print("<-");
tft.setTextColor (Orange);
tft.setCursor(10, 120);
tft.print("Wilgotnosc");
tft.setTextColor(Orange);
tft.setCursor(10,210);
tft.print("Temperatura");

}

void drawtemp (){

tft.fillScreen(DarkCyan);
tft.setTextColor(Orange);
tft.setTextSize(3);
tft.setCursor(10,150);
tft.print("Temperatutra");
tft.fillRect(10,20,220,80, DarkGreen);
tft.setTextColor(Orange);
tft.setCursor(80,50);
tft.print("<-");

} 

Chciałbym, żeby odświeżało mi ekran startowy co 1 min. Zwykły "delay" nie działa, bo po pojawieniu się ekranu startowego po chwili gaśnie i świeci się na biało i w tedy dotyk też nie działa, natomiast bez"'delay" dotyk działa ale data i temp się nie aktualizują. Bardzo proszę o pomoc. Z góry dziękuję.

Co miesiąc do wygrania nagrody o wartości ponad 1600 zł!


Awatar użytkownika
scorpion_1982
Majsterkowicz
Posty: 108
Rejestracja: 15 lut 2015, 00:55

Re: Problem z kodem

Post autor: scorpion_1982 » 13 sie 2017, 12:17

Zaczął bym od usunięcia podwójnych klamr w funkcji loop
Chyba że tego nie zaóważasz ?

Wysłane z mojego SM-J510FN przy użyciu Tapatalka
Kuba323
Młodszy majsterkowicz
Posty: 9
Rejestracja: 12 sie 2017, 15:00

Re: Problem z kodem

Post autor: Kuba323 » 13 sie 2017, 14:15

Wiedziałem o tym, ale to i tak nic nie zmienia.
Awatar użytkownika
scorpion_1982
Majsterkowicz
Posty: 108
Rejestracja: 15 lut 2015, 00:55

Re: Problem z kodem

Post autor: scorpion_1982 » 13 sie 2017, 14:23

Niestety takie błędy powodują problem z kompilowaniem a w zasadzie nie napisałeś z czym dokładnie masz problem!
Kuba323
Młodszy majsterkowicz
Posty: 9
Rejestracja: 12 sie 2017, 15:00

Re: Problem z kodem

Post autor: Kuba323 » 13 sie 2017, 18:15

Problem mam z tym, że nie wiem jak ująć w kodzie, żeby odświeżało mi ekran startowy i żeby działał dotyk, bo ze zwykłym "delay" i dotykiem pojawia się ekran i po chwili gaśnie. Bez odświeżania natomiast działa dotyk, ale zegar z temperaturą się przez to nie aktualizują.
Awatar użytkownika
scorpion_1982
Majsterkowicz
Posty: 108
Rejestracja: 15 lut 2015, 00:55

Re: Problem z kodem

Post autor: scorpion_1982 » 13 sie 2017, 18:43

A kolega szuka osoby która napiszę za ciebie funkcję odświeżania ??
Ciężko będzie.
musisz zrezygnować z polecenia delay bo zamarzasz program
musisz pobierać cykle od uruchomienia i obliczać czas
i jeśli chcesz co 500 ms coś wykonać to czekasz tyle omijając funkcje operacyjne a jedynie odświeżasz ekran i sprawdzasz dotyk..
może któryś kolega ma na tyle czasu by się z tym bawić ja jedynie mogę podpowiedzieć lub ewentualnie wskazać co robisz źle, nie wolno przy wyświetlaczach używać delay, chyba że odświeżanie masz na timerze..
deklarujesz zmienną int. i pobierasz czas od uruchomienia procesora, i odwietrzasz dane a te które mają być wykonywane co jakiś cykl.
Możesz skorzystać z funkcji takiej jak piszę lub skorzystać z timerów wbudowanych w procesor ewentualnie skorzystać z klasy one_timer czy jakoś tak..
Kuba323
Młodszy majsterkowicz
Posty: 9
Rejestracja: 12 sie 2017, 15:00

Re: Problem z kodem

Post autor: Kuba323 » 13 sie 2017, 19:49

Spróbowałem czegoś takiego:

Kod: Zaznacz cały

#include <Timers.h>
#include <DS3231.h>
#include <SPFD5408_Adafruit_GFX.h>
#include <SPFD5408_Adafruit_TFTLCD.h> 
#include <SPFD5408_TouchScreen.h>
#include <Wire.h>

Timer mojTimer;
DS3231 clock;
RTCDateTime dt;

#define LCD_CS A3
#define LCD_CD A2
#define LCD_WR A1
#define LCD_RD A0
#define LCD_RT 10


#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  0xFD20      
#define GreenYellow 0xAFE5
#define Navy     0x000F      
#define DarkGreen   0x03E0     
#define DarkCyan  0x03EF    
#define Maroon   0x7800    
#define Purple  0x780F     
#define Olive  0x7BE0      
#define LightGrey  0xC618      
#define DarkGrey  0x7BEF

#define TS_MINX 100
#define TS_MINY 100
#define TS_MAXX 1000
#define TS_MAXY 1000


Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RT); 

#define YP A2
#define XM A3 
#define YM 8  
#define XP 9

#define MINPRESSURE 200
#define MAXPRESSURE 350


TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300);



char page;


void setup() {
  
tft.reset();
tft.begin(0x9341);
page = 0;
Serial.begin(9600);
 
  Serial.println("Initialize DS3231");
clock.begin();
 dt = clock.getDateTime();
 clock.setDateTime(2017, 8, 13, 19, 25, 00);
mojTimer.begin(3000);
 ekranstartowy();
}
void loop() {
  dotyk();
if (mojTimer.available()) {
tft.fillScreen(BLACK);

mojTimer.restart();
}
  }


void dotyk () {
TSPoint p = ts.getPoint();
 if (p.z > MINPRESSURE && p.z < MAXPRESSURE){
 p.x = map(p.x, TS_MAXX, TS_MINX, 240, 0);
   p.y = map(p.y, TS_MAXY, TS_MINY,320, 0);
 if (page == 0) {


         
   if(p.x>100 && p.x<155 && p.y>50 && p.y<300){ 
   
  
    
    pinMode(XM, OUTPUT);
    pinMode(YP, OUTPUT);



drawpg ();
  page = 1;
   
} 
   
if(p.x>150 && p.x<200 && p.y>50 && p.y<300){
    
   
    
    pinMode(XM, OUTPUT);
    pinMode(YP, OUTPUT);
 
drawtemp ();
 page = 2;
  }
}
 }
  if (page == 1) { 

   
if(p.x>50 && p.x<100 && p.y>50 && p.y<300){ 
    
    
    pinMode(XM, OUTPUT);
    pinMode(YP, OUTPUT);


  
ekranstartowy(); 
  page = 0; 
 }
}
if (page == 2) {
 
    

if(p.x>50 && p.x<100 && p.y>50 && p.y<300) {
    
    
    
    pinMode(XM, OUTPUT);
    pinMode(YP, OUTPUT);
    


ekranstartowy(); 
page = 0;
}
}

}


void ekranstartowy (){

tft.fillScreen(DarkCyan);
tft.setTextSize(2);
tft.setTextColor(Orange);
tft.setCursor(10,10);
tft.print("Data:");
tft.println(clock.dateFormat("d-m-Y", dt)) ;
tft.drawLine(0,33, 10000, 40, Orange);
tft.setCursor(10,40);
tft.print("Godzina:");
tft.println(clock.dateFormat("H:i", dt));
tft.drawLine(0,65, 10000, 40,  Orange);
tft.setCursor(10,72);
tft.print("Temperatura:");
tft.setCursor(150,72);
tft.print(clock.readTemperature()); 
tft.drawLine(0,95, 10000, 40,  Orange);
tft.fillRect(10,110, 220, 80,  DarkGreen);
tft.setTextSize(3);
tft.setTextColor(Orange);
tft.setCursor(20,120);
tft.print("Pogoda na ");
tft.setCursor(20, 150);
tft.print("polu");
tft.fillRect(10,210, 220, 80, DarkGreen);
tft.setTextSize(3);
tft.setTextColor( Orange);
tft.setCursor(20,220);
tft.print("Temperatura");
tft.setCursor(20, 250);
tft.print("na piecu");

}
void drawpg () {

tft.fillScreen(DarkCyan);
tft.setTextSize(3);
tft.fillRect(10,20,220,80, DarkGreen);
tft.setTextColor(Orange);
tft.setCursor(80,50);
tft.print("<-");
tft.setTextColor (Orange);
tft.setCursor(10, 120);
tft.print("Wilgotnosc");
tft.setTextColor(Orange);
tft.setCursor(10,210);
tft.print("Temperatura");

}

void drawtemp (){

tft.fillScreen(DarkCyan);
tft.setTextColor(Orange);
tft.setTextSize(3);
tft.setCursor(10,150);
tft.print("Temperatutra");
tft.fillRect(10,20,220,80, DarkGreen);
tft.setTextColor(Orange);
tft.setCursor(80,50);
tft.print("<-");

} 
I według autora biblioteki powinno restartować, a u mnie pojawia się czarny ekran i dopiero kiedy dotknę to znika.
Awatar użytkownika
scorpion_1982
Majsterkowicz
Posty: 108
Rejestracja: 15 lut 2015, 00:55

Re: Problem z kodem

Post autor: scorpion_1982 » 14 sie 2017, 14:09

Opisz jak ma to działać bo z tego co widzę to co 3 sekundy malujesz ekran na czarno i jeśli niczego nie dotkniesz to jest ekran czarny!!.
w funkcji setup wysyłasz ekran startowy który i tak praktycznie po 3 sekundach jest zamalowany na czarno, w zasadzie nie za bardzo wiem po co !!
Nie mam takiego wyświetlacza na stanie nie jestem wstanie sprawdzić co się dzieje z twoim programem zrób krótki filmik i wrzuć na youtube, wtedy sprawa się rozjaśni.

Nie pamietam czy ekran musi być cały czas odmalowywany by utrzymał grafikę czy też nie.
Bo jeśli jest z pamięcią(buforem) - jak zwał tak zwał to przesyłając obraz na ekran on pozostaje, do ponownego odmalowania ekranu
Czyli co 1000 ms(1 sek) można sprawdzać np. temperaturę lub inne pierdoły i jeśli się zmieniają to wtedy odmalowujemy ekran, chyba że wcześniej np. ktoś dotknie ekranu itp.
Kuba323
Młodszy majsterkowicz
Posty: 9
Rejestracja: 12 sie 2017, 15:00

Re: Problem z kodem

Post autor: Kuba323 » 14 sie 2017, 18:26

To ma działać w ten sposób, że co 1 min. ma mi odświeżać ekran tylko o tyle mi chodzi. A to zamalowywanie na czarno to ma być właśnie odświeżanie ekranu.
https://www.youtube.com/watch?v=_wgWk07z6Bc
Awatar użytkownika
scorpion_1982
Majsterkowicz
Posty: 108
Rejestracja: 15 lut 2015, 00:55

Re: Problem z kodem

Post autor: scorpion_1982 » 14 sie 2017, 18:30

To dlaczego nie wywołasz drugiej funkcji, która pobiera dane i rysuje je na LCD ??
To co wykonujesz co 3 sekundy to wypełnienie ekranu czarnym kolorem. Nic więcej !!

Wysłane z mojego SM-J510FN przy użyciu Tapatalka
Kuba323
Młodszy majsterkowicz
Posty: 9
Rejestracja: 12 sie 2017, 15:00

Re: Problem z kodem

Post autor: Kuba323 » 14 sie 2017, 18:53

No to zrobiłem tak jak powinno być, ale dalej nie działa.

Kod: Zaznacz cały

#include <Timers.h>
#include <DS3231.h>
#include <SPFD5408_Adafruit_GFX.h>
#include <SPFD5408_Adafruit_TFTLCD.h> 
#include <SPFD5408_TouchScreen.h>
#include <Wire.h>

Timer mojTimer;
DS3231 clock;
RTCDateTime dt;

#define LCD_CS A3
#define LCD_CD A2
#define LCD_WR A1
#define LCD_RD A0
#define LCD_RT 10


#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  0xFD20      
#define GreenYellow 0xAFE5
#define Navy     0x000F      
#define DarkGreen   0x03E0     
#define DarkCyan  0x03EF    
#define Maroon   0x7800    
#define Purple  0x780F     
#define Olive  0x7BE0      
#define LightGrey  0xC618      
#define DarkGrey  0x7BEF

#define TS_MINX 100
#define TS_MINY 100
#define TS_MAXX 1000
#define TS_MAXY 1000


Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RT); 

#define YP A2
#define XM A3 
#define YM 8  
#define XP 9

#define MINPRESSURE 200
#define MAXPRESSURE 350


TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300);



char page;

//static unsigned long lWaitMillis;

void setup() {
  
tft.reset();
tft.begin(0x9341);
page = 0;
Serial.begin(9600);
 
  Serial.println("Initialize DS3231");
clock.begin();
 dt = clock.getDateTime();
 clock.setDateTime(2017, 8, 14, 18, 25, 00);
mojTimer.begin(3000);
powitanie();
}
void loop() {
  dotyk();
if (mojTimer.available()) {
tft.fillScreen(BLACK);
ekranstartowy();
mojTimer.restart();

}
  }


void dotyk () {
TSPoint p = ts.getPoint();
 if (p.z > MINPRESSURE && p.z < MAXPRESSURE){
 p.x = map(p.x, TS_MAXX, TS_MINX, 240, 0);
   p.y = map(p.y, TS_MAXY, TS_MINY,320, 0);
 if (page == 0) {


         
   if(p.x>100 && p.x<155 && p.y>50 && p.y<300){ 
   
  
    
    pinMode(XM, OUTPUT);
    pinMode(YP, OUTPUT);



drawpg ();
  page = 1;
   
} 
   
if(p.x>150 && p.x<200 && p.y>50 && p.y<300){
    
   
    
    pinMode(XM, OUTPUT);
    pinMode(YP, OUTPUT);
 
drawtemp ();
 page = 2;
  }
}
 }
  if (page == 1) { 

   
if(p.x>50 && p.x<100 && p.y>50 && p.y<300){ 
    
    
    pinMode(XM, OUTPUT);
    pinMode(YP, OUTPUT);


  
ekranstartowy(); 
  page = 0; 
 }
}
if (page == 2) {
 
    

if(p.x>50 && p.x<100 && p.y>50 && p.y<300) {
    
    
    
    pinMode(XM, OUTPUT);
    pinMode(YP, OUTPUT);
    


ekranstartowy(); 
page = 0;
}
}

}


void ekranstartowy (){

tft.fillScreen(DarkCyan);
tft.setTextSize(2);
tft.setTextColor(Orange);
tft.setCursor(10,10);
tft.print("Data:");
tft.println(clock.dateFormat("d-m-Y", dt)) ;
tft.drawLine(0,33, 10000, 40, Orange);
tft.setCursor(10,40);
tft.print("Godzina:");
tft.println(clock.dateFormat("H:i", dt));
tft.drawLine(0,65, 10000, 40,  Orange);
tft.setCursor(10,72);
tft.print("Temperatura:");
tft.setCursor(150,72);
tft.print(clock.readTemperature()); 
tft.drawLine(0,95, 10000, 40,  Orange);
tft.fillRect(10,110, 220, 80,  DarkGreen);
tft.setTextSize(3);
tft.setTextColor(Orange);
tft.setCursor(20,120);
tft.print("Pogoda na ");
tft.setCursor(20, 150);
tft.print("polu");
tft.fillRect(10,210, 220, 80, DarkGreen);
tft.setTextSize(3);
tft.setTextColor( Orange);
tft.setCursor(20,220);
tft.print("Temperatura");
tft.setCursor(20, 250);
tft.print("na piecu");

}
void drawpg () {

tft.fillScreen(DarkCyan);
tft.setTextSize(3);
tft.fillRect(10,20,220,80, DarkGreen);
tft.setTextColor(Orange);
tft.setCursor(80,50);
tft.print("<-");
tft.setTextColor (Orange);
tft.setCursor(10, 120);
tft.print("Wilgotnosc");
tft.setTextColor(Orange);
tft.setCursor(10,210);
tft.print("Temperatura");

}

void drawtemp (){

tft.fillScreen(DarkCyan);
tft.setTextColor(Orange);
tft.setTextSize(3);
tft.setCursor(10,150);
tft.print("Temperatutra");
tft.fillRect(10,20,220,80, DarkGreen);
tft.setTextColor(Orange);
tft.setCursor(80,50);
tft.print("<-");

} 
void powitanie () {
  tft.fillScreen(DarkCyan);
  tft.setTextColor(Orange);
  tft.setTextSize(4);
  tft.setCursor(50,70);
  tft.print("Witaj");
}
https://www.youtube.com/watch?v=a65c3_uOTpg
Awatar użytkownika
scorpion_1982
Majsterkowicz
Posty: 108
Rejestracja: 15 lut 2015, 00:55

Re: Problem z kodem

Post autor: scorpion_1982 » 14 sie 2017, 20:55

Zakomentuj linie w funkcji loop
tft.fillScreen(BLACK); // w funkcji ekranstartowy() jest już wypełnianie ekranu kolorem to po co dwa razy to robić. Tracisz przez to tylko dodatkowe cykle procesora
I sprawdź.
Pytanie czy jeśli bezpośrednio dasz dwie funkcje w loop
Czyli
dotyk() i ekranstartowy()
To masz obraz ale miga czy nie ma wcale ??

Wysłane z mojego SM-J510FN przy użyciu Tapatalka
Kuba323
Młodszy majsterkowicz
Posty: 9
Rejestracja: 12 sie 2017, 15:00

Re: Problem z kodem

Post autor: Kuba323 » 15 sie 2017, 09:45

Zakomentowałem i wygląda to tak jak w poprzednim filmiku. Tak w ogóle to zauważyłem jak wcześniej z tym kombinowałem to że kiedy ekranstartowy() jest w loop to właśnie się tak dzieje tzn. biały ekran.
Awatar użytkownika
scorpion_1982
Majsterkowicz
Posty: 108
Rejestracja: 15 lut 2015, 00:55

Re: Problem z kodem

Post autor: scorpion_1982 » 15 sie 2017, 22:21

Jeśli dobrze w kodzie widzę to masz zrobione w ten sposób
Chcesz wyświetlić ekran startowy to tylko raz go wysyłasz na ekran i w funkcji loop nie możesz zastosować odświeżania..
Gdy nie masz nic w funkcji loop to jest to samo ??, niestety nie mam takiego ekranu nie jestem wstanie precyzyjnie ci napisać z czym masz problem bo po 1 - nie znam tego wyświetlacza, 2 - nie korzystałem z tej biblioteki..
ODPOWIEDZ

Strony partnerskie: