Метеостанция на ардуино
плата в формате .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(); // включаем приемник, начинаем слушать трубу } } }