часы с барометром + беспроводной термометр
- Войдите на сайт для отправки комментариев
Работаю над следующим любительским проектом:
часы с барометром и приемником на 433мгц, показывают время, давление и принимают показания температуры и влажности с беспроводного термометра.
Итересует мнения от более опытных товариещей. Дальность беспроводной связи небольшая коло 2 м, как её можноувеличить? так же хочется сделать спящий режим для часов- выключение дисплея и модулей, если допустим кнопки не нажаты более 2 минут. Так же думаю о реализации построения графика температуры и давления (видимо данные надо будет складывать в eeprom).
компоненты часов:
Arduino nano
модуль часов ds3231
модуль примника 433 мгц
барометр bmp180
дисплей oled по SPI 128x64
аккумулятор li-ion с защитой (из мп3-плеера), 2 тактовые кнопки и кнопка вкл выкл
копоненты термометра:
плата digispark attiny85 microusb
термометр гигрометр dht11
модуль передатчика 433мгц.
картимнка
скетч проёмника:
#include <Manchester.h> // для 433мгц #include <SPI.h> #include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #include <AdafruitBMP085.h> #include <Time.h> #include <DS1307RTC.h> #include <Keypad.h> const byte ROWS = 1; //four rows const byte COLS = 2; //four columns //define the cymbols on the buttons of the keypads char hexaKeys[ROWS][COLS] = { {'A','B'} }; byte rowPins[ROWS] = {10}; //connect to the row pinouts of the keypad byte colPins[COLS] = {11, 9}; //connect to the column pinouts of the keypad Keypad customKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS); #define OLED_MOSI 4 #define OLED_CLK 3 #define OLED_DC 6 #define OLED_CS 12 #define OLED_RESET 5 Adafruit_SSD1306 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS); Adafruit_BMP085 bmp; #define RX_PIN 2 #define BUFFER_SIZE 20 #define WAIT 60000 //posle 60000 milis bez rf signala t i h propadut uint8_t buffer[BUFFER_SIZE]; int t,h; float BMPt,BMPp; long state; byte loopA, loopB; void setup() { display.begin(SSD1306_SWITCHCAPVCC); display.display(); // show splashscreen delay(500); display.clearDisplay(); display.display(); man.setupReceive(RX_PIN, MAN_600); man.beginReceiveArray(BUFFER_SIZE, buffer);// Начинаем мониторинг эфира bmp.begin(); } void loop() { char customKey = customKeypad.getKey(); tmElements_t tm; //чтото от модуля часов if (customKey == 'A') {loopA = (loopA+1)%10;} else if (customKey == 'B') {loopB = (loopB+1)%5;} if (man.receiveComplete() && tm.Second%30 <= 3 ) // Если принято сообщение { digitalWrite(13, true); uint16_t m = man.getMessage(); int i; if (buffer[i] = 116) //знак T номер 116 { t=buffer[1]; } else {printstrng("T err", 0, 0, 1);} if (buffer[i] = 104){ h=buffer[3]; } else { printstrng("H err", 50, 0, 1); } display.display(); man.beginReceiveArray(BUFFER_SIZE, buffer); state = millis(); } display.clearDisplay(); switch (loopA) { case 0: display.setCursor(0,40); if (RTC.read(tm)) { display.setTextSize(3); //display.setTextColor(WHITE); display.print(tm.Hour); display.print(':'); print2digits(tm.Minute); printstrng(":", 92, 40, 2); printint(tm.Second, 104, 40, 2); if (millis()-state < WAIT){ printstrng("T=", 0, 0, 1); printstrng("C", 36, 0, 1); printint(t, 13, 0, 2); printstrng("H=", 50, 0, 1); printstrng("%", 86, 0, 1); printint(h, 63, 0, 2);} else { printstrng("no rf data", 8, 0, 1); } display.display();} else { if (RTC.chipPresent()) { display.setTextSize(1); display.println("DS1307 Please run the SetTime"); display.display(); } else { display.setTextSize(1); display.println("DS1307 read error!"); display.display(); }} break; case 1: if (millis()%500 < 50){ BMPp=bmp.readPressure()/133.32; printstrng("Tclock= ", 0, 0, 1); printfloat(bmp.readTemperature(), 50, 0, 2); printstrng(" C", 100, 0, 1); printstrng("Baro= ", 0, 24, 1); printfloat(BMPp, 37, 24, 2); printstrng(" mmHg", 93, 24, 1); if ( loopB != 0 ) { printstrng("T=", 0, 50, 1); printstrng("C", 36, 50, 1); printint(t, 13, 50, 2);} display.display();} break; } // end switch-case } // end of loop void print2digits(int number) { if (number >= 0 && number < 10) { display.write('0'); } display.print(number); } void printint(long number, int setx, int sety, int txtsize) { display.setTextSize(txtsize); display.setTextColor(WHITE); display.setCursor(setx,sety); display.print(number); } void printfloat(float number, int setx, int sety, int txtsize) { display.setTextSize(txtsize); display.setTextColor(WHITE); display.setCursor(setx,sety); display.print(number,1); } void printstrng(String dat, int setx, int sety, int txtsize) { display.setTextSize(txtsize); display.setTextColor(WHITE); display.setCursor(setx,sety); display.print(dat); }
скетч передатчика:
#include <stdlib.h> //???? #include <DHT.h> #include <Manchester.h> #define DHTPIN 2 #define DHTTYPE DHT11 float h=0; float t=0; DHT dht(DHTPIN, DHTTYPE); #define TX_PIN 0 //pin where your transmitter is connected void setup(void) { pinMode(1, OUTPUT); man.setupTransmit(TX_PIN, MAN_600); dht.begin(); } void loop(void) { uint8_t msg[20]; msg[1]=(int) dht.readTemperature(); msg[3]=(int) dht.readHumidity(); msg[0]='t'; msg[2]='h'; digitalWrite(1, true); man.transmitArray(20, msg); digitalWrite(1, false); delay(3000); }
часы в компактном сборе:
в корпусе из стеклопластика:
передатчик термометр:
неплохо, но корпус бы ему другой...
Помогите программа не компелируется.
Помогите программа не компелируется.
Нажмите на конопку "компиляция"
А если хотите увидеть другой ответ - приложите ошибки. Будем разбираться
ошибка в библиотеках AdafruitBMP085 и Adafruit_GFX. корректно их пропишите в скетче, я наверно ошибся
Нет не получается. Можете выслать на почту скетч и библиотеки.
AdafruitBMP085.h, может Adafruit_BMP085.h?
Приветствую всех. Нужна помощь специалистов. Имеется похожая метеостанция на BMP180. Я живу на высоте 123 м над уровнем моря, а датчик показывает -57 м. Да и давление не совпадает с механическим барометром, всегда больше механического показывает.
Подскажите, как скорректировать показания для библиотеки Adafruit_BMP085.h?
1