Как стать автором
Обновить
0
FLProg
Визуальная среда Arduino и ESP8266

Ещё одна метеостанция, пошаговая видеоинструкция

Время на прочтение5 мин
Количество просмотров29K
Последнее время все более популярна стала тема метеостанций. Наверное создание собственной погодной станции является хорошей практикой в освоении ардуинки. Хочу внести свой небольшой вклад в это благое дело.
Хочу представить Вам видео урок по работе с датчикам температуры, влажности, давления, и выводу этих данных на дисплей.Возможно эта информация кому — то поможет начать свой путь в мир микроконтроллеров.

Станция собиралась по этой схеме.


Ну а вот и сам урок


Проект созданный в процессе урока

Созданный скетч
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include "DHT.h"
#include <OneWire.h>
#include "RTClib.h"
#include <BMP085.h>
BMP085  _bmp085 = BMP085();
long _bmp085P = 0;
long _bmp085T = 0;
long _bmp085A = 0;
byte _d18x2x1Addr[8] = {0x28, 0xFF, 0x11, 0x94, 0x3C, 0x4, 0x0, 0x48};
RTC_DS1307  _RTC1;
DateTime  _tRTC1;
LiquidCrystal_I2C _lcd1(0x3F, 20, 4);
int _dispTempLength1 = 0;
boolean _isNeedClearDisp1;
DHT _dht1(2, DHT22);
OneWire  _ow3(3);
String _gtv1;
String _gtv2;
String _gtv3;
String _gtv4;
String _gtv5;
String _gtv6;
bool _gtv7 = 0;
int _gtv8 = 0;
bool _gtv9 = 0;
unsigned long _d18x2x1Tti = 0UL;
float _d18x2x1O = 0.00;
unsigned long _bmp0851Tti = 0UL;
unsigned long _dht1Tti = 0UL;
float _dht1t = 0.00;
float _dht1h = 0.00;
bool _count1I = 0;
int _count1P = 0;
bool _trgs1 = 0;
bool _D1B1 = 0;
bool _tim1I = 0;
bool _tim1O = 0;
unsigned long _tim1P = 0UL;
int _disp1oldLength = 0;
int _disp2oldLength = 0;
String _mux1;
int _disp3oldLength = 0;
String _mux2;
int _disp4oldLength = 0;
String _mux3;
int _disp5oldLength = 0;
bool _bounseInput5S = 0;
bool _bounseInput5O = 0;
unsigned long _bounseInput5P = 0UL;
bool _bounseInput4S = 0;
bool _bounseInput4O = 0;
unsigned long _bounseInput4P = 0UL;
void setup()
{
  Wire.begin();
  _bmp085.init(MODE_ULTRA_HIGHRES, 300, true);
  _RTC1.begin();
  pinMode(5, INPUT);
  digitalWrite(5, HIGH);
  pinMode(4, INPUT);
  digitalWrite(4, HIGH);

  _lcd1.init();
  _lcd1.noBacklight();
  _bounseInput5O =  digitalRead(5);
  _bounseInput4O =  digitalRead(4);
  _dht1.begin();
}
void loop()
{ _tRTC1 = _RTC1.now();
  if (_isTimer(_dht1Tti, 8000)) {
    _dht1Tti = millis();
    float tempDht2;
    tempDht2 = _dht1.readTemperature();
    if (!(isnan(tempDht2))) {
      _dht1t = tempDht2;
    }
    tempDht2 = _dht1.readHumidity();
    if (!(isnan(tempDht2))) {
      _dht1h = tempDht2;
    }
  } if (_isNeedClearDisp1) {
    _lcd1.clear();
    _isNeedClearDisp1 = 0;
  }
  if (_isTimer(_bmp0851Tti, 6000)) {
    _bmp0851Tti = millis();
    _bmp085.getAltitude(&_bmp085A);
    _bmp085.getPressure(&_bmp085P);
    _bmp085.getTemperature(&_bmp085T);
  }
  bool  _bounceTmp5 =  (digitalRead (5));

  if (_bounseInput5S)
  {
    if (millis() >= (_bounseInput5P + 40))
    {
      _bounseInput5O = _bounceTmp5;
      _bounseInput5S = 0;
    }
  }
  else
  {
    if (_bounceTmp5 != _bounseInput5O )
    {
      _bounseInput5S = 1;
      _bounseInput5P = millis();
    }
  }
  bool  _bounceTmp4 =  (digitalRead (4));

  if (_bounseInput4S)
  {
    if (millis() >= (_bounseInput4P + 40))
    {
      _bounseInput4O = _bounceTmp4;
      _bounseInput4S = 0;
    }
  }
  else
  {
    if (_bounceTmp4 != _bounseInput4O )
    {
      _bounseInput4S = 1;
      _bounseInput4P = millis();
    }
  }



  if (_isTimer(_d18x2x1Tti, 5000)) {
    _d18x2x1Tti = millis();
    _d18x2x1O =  _readDS18_ow3(_d18x2x1Addr, 0);
  }
  _gtv1 = ((String("T-")) + (( _floatToStringWitRaz((_d18x2x1O), 2))) + (String("C")));
  _gtv2 = ((String("T-")) + (( _floatToStringWitRaz((_bmp085T) / (10.00), 1))) + (String("C")));
  _gtv3 = ((String("P-")) + ((String((_bmp085P) / (1000)))) + (String("kPa")));
  _gtv4 = ((String("A")) + ((String(_bmp085A))) + (String("cm")));
  _gtv5 = ((String("T-")) + (( _floatToStringWitRaz(_dht1t, 2))) + (String("C")));
  _gtv6 = ((String("H-")) + (( _floatToStringWitRaz(_dht1h, 2))) + (String("%")));

  if (!(_bounseInput5O))
  {
    if (! _count1I)
    {
      _count1P = _count1P + 1;
      _count1I = 1;
    }
  }
  else
  {
    _count1I = 0;
  }
  if (_count1P < 0 ) _count1P = 0;
  if (_gtv7) _count1P = 0;
  _gtv7 =  _count1P  >=  3;
  _gtv8 = _count1P;
  if ( (!(_bounseInput4O)) || (!(_bounseInput5O)) ) _trgs1 = 1;
  if (_gtv9) _trgs1 = 0;
  if ( (_trgs1) && (_bounseInput5O) )
  {
    if (_tim1I)
    {
      if ( _isTimer(_tim1P, 20000)) _tim1O = 1;
    }
    else
    {
      _tim1I = 1;
      _tim1P = millis();
    }
  }
  else
  {
    _tim1O = 0;
    _tim1I = 0;
  }
  if (_trgs1) {
    if (! _D1B1) {
      _lcd1.backlight();
      _D1B1 = 1;
    }
  } else {
    if (_D1B1) {
      _lcd1.noBacklight();
      _D1B1 = 0;
    }
  }
  _gtv9 = _tim1O;
  if (1) {
    _dispTempLength1 = (((((String((_tRTC1.hour())))) + (String(":")) + ((String((_tRTC1.minute())))) + (String(":")) + ((String((_tRTC1.second()))))))).length();
    if (_disp1oldLength > _dispTempLength1) {
      _isNeedClearDisp1 = 1;
    }
    _disp1oldLength = _dispTempLength1;
    _lcd1.setCursor(0, 0);
    _lcd1.print(((((String((_tRTC1.hour())))) + (String(":")) + ((String((_tRTC1.minute())))) + (String(":")) + ((String((_tRTC1.second())))))));
  } else {
    if (_disp1oldLength > 0) {
      _isNeedClearDisp1 = 1;
      _disp1oldLength = 0;
    }
  }
  if (1) {
    _dispTempLength1 = (((((String((_tRTC1.day())))) + (String("-")) + ((String((_tRTC1.month())))) + (String("-")) + ((String((_tRTC1.year()))))))).length();
    if (_disp2oldLength > _dispTempLength1) {
      _isNeedClearDisp1 = 1;
    }
    _disp2oldLength = _dispTempLength1;
    _lcd1.setCursor(9, 0);
    _lcd1.print(((((String((_tRTC1.day())))) + (String("-")) + ((String((_tRTC1.month())))) + (String("-")) + ((String((_tRTC1.year())))))));
  } else {
    if (_disp2oldLength > 0) {
      _isNeedClearDisp1 = 1;
      _disp2oldLength = 0;
    }
  }
  if ((_gtv8) == 0) {
    _mux1 = String("DS18B2");
  }
  if ((_gtv8) == 1) {
    _mux1 = String("Bmp-085");
  }
  if ((_gtv8) == 2) {
    _mux1 = String("DHT-22");
  }
  if (1) {
    _dispTempLength1 = ((_mux1)).length();
    if (_disp3oldLength > _dispTempLength1) {
      _isNeedClearDisp1 = 1;
    }
    _disp3oldLength = _dispTempLength1;
    _lcd1.setCursor(int((20 - _dispTempLength1) / 2), 1);
    _lcd1.print((_mux1));
  } else {
    if (_disp3oldLength > 0) {
      _isNeedClearDisp1 = 1;
      _disp3oldLength = 0;
    }
  }
  if ((_gtv8) == 0) {
    _mux2 = _gtv1;
  }
  if ((_gtv8) == 1) {
    _mux2 = _gtv2;
  }
  if ((_gtv8) == 2) {
    _mux2 = _gtv5;
  }
  if (1) {
    _dispTempLength1 = ((_mux2)).length();
    if (_disp4oldLength > _dispTempLength1) {
      _isNeedClearDisp1 = 1;
    }
    _disp4oldLength = _dispTempLength1;
    _lcd1.setCursor(0, 2);
    _lcd1.print((_mux2));
  } else {
    if (_disp4oldLength > 0) {
      _isNeedClearDisp1 = 1;
      _disp4oldLength = 0;
    }
  }
  if ((_gtv8) == 0) {
    _mux3 = String("-----");
  }
  if ((_gtv8) == 1) {
    _mux3 = ((_gtv3) + (String("/")) + (_gtv4));
  }
  if ((_gtv8) == 2) {
    _mux3 = _gtv6;
  }
  if (1) {
    _dispTempLength1 = ((_mux3)).length();
    if (_disp5oldLength > _dispTempLength1) {
      _isNeedClearDisp1 = 1;
    }
    _disp5oldLength = _dispTempLength1;
    _lcd1.setCursor(0, 3);
    _lcd1.print((_mux3));
  } else {
    if (_disp5oldLength > 0) {
      _isNeedClearDisp1 = 1;
      _disp5oldLength = 0;
    }
  }



}
bool _isTimer(unsigned long startTime, unsigned long period )
{
  unsigned long endTime;
  endTime = startTime + period;
  return (millis() >= endTime);
}
String  _floatToStringWitRaz(float value, int raz)
{
  float tv;
  int ti = int(value);
  String ts = String(ti);
  if (raz == 0) {
    return ts;
  }
  ts += ".";
  float tf = abs(value - ti);
  for (int i = 1; i <= raz; i++ )
  {
    tv = tf * 10;
    ti = int(tv);
    ts += String(ti);
    tf = (tv - ti);
  }
  return ts;
}
float _convertDS18x2xData(byte type_s, byte data[12])
{
  int16_t raw = (data[1] << 8) | data[0];
  if (type_s)
  {
    raw = raw << 3;
    if (data[7] == 0x10) {
      raw = (raw & 0xFFF0) + 12 - data[6];
    }
  }
  else
  {
    byte cfg = (data[4] & 0x60);
    if (cfg == 0x00) raw = raw & ~7;   else if (cfg == 0x20) raw = raw & ~3;  else if (cfg == 0x40) raw = raw & ~1;
  }
  return  (float)raw / 16.0;
}
float _readDS18_ow3(byte addr[8], byte type_s)
{ byte data[12];
  byte i;
  _ow3.reset();
  _ow3.select(addr);
  _ow3.write(0xBE);
  for ( i = 0; i < 9; i++) {
    data[i] = _ow3.read();
  }
  _ow3.reset();
  _ow3.select(addr);
  _ow3.write(0x44, 1);
  return _convertDS18x2xData(type_s, data);
}



PS. В следующем видео уроке планируется подключение SD картридера для логгирования показаний датчиков.
Теги:
Хабы:
Если эта публикация вас вдохновила и вы хотите поддержать автора — не стесняйтесь нажать на кнопку
Всего голосов 22: ↑19 и ↓3+16
Комментарии20

Публикации

Информация

Сайт
flprog.ru
Дата регистрации
Дата основания
Численность
1 человек (только я)
Местоположение
Россия

Истории