Метеостанция как собрать?

agat20
Offline
Зарегистрирован: 25.06.2016

Прошу помощи... Есть задумка собрать компактную метеостанцию с автономным питанием (на литии 18650, можно с бустером или понижайкой -все есть в наличии) чтобы принес эту "коробочку" включил, измерил влажность, давление, температуру -с визуальным выводом на экран, выключил и ушел, так сказать пробник, особая точность не требуется (это не коммерческий проект-чисто для себя,в тему сделать за деньги прошу не отправлять). В наличии имеется Pro mini, Nano V3, Uno R3. Из датчиков имеется 

Датчик влажности http://ru.aliexpress.com/item/Industrial-High-Precision-Si7021-Humidity-Sensor-with-I2C-Interface-for-Arduino/32392418575.html?spm=2114.13010608.0.118.BBPGF3

Часы http://ru.aliexpress.com/item/DS3231-AT24C32-IIC-Module-Precision-Clock-Module-DS3231SN-for-Arduino-Memory-module-Free-Shipping/32346088222.html?spm=2114.13010608.0.207.BBPGF3

Барометр http://ru.aliexpress.com/item/1PCS-GY-68-BMP180-Replace-BMP085-Digital-Barometric-Pressure-Sensor-Module-For-Arduino/32346767511.html?spm=2114.13010608.0.247.BBPGF3

Такой мониторчик http://ru.aliexpress.com/item/1-8-inch-TFT-LCD-Module-LCD-Screen-Module-SPI-serial-51-drivers-4-IO-driver/32580365136.html?spm=2114.13010608.0.70.BBPGF3

Еще есть ОЛед дисплей 0,96.

Подключать все по отдельности я уже пробовал,  все нормально и работает, а вот как подключить все вместе? искал в интернете но точно такого набора не нашел. В принципе подключить я все таки смогу, а вот с программированием у меня беда, пробовал куски кода складывать в кучу-не получается. Изучать программирование с нуля, возраст уже не тот, да и думаю не пригодится мне это больше.  Уровень знаний -паяльник держу уверенно, транзистор от резистора отличаю, измерительные приборы есть все от мультиметра до осциллографа (пользоваться умею). Можете дать ссылку на готовый проект со скетчем, буду благодарен. Спасибо заранее.

   

alexvs
Offline
Зарегистрирован: 22.07.2014

Скорее всего Вам в раздел "Ищу исполнителя".

agat20
Offline
Зарегистрирован: 25.06.2016

alexvs пишет:

Скорее всего Вам в раздел "Ищу исполнителя".

Мдааа... поколение "пепси" чо сказать... Тогда перефразируем так- ищу единомышленников у кого что есть? будем делать народный проект... 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Поколение "Пепси" - это точно: "Давайте как быстренько скинемся и сделаем вместе для моей пользы."

Сходите в "Проекты" там такого богатства как метеостанции должно быть навалом.

Еще можно сходить в Google.

Как-то надо самому что-то делать, а не пытаться заставить других решать Ваши проблемы. Или Вы - блондинка?

agat20
Offline
Зарегистрирован: 25.06.2016

я конечно дико извиняюсь, но гугл меня уже забанил (шутка) в проектах был точно такого набора не нашел, я ж объяснил что соберу и соединю все сам (ума хватит) а вот с программированием у меня никак, я не учился этому (честно признаюсь) а насчет "моей пользы" -могу и без этого обойтись, соберу что нибудь другое -датчиков энтих разных у меня "как гуталину"! Насчет решать "мои" проблемы, тут вы немного хе-хе погорячились немного, у меня их нет! Первый раз попал на форум где люди не делятся знаниями и умениями, а как из засады пытаются укусить, не очень это... Ну и на том спасибо! С уважением, и всех благ.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Видите ли, agat20, программирование - это более половины проекта. Существенно более половины. Так что если хотит сделать что-то сами, без программирования - никак.

Вы ведь просите не поделиться знаниями и умениями - этим с Вами тут готовы поделиться, если Вы готовы принять такую помощь, а хотите чтобы бОльшую часть проекта кто-то сделал за Вас.

А если Вы не хотите учиться программировать, Ардуино не для Вас.

alex_r61
Offline
Зарегистрирован: 20.06.2012

agat20 делаю похожее, с другим дисплеем.

