Метеостанция на ардуино, код из видео.

Метеостанция на ардуино

 

sheld_meteo-tft-ds1302

плата в формате .lay sheld_meteo-tft-ds1302

библиотеки, RF24-master, ds1302, BMP085

Использованные компоненты:
китай УНО
экран 1.8″ TFT LCD Display module ST7735S 128×160
часы DS1302
барометр BMP180
для связи с наружным блоком nRF24L01+
и уличный термометр DS18B20

код


// метеостанция, код из видео http://youtu.be/0nDR0kErIvo
// приемник 

#include <Wire.h>
#include <BMP085.h> 
#include <TFT.h>   
#include <SPI.h>
#include <DS1302.h> 
#include <RF24.h>
#include <nRF24L01.h>
 
#define cs   10 //TFT
#define dc   9
#define rst  8  
/// DS1302
#define kCePin 6  // Chip Enable
#define kIoPin 5  // Input/Output
#define kSclkPin 4  // Serial Clock
 
RF24 radio(3, 7); // CE, CSN

DS1302 rtc(kCePin, kIoPin, kSclkPin);
Time t = rtc.time();
BMP085 dps = BMP085();   
TFT TFTscreen = TFT(cs, dc, rst);

const uint64_t pipe01 = 0xF0F1F2F3F4LL; // идентификатор передачи, "труба"
int line[85] = {760};
byte lineIndex, oldTimeMin, oldTimeSec, oldTimeHr = 0;
long Temperature = 0, Pressure = 0, Altitude = 0;
float NRFtemperature = 0;

void getDataBMP180() { // заполняем данные в массив  
  dps.getPressure(&Pressure); 
  line[lineIndex] = Pressure/133.3;
  lineIndex++;
  if (lineIndex >= 85) lineIndex = 0;
}
 

void setup(){ 
  Wire.begin();
  delay(500);
  radio.begin();  
  TFTscreen.begin(); 
  TFTscreen.setRotation(2); // 
  delay(500);
  dps.init(); 
/////
  rtc.writeProtect(false);
  rtc.halt(false);
  
  radio.setPALevel(RF24_PA_HIGH);   
  radio.setChannel(9);
  radio.setDataRate(RF24_1MBPS);   
  radio.openReadingPipe(1,pipe01);
  radio.startListening(); 
  
  
// отрисовываем при включении   
  TFTscreen.background(0,0,0);
  dps.getPressure(&Pressure);
  dps.getTemperature(&Temperature);
  dps.getAltitude(&Altitude); 
  printLCD(); 
  
//// установка часов 
//  Time t(2015, 4, 29, 20, 28, 40, Time::kSunday); 
//  rtc.time(t);
}

void loop(){
 t = rtc.time();
 
 if (radio.available()){  
   radio.read(&NRFtemperature, sizeof(NRFtemperature));  
 }   
 
// таймер на rtc     
 if (t.sec != oldTimeSec){ // раз в секунду
    oldTimeSec = t.sec; 
//    printLCD(); 
//    getDataBMP180(); // забераем значение с BMP180   
  } 

  if (t.min != oldTimeMin){ // раз в минуту
    oldTimeMin = t.min; 
    // запрашиваем температуру
      byte val = 1; 
      radio.stopListening(); // останавливает приём (нужно перед началом передачи) 
      radio.openWritingPipe(pipe01); // открываем трубу на передачу.
      radio.write(&val, sizeof(val)); // отправляем val и указываем сколько байт пакет
      radio.startListening(); // включаем приемник, начинаем слушать трубу 
      
    printLCD(); // отрисовка экрана    
    NRFtemperature = 0; // сбросили температуру
        
  }  
  
  if (t.hr != oldTimeHr){ // раз в час
    oldTimeHr = t.hr;  
    getDataBMP180(); // забераем значение с BMP180 для графика       
  }
 

}
  
