часы с барометром + беспроводной термометр
- Войдите на сайт для отправки комментариев
Работаю над следующим любительским проектом:
часы с барометром и приемником на 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?
#include <Wire.h> #include <Adafruit_BMP085.h>//библиотека датчика давления Adafruit_BMP085 bmp; float P;// переменная для давления #include "SPI.h" #include "DHT.h" #define DHTPIN 2 #define DHTTYPE DHT22 // использован датчик DHT12 DHT dht(DHTPIN, DHTTYPE); #include <OLED_I2C.h> // библиотека дисплея OLED OLED myOLED(SDA, SCL, 8); // Подключение дисплея hardware SDA , SCL extern uint8_t RusFont[]; // Русский шрифт extern uint8_t MegaNumbers[]; // Подключение больших шрифтов extern uint8_t SmallFont[]; // Базовый шрифт без поддержки русскийх символов. extern uint8_t term[]; // иконка градусника extern uint8_t grad[]; // иконка знака градуса extern uint8_t hum[]; // иконка влажности #include <DS1307.h> // библиотека часов DS1307 rtc(A0, A1); Time t; int x = 0; void setup() { myOLED.begin(); dht.begin(); bmp.begin (); myOLED.setFont(RusFont); myOLED.setBrightness(70); // желаемая яркость дисплея от 0 до 250 rtc.halt(false); //rtc.setDOW(THURSDAY); // установка часов //rtc.setTime(15, 48, 40); //20 сек на запись //rtc.setDate(02, 2, 2017); //Установим SQW/Out частоту для контроля частотомером //rtc.setSQWRate(SQW_RATE_32K); // на выбор 1Hz, 4K, 8K, 32K //rtc.enableSQW(true); } void loop() { // цикл отображения 6 секунд часы, потом датчики if (x >= 6) { temp(); h(); tem(); dat(); x=0; } else { watch(); } x++; } void watch() { // цикл часов и календаря myOLED.setFont(RusFont); t = rtc.getTime(); switch (t.dow) // рисуем дни недели { case 1: myOLED.print("GJYTLTKMYBR", CENTER, 0); break; case 2: myOLED.print("DNJHYBR", CENTER, 0); break; case 3: myOLED.print("CHTLF", CENTER, 0); break; case 4: myOLED.print("XTNDTHU", CENTER, 0); break; case 5: myOLED.print("GZNYBWF", CENTER, 0); break; case 6: myOLED.print("CE<<JNF", CENTER, 0); break; case 7: myOLED.print("DJCRHTCTYMT", CENTER, 0); break; } // вывод текущего времени на дисплей t = rtc.getTime(); myOLED.setFont(MegaNumbers); myOLED.printNumI(int(t.hour), 4, 12, 2, '0'); myOLED.print("/", 52, 12); myOLED.printNumI(int(t.min), 75, 12, 2, '0'); myOLED.setFont(RusFont); switch (t.mon) // рисуем месяцы { case 1: myOLED.print(String(t.date), 20, 57); myOLED.print("ZYDFHZ", CENTER, 57); myOLED.print(String(t.year), 92, 57); break; case 2: myOLED.print(String(t.date), 20, 57); myOLED.print("ATDHFKZ", CENTER, 57); myOLED.print(String(t.year), 92, 57); break; case 3: myOLED.print(String(t.date), 20, 57); myOLED.print("VFHNF", CENTER, 57); myOLED.print(String(t.year), 92, 57); break; case 4: myOLED.print(String(t.date), 20, 57); myOLED.print("FGHTKZ", CENTER, 57); myOLED.print(String(t.year), 92, 57); break; case 5: myOLED.print(String(t.date), 20, 57); myOLED.print("VFZ", CENTER, 57); myOLED.print(String(t.year), 92, 57); break; case 6: myOLED.print(String(t.date), 20, 57); myOLED.print("B>YZ", CENTER, 57); myOLED.print(String(t.year), 92, 57); break; case 7: myOLED.print(String(t.date), 20, 57); myOLED.print("B>KZ", CENTER, 57); myOLED.print(String(t.year), 92, 57); break; case 8: myOLED.print(String(t.date), 20, 57); myOLED.print("FDUECNF", CENTER, 57); myOLED.print(String(t.year), 92, 57); break; case 9: myOLED.print(String(t.date), 20, 57); myOLED.print("CTYNZ<HZ", CENTER, 57); myOLED.print(String(t.year), 92, 57); break; case 10: myOLED.print(String(t.date), 20, 57); myOLED.print("JRNZ<HZ", CENTER, 57); myOLED.print(String(t.year), 92, 57); break; case 11: myOLED.print(String(t.date), 20, 57); myOLED.print("YJZ<HZ", CENTER, 57); myOLED.print(String(t.year), 92, 57); break; case 12: myOLED.print(String(t.date), 20, 57); myOLED.print("LTRF<HZ", CENTER, 57); myOLED.print(String(t.year), 92, 57); break; } // вывод мигающего двоеточия myOLED.update(); delay(450); myOLED.setFont(MegaNumbers); myOLED.print("-", 51, 12); myOLED.update(); delay(450); } void temp(){ // Выводим на дисплей значения температуры ВМР085 myOLED.clrScr(); myOLED.setFont(RusFont); myOLED.print("NTVGTHFNEHF", CENTER, 0); myOLED.drawBitmap(0, 17, term, 19, 40); myOLED.setFont(MegaNumbers); myOLED.print(String(bmp.readTemperature() , 1), 21, 16); // Вывод значения температуры, с точностью до десятых myOLED.drawBitmap(115, 12, grad, 13, 12); myOLED.update(); delay(4000); // Пауза } void h(){ // Выводим на дисплей значения датчика DHT22 myOLED.clrScr(); myOLED.setFont(RusFont); myOLED.print("DKF:YJCNM", CENTER, 0); myOLED.drawBitmap(0, 20, hum, 28, 31); myOLED.setFont(MegaNumbers); myOLED.print(String(dht.readHumidity(), 1), 32, 16); // вывод значения влажности myOLED.update(); delay(4000); // Пауза } void tem(){ myOLED.clrScr(); myOLED.setFont(RusFont); myOLED.print("NTVGTHFNEHF", CENTER, 0); myOLED.drawBitmap(0, 17, term, 19, 40); myOLED.setFont(MegaNumbers); myOLED.print(String(dht.readTemperature(), 1), 21, 16); // Вывод значения температуры, с точностью до десятых myOLED.drawBitmap(115, 12, grad, 13, 12); myOLED.update(); delay(4000); // Пауза } void dat(){ // Выводим на дисплей значения атмосферного давления ВМР085 myOLED.clrScr(); myOLED.setFont(RusFont); myOLED.print("LFDKTYBT", CENTER, 0); myOLED.setFont(SmallFont); myOLED.print("MM.PT.CT", CENTER, 57); myOLED.setFont(MegaNumbers); P=bmp.readPressure(); // считывем показания P=(float)0.0075*P; // пересчет значения в мм.рт.ст myOLED.print(String(P, 1), CENTER, 16); // Отображение значения давления, с точностью до десятых myOLED.update(); delay(4000); // пауза myOLED.clrScr(); }1