agat20
Offline
Зарегистрирован: 25.06.2016

Ну как бы не совсем не хочу учиться, просто думал люди поделятся кусками кода... не более того. Просто читаю уже несколько дней, но память слаба стала, вроде с вечера все понятно, а утром все по новой... ну чтож начнем классически -от простого к сложному. спасибо.

agat20
Offline
Зарегистрирован: 25.06.2016

alex_r61

А с каким дисплеем делаешь если не секрет? У меня их 4 вида разных, может у меня такоЙ же есть?Есть и2с, есть спи, есть пара штук с тачем (шилд многоногий)

angersos
angersos аватар
Offline
Зарегистрирован: 09.06.2016

Тут есть готовые проекты.

agat20
Offline
Зарегистрирован: 25.06.2016

Хде? Тут если что и нашел -так какое то старье (имею ввиду датчики) которые еще допиливать надо, кинь ссылку если не лень, спасибо.

angersos
angersos аватар
Offline
Зарегистрирован: 09.06.2016

Я сам не программист, но собрал по той схеме и доволен как слон.http://arduino.ru/forum/proekty/komnatnaya-meteostantsiya-s-chasami

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

С неугасающим интересом слежу за темой.

Я вижу так: пришел человек, говорит, что денег платить никому не хочет и програмирование учить тоже не хочет, но ему нужна программа.

Мотивируя совершенно невнятным аргументом, что, дескать, проект некоммерческий, настаивает на бесплатности услуги.

Мне просто интересно, найдет он лоха или все повывелись?

----------------------------------------

Милосердие, как пепел Клааса, стучит в мое сердце, и я готов пояснить, как пишут такие программы:

Вы создаете в воображении (и на бумаге) расписание действий.

1. в какое время и с каким интервалом нужно опрашивать датчики;

2. В какое время и с каким интервалом обновлять экран;

3. считывать состояние пользовательских кнопок;

4. менять режимы отображения и/или совершать иные действия по кнопкам.

-----------------

в setup() Вы инициализируете это все;

в loop() Вы проверяете локальное время на соответствие действию в расписании и начинаете то, что должно начать, если оно еще не началось, и/или прекращаете то, что должнео прекратить, если оно еще не прекращено.

Все.

==============

Если эти объяснения Вам не понятны, то найдите упаковку от своей платы Ардуино, запакуйте ее аккуратно и отправьте китайцам обратно.

agat20
Offline
Зарегистрирован: 25.06.2016

Спасибо, дружище, этот проект я видел, но у меня другие датчики, модуль часов и другой дисплей, могу и этот собрать но у меня датчики чуток покруче будут. спасибо.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

agat20 пишет:

просто думал люди поделятся кусками кода...

agat20 пишет:

...которые еще допиливать надо...

Вы всерьез думаете, что куски, которыми с Вами могут поделиться, не нужно будет допиливать?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

agat20 пишет:

Спасибо, дружище, этот проект я видел, но у меня другие датчики, модуль часов и другой дисплей, могу и этот собрать но у меня датчики чуток покруче будут. спасибо.

Хвалиться "крутыми" датчиками и при этом попрошайничать код... No comments...

agat20
Offline
Зарегистрирован: 25.06.2016

wdrakula пишет:

С неугасающим интересом слежу за темой.

Я вижу так: пришел человек, говорит, что денег платить никому не хочет и програмирование учить тоже не хочет, но ему нужна программа.

Мотивируя совершенно невнятным аргументом, что, дескать, проект некоммерческий, настаивает на бесплатности услуги.

Мне просто интересно, найдет он лоха или все повывелись?

----------------------------------------

Милосердие, как пепел Клааса, стучит в мое сердце, и я готов пояснить, как пишут такие программы:

Вы создаете в воображении (и на бумаге) расписание действий.

1. в какое время и с каким интервалом нужно опрашивать датчики;

2. В какое время и с каким интервалом обновлять экран;

3. считывать состояние пользовательских кнопок;

4. менять режимы отображения и/или совершать иные действия по кнопкам.

-----------------

в setup() Вы инициализируете это все;

в loop() Вы проверяете локальное время на соответствие действию в расписании и начинаете то, что должно начать, если оно еще не началось, и/или прекращаете то, что должнео прекратить, если оно еще не прекращено.

Все.

==============

Если эти объяснения Вам не понятны, то найдите упаковку от своей платы Ардуино, запакуйте ее аккуратно и отправьте китайцам обратно.

Корректируем проект. Поясняю новую задачу-я занимаюсь пчеловодством, для зимовки существует специальное помещение в котором поддерживается (должна по крайней мере) постоянная температура и влажность. В настоящее время уже работает (около 20 лет) простая система на биметаллическом датчике температуры, реле от советской бензоклонки и воздушные ТЭНы с потреблением 0,4-0,5 кВт. Но!!! нет мониторинга влажности. Пока уже готово (собрано и проверено, скетч готов)  которое меряет влажность и температуру и возможность просмотра данных по блютуз, еще хочу добавить реле чтобы включался вентиллятор для снижения влажности, ну и хотелось бы еще писать на карту SD. А так в принципе для мониторинга (не входя в помещение) могу по желанию мониторить температуру и влажность -уже не плохо!  

Насчет лохов вы как бы это помягче сказать "не оскорбляй да не оскорбляем будешь".

1. Интервалы опроса будут реже, не каждую секунду (в целях энергосбережения)

2. Могу обойтись без экрана (есть блутуз на крайняк)

3. Кнопки думаю в моем проекте они не пригодятся

4. Тоже не пригодится

И не надо Ёрничать, вас я понял до последнего знака в предложении! АрдуинЫ были в пакетиках (их много и разные) так что отсылать-не посылать (хихи)

Спасибо за подсказки они мне пригодятся (честно)! 

agat20
Offline
Зарегистрирован: 25.06.2016

Та ладнааа! Ну не крутыми а с широким диапазоном и более точными. Я не попрошайничаю, просто интересуюсь может кто делал что то подобное. Допиливать я думаю справлюсь, а вот с нуля поднять тяжеловато будет. 

agat20
Offline
Зарегистрирован: 25.06.2016

Читая этот сайт и многие другие узнал чем отличается Интерфейс I2C от SPI много чего другого интересного, Так что польза от общения уже есть!!! Время у меня есть, буду готовить проект (или 2 проекта параллельно) благо датчиков как гуталину! 

negavoid
Offline
Зарегистрирован: 09.07.2016

Ну, я прямо не знаю ))) Даст ли вам что-то чужой проект метеостанции с кодом, тут их множество в ветке Проекты. Тем более, что вы все компоненты по отдельности уже подключали и проверяли. Вот, положим, у меня есть метеостанция с таким же экраном, но с датчиком давления bmp180, подключенным по i2c, и другим, влажности, dht22. Часы мне в ней не нужны, зато пригождается таймер, иногда сбрасываю его ресетом и потом по нему ориентируюсь некоторое время.

#include <Adafruit_BMP085.h>
#include <Adafruit_GFX.h>
#include <Adafruit_ST7735.h>
#include <DHT.h>
// #include <Fonts/FreeMono9pt7b.h>
#include <SPI.h>
#include <Time.h>
#include <Wire.h>

#define DHT_PIN      2
#define TFT_PIN_RST  8   // Arduino Reset-Pin
#define TFT_PIN_DC   9   // Arduino-Pin an
#define TFT_PIN_CS   10  // Arduino-Pin an Display CS   
#define LED_PIN      13

#define DISPLAY_TIME 500
#define GRAPHIC_TIME 120000
#define SERIAL_TIME  2000
#define READING_TIME 500

#define GRAPHIC_SIZE 128

Adafruit_BMP085 bmp;
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_PIN_CS, TFT_PIN_DC, TFT_PIN_RST);
DHT dht(DHT_PIN, DHT22);

const float p0 = 101325;   // Pressure at sea level (Pa)

float  altitude;
float  dht_heat, dht_hum, dht_temp;
float  ePressure;
float  last_pressure_mmhg;
float  max_humidity, min_humidity;
float  max_temperature, min_temperature;
float  pressure_mmhg;
float  storage[ GRAPHIC_SIZE ];
float  temperature;
String trend = "0";
long   pressure;
unsigned long last_display_time = millis() + DISPLAY_TIME;
unsigned long last_graphic_time = millis();
unsigned long last_reading_time = millis();
unsigned long last_serial_time  = millis();
unsigned long last_storage_time = millis();
unsigned long last_trend_time   = millis();

