Stacja meteo

Masz problem z Arduino? Tutaj możesz szukać pomocy.
ODPOWIEDZ
Kuba323
Młodszy majsterkowicz
Posty: 9
Rejestracja: 12 sie 2017, 15:00

Stacja meteo

Post autor: Kuba323 » 29 wrz 2017, 16:57

Witam szanownych forumowiczów!
Kończę właśnie domową stacje meteo i mam problem odnośnie przesyłania danych przez HC12, mianowicie dane udaje mi się przesłać, ale z takim wynikiem
[youtube]https://www.youtube.com/watch?v=fXOY-WuHRoc[/youtube]
Bardzo bym prosił o wskazówkę jak mógłbym "uporządkować" te dane, bo wyświetlają się wszystkie trzy jak w Serial monitorze zamiast pojedynczo w odpowiednich miejscach
Kod nadajnika

Kod: Zaznacz cały


#include <DallasTemperature.h>
#include <OneWire.h>
#include <DHT.h>
#include <SoftwareSerial.h>
SoftwareSerial radio(4, 5);
DHT dht;
OneWire oneWire(A4); 
DallasTemperature sensors(&oneWire);

String hum;
String temp;
String tempe;

void setup() {
 
  radio.begin(9600);
Serial.begin(9600);
  dht.setup(A5);
 sensors.begin();

}

void loop() {
   sensors.requestTemperatures();   
 int a = (sensors.getTempCByIndex(0));
int b = dht.getTemperature();
int c = dht.getHumidity();
String temp1 = temp + a;
String tempe1 = temp + b;
String hum1 = hum + c;
radio.println(temp1);
radio.println(tempe1);
radio.println(hum1);

  delay(4000);
} 
Kod odbiornika

Kod: Zaznacz cały

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

SoftwareSerial radio(10, 11);

DS3231 clock;
RTCDateTime dt;


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

#define Lekkoczarny 0x31A6
#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 LightBlue 0x879F

#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);
unsigned long currentMillis;
unsigned long previousMillis = 0;    
unsigned long interval = 60000;       
char page;
String hum1;
String tempe1;
String temp1;
void setup() {
tft.reset();
tft.begin(0x9341);
page = 0;
Serial.begin(9600);
radio.begin(9600);
 Serial.println("Initialize DS3231");

      clock.begin();
      
  clock.setDateTime(__DATE__, __TIME__);
 tft.setRotation(0);
   
}
void loop() {
dotyk();
  unsigned long currentMillis = millis();
 if(currentMillis - previousMillis > interval){
    previousMillis = currentMillis;
  dt = clock.getDateTime();
ekranstartowy();
 }
} 



void dotyk () {
   digitalWrite(13, HIGH);
TSPoint p = ts.getPoint();
digitalWrite(13, LOW);
 pinMode(XM, OUTPUT);
    pinMode(YP, OUTPUT);
 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>120 && p.x<150 && p.y>50 && p.y<300){      
   
drawpg ();
  page = 1;   
}    
if(p.x>150 && p.x<200 && p.y>50 && p.y<300){        

drawtemp ();
 page = 2;
  }
}
 
else  if (page == 1) {   
if(p.x>50 && p.x<100 && p.y>50 && p.y<300){       
   
ekranstartowy(); 
  page = 0; 
 }
}
else if (page == 2) {  
if(p.x>50 && p.x<100 && p.y>50 && p.y<300);    
ekranstartowy(); 
page = 0;
}
}
}