//////////////////// отрисовка экрана
void printLCD() {
    //128x160
    byte k = 30; // корекция графика по высоте
    TFTscreen.background(0,0,0); 
////// график с давлением        
  TFTscreen.stroke(250,180,10);
  
  TFTscreen.line(5, 90+k, 5, 121+k);
  TFTscreen.line(5, 121+k, 90, 121+k);
  TFTscreen.line(1, 105+k, 6, 105+k); 
  TFTscreen.stroke(10,180,250);

  for (int i = 0; i <= 85; i++){ 
    TFTscreen.point(i+6, map(line[i],780,740,90+k,120+k)); 
      //x1 y1 x2 y2      
//    TFTscreen.line(i+6, 121, i+6, map(line[i],780,740,90,120)); 
  }
  
  TFTscreen.stroke(200,80,30);
  TFTscreen.line(lineIndex+6, 117+k, lineIndex+6, 95+k);  
 
///// часы\давление\температура
  
  dps.getTemperature(&Temperature);
  dps.getPressure(&Pressure);
  
  char time[6], data[11], temp[10], nrfTemp[10], pres[10];
  int Temp = Temperature*0.1;
  int pressure = Pressure/133.3;
  
  snprintf(time, sizeof(time), "%02d:%02d", t.hr, t.min);           
  snprintf(data, sizeof(data), "%02d/%02d/%02d", t.date, t.mon, t.yr);
  snprintf(temp, sizeof(temp), "%02dC", Temp);  
  snprintf(pres, sizeof(pres), "%02d", pressure);   
//  snprintf(day, sizeof(day), "%s", Day.c_str());
  char str_temp[6];
  dtostrf(NRFtemperature, 4, 2, str_temp);
  sprintf(nrfTemp,"%sC", str_temp);
//   snprintf(nrfTemp, sizeof(nrfTemp), "%f", NRFtemperature);
 
    
  TFTscreen.setTextSize(2);
  TFTscreen.stroke(255, 255, 255);   
  TFTscreen.text(time, 30, 5+10);  
  
  TFTscreen.setTextSize(1);
  TFTscreen.stroke(200, 150, 150);   
  TFTscreen.text(data, 30, 22+10); 
  
  TFTscreen.setTextSize(2);
  TFTscreen.stroke(255, 255, 50);   
//  TFTscreen.stroke(0, 170, 255);  
  TFTscreen.text(nrfTemp, 25, 20+k); 
  
  TFTscreen.setTextSize(2);
  TFTscreen.stroke(0, 180, 255);   
  TFTscreen.text(temp, 5, 50+k);  
 
  TFTscreen.setTextSize(2);
  TFTscreen.stroke(150, 150, 10);   
  TFTscreen.text(pres, 5, 58+10+k);
  TFTscreen.setTextSize(1);
  TFTscreen.text("mmHg", 42, 75+k);  
  
  
}

 

// метеостанция, код из видео http://youtu.be/0nDR0kErIvo
// передатчик
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h> // https://github.com/maniacbug/RF24
#include <OneWire.h>
   
const uint64_t pipe = 0xF0F1F2F3F4LL;  
 
RF24 radio(9, 10); // CE, CSN
OneWire  ds(14);  
 
void setup(){
//  Serial.begin(9600);
  
  radio.begin();
  delay(2);
  radio.setChannel(9); // канал (0-127) 
  radio.setDataRate(RF24_1MBPS);  
  radio.setPALevel(RF24_PA_HIGH);   
  
  radio.openReadingPipe(1,pipe); // открываем первую трубу с индитификатором "pipe"
  radio.startListening(); // включаем приемник, начинаем слушать трубу

//  radio.openWritingPipe(pipe); // открываем трубу на передачу. 
} 
 
void loop()   
{
    ////////////// 18b20 //////////////
  byte addr[8];  
  byte data[12];
   if (!ds.search(addr)) { // если 18b20 не найден
     float temperature = -100; 
  }
   ds.reset_search(); 
  
  ds.reset();            
  ds.select(addr);        
  ds.write(0x44);      
  delay(1000);   
 
  ds.reset();
  ds.select(addr);    
  ds.write(0xBE);          

  for (int i = 0; i < 9; i++) data[i] = ds.read();    

  int raw = (data[1] << 8) | data[0];
  if (data[7] == 0x10) raw = (raw & 0xFFF0) + 12 - data[6];  
  float temperature = raw / 16.0;
 ///////////////////////////////  
  
  if (radio.available()){ // проверяем не пришло ли чего в буфер.
    byte val;
    radio.read(&val, sizeof(val)); // читаем данные и указываем сколько байт читать 
    
    if (val == 1){ // если пришло 1,
      radio.stopListening(); // останавливает приём (нужно перед началом передачи) 
            //отправляем данные      
      radio.openWritingPipe(pipe); // открываем трубу на передачу.
      radio.write(&temperature, sizeof(temperature)); ; // отправляем данные и указываем сколько байт пакет
      radio.startListening(); // включаем приемник, начинаем слушать трубу
    }
  }   
}