void setup()
{
  Serial.begin(9600);

  tft.initR(INITR_BLACKTAB);

  tft.fillScreen(ST7735_BLACK);
  tft.setTextWrap(false);
  // tft.setFont(&FreeMono9pt7b);

  tft.setTextSize(1);
  tft.setCursor(24, 4);
  tft.setTextColor(ST7735_WHITE);
  tft.print(F("Warming up..."));

  tft.setTextSize(3);
  tft.setCursor(20, 70);
  tft.setTextColor(ST7735_CYAN);
  tft.print(F("Hello"));

  for (byte i = 10; i < 119; i++)
  {
    randomSeed(analogRead(A3));
    tft.drawLine(i, 24, i, 28, random(0xFFFF));
    delay(10);
  }

  // start meteo sensors
  Wire.begin();
  bmp.begin(BMP085_ULTRAHIGHRES);
  dht.begin();

  // first reading for trend sign
  temperature = bmp.readTemperature();
  pressure = bmp.readPressure();
  pressure_mmhg = (float)pressure * (760.0 / p0);

  // first reading for humidity
  max_humidity = dht.readHumidity();
  min_humidity = dht.readHumidity();

  // first reading for temperature
  max_temperature = temperature;
  min_temperature = temperature;

  // fill-in array for trend graph
  for (short i = 0; i < GRAPHIC_SIZE; i++)
  {
    storage[i] = pressure_mmhg;
  }

  tft.fillScreen(ST7735_BLACK);
}

void loop()
{
  doMeasurements();
  sendToDesktop();
  // long m = millis();
  showDisplay();
  // Serial.println(millis()-m);
  delay(10);
}

void doMeasurements(void)
{
  if (millis() - last_reading_time >= READING_TIME )
  {
    // BMP180
    temperature = bmp.readTemperature();
    pressure = bmp.readPressure();
    altitude = bmp.readAltitude();

    // Calculate more values from BMP180
    const float currentAltitude = 53.18; // altitude;             // current altitude in METERS
    ePressure = p0 * pow((1 - currentAltitude / 44330), 5.255);   // expected pressure (in Pa) at altitude
    pressure_mmhg = (float)pressure * (760.0 / p0);

    if ( temperature > max_temperature ) max_temperature = temperature;
    if ( temperature < min_temperature ) min_temperature = temperature;

    // DHT22
    dht_temp = dht.readTemperature();
    dht_hum  = dht.readHumidity();
    dht_heat = dht.computeHeatIndex(dht_temp, dht_hum, false);

    if ( dht_hum > max_humidity ) max_humidity = dht_hum;
    if ( dht_hum < min_humidity ) min_humidity = dht_hum;

    // check if dht22 works ok
    if ( isnan( dht_temp ) ) dht_temp = 0;
    if ( isnan( dht_hum ) )  dht_hum  = 0;
    if ( isnan( dht_heat ) ) dht_heat = 0;

    last_reading_time = millis();
  }

  // Update graph array
  if (millis() - last_storage_time >= GRAPHIC_TIME)
  {
    for (short i = 1; i < GRAPHIC_SIZE; i++)
    {
      storage[i - 1] = storage[i];
    }
    storage[GRAPHIC_SIZE - 1] = pressure_mmhg;

    last_storage_time = millis();
  }
}

void sendToDesktop(void)
{
  if (millis() - last_serial_time >= SERIAL_TIME)
  {
    // Send pressure to desktop
    Serial.println(pressure_mmhg);

    last_serial_time = millis();
  }
}