void ekranstartowy (){
tft.fillScreen(Lekkoczarny);
tft.setTextSize(2);
tft.setTextColor(LightBlue);
tft.setCursor(30,10);
tft.print(clock.dateFormat("d F Y ",  dt));
tft.setTextSize(4);
tft.setCursor(60,40);
tft.print(clock.dateFormat("H:i",dt));
tft.setTextSize(4);
tft.setCursor(45,90);
tft.print(clock.readTemperature()); 
tft.drawCircle(170, 93, 4, LightBlue);
tft.setCursor(180,90);
tft.println("C");
tft.fillRect(10,150, 220, 70, DarkGrey);
tft.setTextSize(3);
tft.setTextColor(LightBlue);
tft.setCursor(20,160);
tft.print("Pogoda na ");
tft.setCursor(20, 190);
tft.print("polu");
tft.fillRect(10,230, 220, 70, DarkGrey);
tft.setTextSize(3);
tft.setTextColor(LightBlue);
tft.setCursor(20,240);
tft.print("Temperatura");
tft.setCursor(20, 270);
tft.print("na piecu");

}
void drawpg () {      
if(radio.available()){
   String tempe1 = radio.readString();
   String hum1 = radio.readString();
tft.fillScreen(Lekkoczarny);
tft.setTextSize(3);
tft.fillRect(10,20,220,80, DarkGrey);
tft.setTextColor(LightBlue);
tft.setCursor(80,50);
tft.print("<-");
tft.setTextColor (LightBlue);
tft.setCursor(10, 210);
tft.print("Wilgotnosc:");
tft.setCursor(10, 240);
tft.print(hum1);
tft.println("%");
tft.setTextColor(LightBlue);
tft.setCursor(10,120);
tft.print("Temperatura:");
tft.setCursor(10, 150);
tft.print(tempe1);
tft.drawCircle(50, 152, 4, LightBlue);
tft.setCursor(58, 150);
tft.print("C");
} 
}

void drawtemp (){
 if(radio.available()){
String temp1 = radio.readString();
tft.fillScreen(Lekkoczarny);
tft.setTextColor(LightBlue);
tft.setTextSize(3);
tft.setCursor(10,150);
tft.print("Temperatura:");
tft.setCursor(10, 180);
tft.print(temp1);
tft.drawCircle(123, 180, 4, LightBlue);
tft.setCursor(130, 180);
tft.print("C");
tft.fillRect(10,20,220,80, LightGrey);
tft.setTextColor(LightBlue);
tft.setCursor(80,50);
tft.print("<-");
  }  
} 

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


ElectronicRide
Majsterkowicz
Posty: 58
Rejestracja: 17 cze 2016, 14:50

Re: Stacja meteo

Post autor: ElectronicRide » 5 paź 2017, 14:40

CH12 działa przez Uart no to musisz np. nadawać wszystkie pojedyńczo i również pojedyńczo je odebrać, odpowiednio nazwane stringi i ich zawartość wyświetlać w odpowiednich miejscach ja to zrobiłem tak: wysyłanie temperatury z dallasa:
Nadajnik:

Kod: Zaznacz cały

  Serial.println(sensors.getTempCByIndex(0));
  int a = (sensors.getTempCByIndex(0));
  String temp1 = temp + a;
  mySerial.println(temp1);
  Serial.println(temp1);
A w odbiorniku na początku zdefiniowane:

Kod: Zaznacz cały

String temp1;
int a = 0;
a później w loopie odbiór danych:

Kod: Zaznacz cały

  if (mySerial.available() > 1) { //sprawdź bufor UART hc-12
    String temp1 = mySerial.readString();
    Serial.println(temp1);
    lcd.setCursor(0, 1); // I wiersz
    lcd.print("Sauna temp: ");
    lcd.print(temp1);
    lcd.setCursor(15, 1); // I wiersz
    lcd.print(" stC  ");
Widziałem, że w kodzie masz przechodzenie do okien 1 i 2 i 0 jako startowe i to w nich muszą znajdować się odczyty tych temperatur tak mi sie zdaje :o
Kuba323
Młodszy majsterkowicz
Posty: 9
Rejestracja: 12 sie 2017, 15:00

Re: Stacja meteo

Post autor: Kuba323 » 7 paź 2017, 09:13

Dziękuję za odpowiedź!
W zasadzie kiedy zakładałem temat mój kod był taki sam jak w pana odpowiedzi, więc dalej dzieje się tak jak na filmiku.
ODPOWIEDZ

Strony partnerskie: