Метеостанция на Nano

Strannik-s
Offline
Зарегистрирован: 13.05.2015

Вот такой проект получился.

Изначально к данному прибору был добавлен модуль часов реального времени RTC, но по какой то причине после использования его в другом проекте он вышел из строя (и так произошло с тремя различными модулями на DS1302 и DS 1307). Поэтому в данном скетче часы реализованы програмно, что правда приводит к отставанию по времени (возможно потому что плата Нано из Китая и что то не ровно считает милисекунды - может даже кварц)

Так вот на дисплей выведена информация от датчиков:

 температура и влажность-  DHT11 -

давление - bmp085 -  ( на фото целый набор датчиков ускорения и т.д, но использовал только 085-ый)

- время

- TFT дисплей от Нокия 5110

При помощи кнопки (лев.верх) вхожу в меню установки времени и даты. Пока что кнопками (нижним рядом) меняю только минуты в "+" и в "-", а часы подтягиваются за ними. В планах отставшейся кнопкой - прав. верх. переключаться на установку часов, минут, даты.

 

//* Sergey K 

#define BTN_PLUSE 11
#define BTN_MINUSE 12
#define BTN_MODE 3
#define BTN_EXIT 4

#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>

Adafruit_PCD8544 display = Adafruit_PCD8544(10, 9, 8, 7, 6);

#include "I2Cdev.h"
#include "BMP085.h"
#include "DHT.h"
#include <Wire.h>
#include <Time.h>
//#include <DS1307RTC.h>
#define DHTPIN 2 
BMP085 barometer;

#define DHTTYPE DHT11   // DHT 11
DHT dht(DHTPIN, DHTTYPE);
float temperature;
float pressure;
float altitude;
int32_t lastMicros;

int Day=19;
int Month = 1;
int Year = 2016;
int Secon=0;
int Minute = 00;
int Hour = 16;
int flag_0=0;
int flag_1 =0;
int flag_2=0;

long timer=0;

#define LED_PIN 13 // (Arduino is 13, Teensy is 11, Teensy++ is 6)
bool blinkState = false;

void setup()   {
  Serial.begin(9600);
  Wire.begin();
  dht.begin();
  display.begin();
  
  Serial.println("Initializing I2C devices...");
  barometer.initialize();
  // verify connection
  Serial.println("Testing device connections...");
  Serial.println(barometer.testConnection() ? "BMP085 connection successful" : "BMP085 connection failed");
  
  // Контраст дисплея
  display.setContrast(60);
  //display.display(); // show splashscreen
 // delay(100);
  display.clearDisplay();   // clears the screen and buffer
  display.setCursor(10,10);
  display.setTextSize(2);
  display.setTextColor(BLACK); // 'inverted' text
  display.print("METEO");
  display.display();
 // delay(500);
  display.clearDisplay();
  
  pinMode(BTN_PLUSE, INPUT);
  pinMode(BTN_MINUSE, INPUT);
  pinMode(BTN_MODE, INPUT);
  pinMode(BTN_EXIT, INPUT);
  
  digitalWrite(BTN_PLUSE, LOW);
  digitalWrite(BTN_MINUSE, LOW);
  digitalWrite(BTN_MODE, LOW);
  digitalWrite(BTN_EXIT, LOW);

}
void loop() {
  flag_0=0;
  flag_1 =0;
  flag_2=0;
  display.clearDisplay();
  float h = dht.readHumidity();
  int t = dht.readTemperature();
  if (isnan(h) || isnan(t)) 
  {
    Serial.println("Failed to read from DHT sensor!");
    return;
  }

  
  if (millis() - timer >= 950)
  {
    timer = millis();
    Secon++;
   times ();
  }
  
   clock(Hour, Minute, Secon, Day, Month, Year);
    
    barometer.setControl(BMP085_MODE_TEMPERATURE);
    lastMicros = micros();
    while (micros() - lastMicros < barometer.getMeasureDelayMicroseconds());
    temperature = barometer.getTemperatureC();
    display.setCursor(0,4);
    display.setTextSize(2);
    display.setTextColor(BLACK); // 'inverted' text
    display.print(t);
    display.print("C");
    
    display.setTextSize(1);
    barometer.setControl(BMP085_MODE_PRESSURE_3);
    lastMicros = micros();
    while (micros() - lastMicros < barometer.getMeasureDelayMicroseconds());
    pressure = barometer.getPressure();
    altitude = barometer.getAltitude(pressure);
    int pres = pressure/133.322;
    int alt = altitude;
  
    display.setCursor(40,0);
    display.setTextColor(BLACK); 
    display.print(pres);
    display.print("mmHg");
    display.setCursor(40,8);
    display.print(h);
    display.print("% ");
    display.setCursor(40,16);
    display.print(alt);
    display.println("alt  ");
    display.display();
    
    if (digitalRead(BTN_MODE)==HIGH)
    { 
     mode();      
    }
}
void mode ()  // функция устанавлявающая время и дату
{
label_0:

 display.clearDisplay();
 
   clock(Hour, Minute, Secon, Day, Month, Year);
   times ();
   display.display();
  if ( digitalRead(BTN_PLUSE)==HIGH && flag_1==1)
   {
     Minute++;
     flag_1=0;
     
   }
  if ( digitalRead(BTN_PLUSE)==LOW && flag_1==0)
    flag_1=1;
    
  if ( digitalRead(BTN_MINUSE)==HIGH && flag_2==1)  
  {
    Minute--;
    flag_2=0;
  }
  if ( digitalRead(BTN_MINUSE)==!HIGH && flag_2==0) 
    flag_2=1;
     
  if(digitalRead(BTN_MODE)==HIGH&&flag_0==0)//если кнопка нажата    
     // и перемення flag равна 0 , то ... 
     { 
       goto label_0;
        //это нужно для того что бы с каждым нажатием кнопки 
        //происходило только одно действие 
        // плюс защита от "дребезга"  100% 
        
     } 
  else {
    flag_0=1;
      }
     
  if(digitalRead(BTN_MODE)==!HIGH && flag_0==1)//если кнопка нажата 
     //и переменная flag равна - 0 ,то ... 
     { 
       goto label_0;
     } 
}
void clock (int H, int M, int S, int D, int Mon, int Y)  // функция выводящая на экран время
{
    display.setTextSize(2);
    display.setCursor(0,25);
    display.setTextColor(BLACK); 
    display.print(H);
    display.setCursor(20,25);
    display.print(":");
    display.setCursor(28,25);
    if (M>=0 && M<10)
    display.print("0");
    display.print(M);
    display.setCursor(50,25);
    display.print(":");
    display.setCursor(58,25);
    if (S>=0 && S<10)
    display.print("0");
    display.print(S);
    display.setTextColor(BLACK); 
    display.setTextSize(1);
    display.setCursor(12,41);
    display.print(D);
    display.print("/");
    display.print(Mon);
    display.print("/");
    display.print(Y);
}
void times ()  // функция считающая время и дату
{
  if (Secon>=60)
    {
     Minute++; 
     Secon=0;
    }
    if (Minute>=60)
    { 
      Minute=0;
      Hour++;
    }
    if (Hour>=24)
    {
    Hour=0;
    Day++;
    }
    if (Day>=31)
    {
    Month++;
    Day=1;
    }
     if (Minute<0)
    { 
      Minute=59;
      Hour--;
    }
    if (Hour<0)
    {
    Hour=23;
    Day--;
    }
    if (Day<0)
    {
    Month--;
    Day=30;
    }  
}


 

Strannik-s
Offline
Зарегистрирован: 13.05.2015

По Методу форума картинка не грузится, так что даю ссылку на Яндекс

https://yadi.sk/i/NcV5liFtnLgTV

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Strannik-s, ну несолидно как-то. Таких метеостанций только на данно форуме вагон и маленькая тележка. Да и в каждом магазине они валяются на любой вкус. Добавьте хоть чтобы ещё и прогноз с гисметео загружала и показывала - всё какая-то новизна.

Strannik-s
Offline
Зарегистрирован: 13.05.2015

Этот проект вышел как побочный эффект системы мониторинга, которая будет измерять температуру, количество открываний двери, количество проходящих людей, многое другое, геопозиционирование, делать фото и отправлять все данные на сервер в таблицу а фото на ФТП сервер. А пока что вышел вот такой вот проект, первое практическое применение. Вас благодарю за обратную связь.

yucan
Offline
Зарегистрирован: 20.04.2015

Собрал. Что то на экране пусто...

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

yucan пишет:

Собрал. Что то на экране пусто...

проверьте 058

058 display.setContrast(60);

обычно об этом забывают.

yucan
Offline
Зарегистрирован: 20.04.2015

Спасибо bodriy2014!  Пробовал менять контрастность - бесполезно. Похоже что то с моим новым дисплеем 5110...Разбираюсь.

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

yucan пишет:

Спасибо bodriy2014!  Пробовал менять контрастность - бесполезно. Похоже что то с моим новым дисплеем 5110...Разбираюсь.

А примеры которые с библиотекой шли работают?

если нет смотрите подключение, если идут смотрите код.

yucan
Offline
Зарегистрирован: 20.04.2015

Вчера пересобрал дисплей, присланный с "АЛИ", он заработал. Там вечная проблема с резинкой. Не знаю, надолго ли его хватит. Но до этого с дуру переустановил среду. Теперь куча ошибок при компиляции. Компилятор ругается на BMP085. "Class BMP085 has no member named initialize". Библиотеки, которые до этого стояли, все вернул. Не пойму в чём дело.

Strannik-s
Offline
Зарегистрирован: 13.05.2015

Надо смотреть подключение, у меня BMP085 на общем модуле с другими датчиками. 

Господа, а кто сталкивался с регулярным выходом из строя часов реального времени - три модуля 1302 и 1307 вышли из строя

lex2k
Offline
Зарегистрирован: 17.12.2015

Strannik-s пишет:

Надо смотреть подключение, у меня BMP085 на общем модуле с другими датчиками. 

Господа, а кто сталкивался с регулярным выходом из строя часов реального времени - три модуля 1302 и 1307 вышли из строя

были тут комента по поводу этих часиков...не надежные они ..бери ds3231

yucan
Offline
Зарегистрирован: 20.04.2015

Strannik-s пишет:

Надо смотреть подключение, у меня BMP085 на общем модуле с другими датчиками. 

Господа, а кто сталкивался с регулярным выходом из строя часов реального времени - три модуля 1302 и 1307 вышли из строя

Но скетч откомпилироваться по любому ведь должен, даже без датчиков! Насчет RTC - я использую ds3231. Ранее сталкивался с не точностью хода 1307, больше их не заказываю.

yucan
Offline
Зарегистрирован: 20.04.2015

Вопрос  к автору темы! Какую версию ардуины импользуете и какие библиотеки для этого проека?  Не могу избавиться от ошибки

Strannik-s
Offline
Зарегистрирован: 13.05.2015

Используется Нано.

Однако вчера произошло странное, обновил программу Arduino IDE до последней версии, и вот теперь выскакивает ошибка что у меня все библиотеки сторонние НЕВЕРНЫЕ ! и это не про вероисповедание. Так что сам сейчас в ужасе разбираюсь, что же произошло, при этом ни один проект не грузится...

yucan
Offline
Зарегистрирован: 20.04.2015

Нано от мини отличаются лишь отсутсвием usb-com интерфейса у последнего. Вот и я до этого обновил среду. Но потом я вернул всё на место, но ошибки не пропадают.

Strannik-s
Offline
Зарегистрирован: 13.05.2015

и так, танцы с бубнами и откатом на более позднюю версию не помогли. Вопрос решился вот так: была папка библиотек i2cdev и т.д. в которой лежало множество библиотек по устройствам, и вот почему то её перестало видеть, вышел из ситуации так: в это папке директория Arduino , там еще несколько директорий с библиотеками, так вот их все скопировал в каталог с библиотеками в ардуино. и заработало

 

yucan
Offline
Зарегистрирован: 20.04.2015

 

Strannik-s, не могли бы вы мне прислать библиотеки, используемые в проекте? В моей папке I2Cdev только 4 файла (I2Cdev.cpp, I2Cdev.h, keywords.txt, library.json)...yucan@mail.ru

yucan
Offline
Зарегистрирован: 20.04.2015

Я вот этот проект сделал, но символы бывает трудно разглядеть, хочется с крупными!

Strannik-s
Offline
Зарегистрирован: 13.05.2015
Strannik-s
Offline
Зарегистрирован: 13.05.2015

добавь контраста на дисплее

display.setContrast(60);

yucan
Offline
Зарегистрирован: 20.04.2015

Скачал, сейчас буду пробовать. Контраста - да, не хватает.

yucan
Offline
Зарегистрирован: 20.04.2015

Сделал так, как вы описали выше. Все папаки из каталога "ардуино" закинул в папку "libraries". Всё равно та же самая ошибка "Class BMP085 has no member named initialize". У меня сейчас версия 1.06 Ардуино установлена. У вас какая?

Strannik-s
Offline
Зарегистрирован: 13.05.2015

Arduino 1.6.7

yucan
Offline
Зарегистрирован: 20.04.2015

Вобщем у меня в каталоге библиотек Ардуино была папка bmp085_1.  После её удаления проверка компиляции прошла и проект нормально загрузился.   Восстановил bmp085_1 - всё равно нормально компилируется. Так и не понял в чем было дело. Среда v1.06, в ней мне как то привычнее. Заработала! Спасибо автору!

Strannik-s
Offline
Зарегистрирован: 13.05.2015

Как показала практика, часы всё же добавлять необходимо - расчет времени на основе внутреннего кварца дает подгрешность то в + то в - 

yucan
Offline
Зарегистрирован: 20.04.2015

Согласен, неточность хода при работе от внутреннего генератора присутствует в любом устройстве. А нельзя ли снова привязать часы реального времени по квадратной шине? Или коррекцию хода сделать! Вчера присмотрелся - врут весьма прилично! Высосотомер тоже врёт в зависимости от атмосферного давления. Чем ниже давление, тем больше.

svchekalin
Offline
Зарегистрирован: 29.01.2016

а такой экранчик прекрутить реально ? http://ru.aliexpress.com/item/LCD-module-TFT-2-4-inch-TFT-LCD-screen-for...

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

svchekalin пишет:

а такой экранчик прекрутить реально ? http://ru.aliexpress.com/item/LCD-module-TFT-2-4-inch-TFT-LCD-screen-for...

Прикрутить реально, я себе в осциллограф такой и поставил, но учтите даже без использования карты памяти он занимает пины, я на кртинке указал какие обязательно подключать и в архиве с скетчем естть текстовый файл какие пины подключал к дуине http://srukami.inf.ua/pultoscop_v2.html

 

svchekalin
Offline
Зарегистрирован: 29.01.2016

а существуют переходники на i2c