void showDisplay(void)
{
  if (millis() - last_display_time >= DISPLAY_TIME)
  {
    // weather forecast
    tft.setTextSize(1);
    tft.setTextColor(ST7735_WHITE, ST7735_BLACK);
    tft.setCursor(44, 2);

    float weatherDiff;
    weatherDiff = pressure - ePressure - 790;  // -640 Pa is a correction for me for ~ +50 meters above sea level [for 760 mmHg]
    if (weatherDiff > 250)
    {
      tft.setTextColor(ST7735_YELLOW, ST7735_BLACK);
      tft.print(F("Sunny "));
    }
    else if ((weatherDiff <= 250) && (weatherDiff >= -250))
    {
      tft.setTextColor(ST7735_GREEN, ST7735_BLACK);
      tft.print(F("Cloudy"));
    }
    else if (weatherDiff < -250)
    {
      tft.setTextColor(ST7735_CYAN, ST7735_BLACK);
      tft.print(F("Rainy "));
    }

    // big temperature
    tft.setTextSize(3);
    tft.setTextColor(ST7735_GREEN, ST7735_BLACK);
    tft.setCursor(10, 20);
    tft.print((float)temperature, 1);

    // small temperature dht
    tft.setTextSize(1);
    tft.setTextColor(ST7735_RED, ST7735_BLACK);
    tft.setCursor(92, 20);
    tft.print(max_temperature, 1);

    // small temperature bmp
    tft.setTextColor(ST7735_CYAN, ST7735_BLACK);
    tft.setCursor(92, 32);
    tft.print(min_temperature, 1);

    // humidity
    tft.setTextSize(2);
    tft.setTextColor(ST7735_CYAN, ST7735_BLACK);
    tft.setCursor(12, 54);
    tft.print(dht_hum, 1);
    tft.print(F(" %"));

    // max humidity
    tft.setTextSize(1);
    tft.setTextColor(ST7735_YELLOW, ST7735_BLACK);
    tft.setCursor(92, 52);
    tft.print(max_humidity, 1);

    // min humidity
    tft.setTextSize(1);
    tft.setTextColor(ST7735_GREEN, ST7735_BLACK);
    tft.setCursor(92, 64);
    tft.print(min_humidity, 1);

    // pressure, mm
    tft.setTextSize(2);
    tft.setTextColor(ST7735_YELLOW, ST7735_BLACK);
    tft.setCursor(12, 80);
    tft.print(pressure_mmhg, 2);
    tft.print(F(" mm"));

    // graphic
    if (millis() - last_graphic_time >= GRAPHIC_TIME)
    {
      printGraphic();
      last_graphic_time = millis();
    }

    // pressure, Pa
    tft.setTextSize(1);
    tft.setTextColor(ST7735_MAGENTA, ST7735_BLACK);
    tft.setCursor(4, 128);
    tft.print(pressure);
    tft.print(F(" Pa "));

    // pressure, diff
    tft.setCursor(76, 128);
    tft.print(pressure - ePressure - 790, 0); // 790 - see above
    tft.print(F(" Pa "));

    // heat index
    tft.setTextColor(54790, ST7735_BLACK);
    tft.setCursor(4, 144);
    tft.print(dht_heat);

    // light
    tft.setTextColor(tft.Color565(0xff, 0x58, 0x30), ST7735_BLACK);
    tft.setCursor(100, 144);
    tft.print(analogRead(3));
    tft.print(F("    "));

    // timer
    tft.setTextColor(ST7735_GREEN, ST7735_BLACK);
    tft.setCursor(43, 144);
    printTime();

    last_display_time = millis();
  }
}

void printTime(void)
{
  printDigits(hour());
  tft.print(":");
  printDigits(minute());
  tft.print(":");
  printDigits(second());
}

void printDigits(int digits) {
  if (digits < 10) tft.print("0");
  tft.print(digits, DEC);
}

void printGraphic(void)
{
  float max = storage[0];
  float min = storage[0];

  for (short i = 0; i < GRAPHIC_SIZE; i++)
  {
    if (max < storage[i]) max = storage[i];
    if (min > storage[i]) min = storage[i];
  }

  // better add buffering
  tft.fillRect(0, 100, 128, 26, ST7735_BLACK);
  for (short i = 0; i < GRAPHIC_SIZE; i++)
  {
    float pos = mapf(storage[i], min, max, 124, 100);
    if ( !isnan(pos) )
    {
      tft.drawPixel(i, constrain(pos, 100, 124), ST7735_CYAN);
      // tft.drawLine(i, 124, i, pos, ST7735_CYAN);
    }
  }
}

float mapf(float x, float in_min, float in_max, float out_min, float out_max)
{
  return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}

PS Агата у меня не было, был спекки и потом уже ес1841 :)

agat20
Offline
Зарегистрирован: 25.06.2016

О! Спасибо дружище! Это уже интересней!!! Уже есть вектор! Вы реально помогли! Спасибо (честно) поковыряюсь!

