часы с барометром + беспроводной термометр

carboksyl
Offline
Зарегистрирован: 28.07.2015

 Работаю над следующим любительским проектом:

часы с барометром и приемником на 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);
}

часы в компактном сборе:

 

в корпусе из стеклопластика:

передатчик термометр:

 

 

ruslaN21regi
Offline
Зарегистрирован: 11.09.2015

неплохо, но корпус бы ему другой... 

Юрий М.
Offline
Зарегистрирован: 05.11.2016

Помогите программа не компелируется.

uncle_grin
Offline
Зарегистрирован: 26.04.2015

Юрий М. пишет:

Помогите программа не компелируется.

Нажмите на конопку "компиляция"

А если хотите увидеть другой ответ - приложите ошибки. Будем разбираться

Юрий М.
Offline
Зарегистрирован: 05.11.2016
Arduino: 1.6.5 (Windows XP), Плата"Arduino Uno"
 
Используем библиотеку arduino-libs-manchester-master в папке: C:\Program Files\Arduino\libraries\arduino-libs-manchester-master (legacy)
 
Используем библиотеку SPI в папке: C:\Program Files\Arduino\hardware\arduino\avr\libraries\SPI 
 
Используем библиотеку Wire в папке: C:\Program Files\Arduino\hardware\arduino\avr\libraries\Wire 
 
Используем библиотеку Adafruit_GFX в папке: C:\Program Files\Arduino\libraries\Adafruit_GFX (legacy)
 
Используем библиотеку Adafruit SSD1306 в папке: C:\Program Files\Arduino\libraries\Adafruit_SSD1306-master 
 
Используем библиотеку Time в папке: C:\Program Files\Arduino\libraries\Time (legacy)
 
Используем библиотеку DS1307RTC в папке: C:\Program Files\Arduino\libraries\DS1307RTC (legacy)
 
Используем библиотеку Keypad в папке: C:\Program Files\Arduino\libraries\Keypad (legacy)
 
sketch_nov12a.ino:6:28: fatal error: AdafruitBMP085.h: No such file or directory
compilation terminated.
Multiple libraries were found for "Adafruit_GFX.h"
 
 Used: C:\Program Files\Arduino\libraries\Adafruit_GFX
 
 Not used: C:\Program Files\Arduino\libraries\Adafruit-GFX-Library-master
 
Ошибка компиляции.
carboksyl
Offline
Зарегистрирован: 28.07.2015

ошибка в библиотеках AdafruitBMP085 и Adafruit_GFX. корректно их пропишите в скетче, я наверно ошибся

Юрий М.
Offline
Зарегистрирован: 05.11.2016

Нет не получается. Можете выслать на почту скетч и библиотеки.

igormoh
Offline
Зарегистрирован: 04.11.2016

AdafruitBMP085.h, может Adafruit_BMP085.h?

edcop
Offline
Зарегистрирован: 23.07.2016

Приветствую всех. Нужна помощь специалистов. Имеется похожая метеостанция на 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();
  }

 

VoronS
Offline
Зарегистрирован: 28.11.2017

1