PS "агата" и у меня не было...первое что попробовал это была вычислительная машина с частотой 400 Гц! (для исчисления данных для пуска ракет) даааавно это было!

agat20
Offline
Зарегистрирован: 25.06.2016

Скетч не скомпилировался, есть ошибки на моей машине, завтра исправлю и буду поглядеть.

alexvs
Offline
Зарегистрирован: 22.07.2014

agat20 пишет:

Мдааа... поколение "пепси" чо сказать... Тогда перефразируем так- ищу единомышленников у кого что есть? будем делать народный проект... 

Глядя на "чо сказать" - кто тут еще поколение "пепси" :) На "народный проект" ваша будущая поделка не тянет - ибо заинтересованность тут только односторонняя.

agat20
Offline
Зарегистрирован: 25.06.2016

Первый результат. Собрал на макетке модуль часов DS3231 I2C (имеет встроенный термометр), монитор 0.96 дюймов OLED модуль I2C, часы и монитор соединил паралельно без подтяжек, время в часы зашивал отдельно. Сравнил показания термометра часов с модулем датчик влажности SHT21, и термопарой на мультиметре разница оказалась в 0,5 гр, часы завышают температуру на 0,5-0,6 гр (в принципе не критично). Ниже скетч (писал не сам-добрые люди подсказали), модули подключал как обычно SDA и SCK в пины А4 и А5 (pin-mapping не делал) плата Ардуино уно R3 (китай). Все работает  

 

#include <Wire.h>
#include <OLED_I2C.h>

OLED  myOLED(SDA, SCL, 8);

extern uint8_t SmallFont[];
extern uint8_t MediumNumbers[];
extern uint8_t BigNumbers[];
 
   
 ///// часы ..
byte decToBcd(byte val){
  return ( (val/10*16) + (val%10) );
}

byte bcdToDec(byte val){
  return ( (val/16*10) + (val%16) );
}

void setDateDs1307(byte second,        // 0-59
                   byte minute,        // 0-59
                   byte hour,          // 1-23
                   byte dayOfWeek,     // 1-7
                   byte dayOfMonth,    // 1-28/29/30/31
                   byte month,         // 1-12
                   byte year)          // 0-99
{
   Wire.beginTransmission(0x68);
   Wire.write(0);
   Wire.write(decToBcd(second));    
   Wire.write(decToBcd(minute));
   Wire.write(decToBcd(hour));     
   Wire.write(decToBcd(dayOfWeek));
   Wire.write(decToBcd(dayOfMonth));
   Wire.write(decToBcd(month));
   Wire.write(decToBcd(year));
   Wire.endTransmission();
}

void getDateDs1307(byte *second,
          byte *minute,
          byte *hour,
          byte *dayOfWeek,
          byte *dayOfMonth,
          byte *month,
          byte *year)
{

  Wire.beginTransmission(0x68);
  Wire.write(0);
  Wire.endTransmission();

  Wire.requestFrom(0x68, 7);

  *second     = bcdToDec(Wire.read() & 0x7f);
  *minute     = bcdToDec(Wire.read());
  *hour       = bcdToDec(Wire.read() & 0x3f); 
  *dayOfWeek  = bcdToDec(Wire.read());
  *dayOfMonth = bcdToDec(Wire.read());
  *month      = bcdToDec(Wire.read());
  *year       = bcdToDec(Wire.read());
}
  
///// температура ..
float get3231Temp(){
  byte tMSB, tLSB; 
  float temp3231;

  Wire.beginTransmission(0x68);
  Wire.write(0x11);
  Wire.endTransmission();
  Wire.requestFrom(0x68, 2);

  if(Wire.available()) {
    tMSB = Wire.read(); //2's complement int portion
    tLSB = Wire.read(); //fraction portion

    temp3231 = (tMSB & B01111111); //do 2's math on Tmsb
    temp3231 += ( (tLSB >> 6) * 0.25 ); //only care about bits 7 & 8
  }
  else {
    //oh noes, no data!
  }

  return temp3231;
}


void setup()
{
  Serial.begin(9600);
  myOLED.begin();
  Wire.begin();
 

 /*  // установка часов
  byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
  second = 30;
  minute = 0;
  hour = 14;
  dayOfWeek = 3; // день недели
  dayOfMonth = 1; // день
  month = 4;
  year = 14;

  setDateDs1307(second, minute, hour, dayOfWeek, dayOfMonth, month, year);
 */
}

void loop(){
  byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
  char week[8][10] = {"Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"};
 
  getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);
  
  char time[10];
  char data[11];
  
  snprintf(time, sizeof(time),"%02d:%02d:%02d",           
           hour, minute, second);
           
  snprintf(data, sizeof(data), "%02d/%02d/%02d",            
            dayOfMonth, month, year);
  
  myOLED.setFont(SmallFont);
 
  myOLED.print(time, LEFT, 0);
  myOLED.print(data, LEFT, 15);
  myOLED.printNumF(get3231Temp(), 2, LEFT, 30);
  myOLED.print("C", 32, 30);
  myOLED.update();

 delay(1000);
}

////// конец

  

 

Кот Баюн
Offline
Зарегистрирован: 05.06.2016

Собрал метеостанцию с датчиками DHT22 и BMP85. Вывод информации в облако ThingSpeak. Плюсы - не нужно возиться с дисплеем, можно смотреть отовсюду, где ест интернет. Да и возможность обработать полученную информацию Матлабом совсем не лишняя. Не говоря о автоматическом информировании через Твиттер. Если интересно - когда буду за стационарным компьютером - кину скетч.

agat20
Offline
Зарегистрирован: 25.06.2016

Кот Баюн пишет:

Собрал метеостанцию с датчиками DHT22 и BMP85. Вывод информации в облако ThingSpeak. Плюсы - не нужно возиться с дисплеем, можно смотреть отовсюду, где ест интернет. Да и возможность обработать полученную информацию Матлабом совсем не лишняя. Не говоря о автоматическом информировании через Твиттер. Если интересно - когда буду за стационарным компьютером - кину скетч.

А в облако через что передаете? Кидайте скетч, будем поглядеть!

Кот Баюн
Offline
Зарегистрирован: 05.06.2016

Ethernet-shield ENC28J60. Я пока не за ноутбуком. Доберусь до стационарного - скину скетч.

Кот Баюн
Offline
Зарегистрирован: 05.06.2016

Вот. Наконец-то немного свободного времени...

Обещанный скетч:

[code]


//Декларирование библиотек
#include <EtherCard.h> //Сетевой адаптер
#include "DHT.h" //Датчик температуры и влажности DHT22
#include <Wire.h> // необходимо для шины I2C
#include <Adafruit_BMP085.h> // необходимо для BMP180


// change these settings to match your own setup
//#define FEED "000"
#define APIKEY "ХХХХХХХХХХ" // put your key here
#define ethCSpin 10 // put your CS/SS pin here.

// Работа с сетевым адаптером
static byte mymac[] = { 0x74,0x69,0x69,0x2D,0x30,0x31 };
const char website[] PROGMEM = "api.thingspeak.com";
byte Ethernet::buffer[700];
uint32_t timer;
Stash stash;
byte session;
//

// Блок DHT22
#define DHTPIN 2     // what digital pin we're connected to
#define DHTTYPE DHT22   // Декларирование типа датчика
#define DHT_t true //Снятие данных при отрицательных температурах - проверить параметр
#define DHT_EXIST 1 //Снятие данных при отрицательных температурах - проверить параметр
DHT dht(DHTPIN, DHTTYPE); // Инициализация DHT22
//

// Блок BMP180
Adafruit_BMP085 bmp;
//

//Объявление переменных
float Sens_DHT_Temp; // DHT22  температура
float Sens_DHT_Hum; // DHT22 влажность
float Sens_BMP_Temp; // BMP180 температура
float Sens_BMP_Press; // BMP180 давление
float Calc_BMP_Temp; // BMP180 температура - градусы Цельсия
float Calc_BMP_Press; // BMP180 давление мм.рт.ст.
int res = 100; //timing variable


void setup () {
  Serial.begin(9600);
  Serial.println("\n[ThingSpeak example]");
  dht.begin(); // Включение DHT22
  Wire.begin(); //Запуск шины I2C
  bmp.begin();  //Запуск BMP180
  //Initialize Ethernet
  initialize_ethernet();
  pinMode(3, OUTPUT); // Индикация опроса датчиков
}


void loop () { 
  //if correct answer is not received then re-initialize ethernet module
  if (res > 220){
    initialize_ethernet(); 
  }
  
  res = res + 1;
  
  ether.packetLoop(ether.packetReceive());
  
  //200 res = 10 seconds (50ms each res)
  if (res == 200) {

     //Опрос датчиков
      digitalWrite(3, HIGH); //Включение индикатора опроса
     Sens_DHT_Temp = dht.readTemperature();
     Sens_DHT_Hum = dht.readHumidity();
     Sens_BMP_Temp = bmp.readTemperature();
     Sens_BMP_Press = bmp.readPressure();
     delay(1000);
     digitalWrite(3, LOW); //Выключение индикатора опроса
     //Вычисление расчетных величин
     Calc_BMP_Press = Sens_BMP_Press /133,3;
     //
     /*
    //Generate random info
    float demo = random(0,500);
    word one = random(0,500);
    String msje;

    if (demo < 250){
      msje = "low";
    }
    else{
      msje = "high";
    }
*/
    // generate two fake values as payload - by using a separate stash,
    // we can determine the size of the generated message ahead of time
    // field1=(Field 1 Data)&field2=(Field 2 Data)&field3=(Field 3 Data)&field4=(Field 4 Data)&field5=(Field 5 Data)&field6=(Field 6 Data)&field7=(Field 7 Data)&field8=(Field 8 Data)&lat=(Latitude in Decimal Degrees)&long=(Longitude in Decimal Degrees)&elevation=(Elevation in meters)&status=(140 Character Message)
    byte sd = stash.create();
    stash.print("field1=");
    stash.print(Sens_DHT_Temp);
    stash.print("&field2=");
    stash.print(Sens_DHT_Hum);
    stash.print("&field3=");
    stash.print(Sens_BMP_Temp);
    stash.print("&field4=");
    stash.print(Calc_BMP_Press);
    stash.save();

    //Display data to be sent
    Serial.println(Sens_DHT_Temp);
    Serial.println(Sens_DHT_Hum);
    Serial.println(Sens_BMP_Temp);
    Serial.println(Calc_BMP_Press);

    // generate the header with payload - note that the stash size is used,
    // and that a "stash descriptor" is passed in as argument using "$H"
    Stash::prepare(PSTR("POST /update HTTP/1.0" "\r\n"
      "Host: $F" "\r\n"
      "Connection: close" "\r\n"
      "X-THINGSPEAKAPIKEY: $F" "\r\n"
      "Content-Type: application/x-www-form-urlencoded" "\r\n"
      "Content-Length: $D" "\r\n"
      "\r\n"
      "$H"),
    website, PSTR(APIKEY), stash.size(), sd);

    // send the packet - this also releases all stash buffers once done
    session = ether.tcpSend(); 

 // added from: http://jeelabs.net/boards/7/topics/2241
 int freeCount = stash.freeCount();
    if (freeCount <= 3) {   Stash::initMap(56); } 
  }
  
   const char* reply = ether.tcpReply(session);
   
   if (reply != 0) {
     res = 0;
     Serial.println(F(" >>>REPLY recieved...."));
     Serial.println(reply);
   }
   delay(300);
}



void initialize_ethernet(void){  
  for(;;){ // keep trying until you succeed 
    //Reinitialize ethernet module
    //pinMode(5, OUTPUT);  // do notknow what this is for, i ve got something elso on pin5
    //Serial.println("Reseting Ethernet...");
    //digitalWrite(5, LOW);
    //delay(1000);
    //digitalWrite(5, HIGH);
    //delay(500);

    if (ether.begin(sizeof Ethernet::buffer, mymac, ethCSpin) == 0){ 
      Serial.println( "Failed to access Ethernet controller");
      continue;
    }
    
    if (!ether.dhcpSetup()){
      Serial.println("DHCP failed");
      continue;
    }

    ether.printIp("IP:  ", ether.myip);
    ether.printIp("GW:  ", ether.gwip);  
    ether.printIp("DNS: ", ether.dnsip);  

    if (!ether.dnsLookup(website))
      Serial.println("DNS failed");

    ether.printIp("SRV: ", ether.hisip);

    //reset init value
    res = 180;
    break;
  }
}
[/code]

 

agat20
Offline
Зарегистрирован: 25.06.2016

Ого! Как классно, с подробным комментированием! Спасибо, многим пригодится "я так думаю"!