Web разработчик
7,1
рейтинг
23 декабря 2010 в 23:24

Ethernet термометр на основе Arduino

Arduino

О цифровых термометрах на основе Arduino было сказано немало. Все они либо подключались к компьютеру, либо выводили температуры сразу на дисплей.
Но мне был нужен уличный термометр, который автономно и отправляет данные на сайт. Итак, приступим.

Что нам понадобится:

  • Arduino Duemilanove (Freeduino 2009)
  • Ethernet Shield v2
  • цифровой датчик температуры — DS18B20
  • вентилятор для корпуса (120 мм)
  • банка от водоэмульсионки или клея ПВА (2 литра)
  • светодиод
  • витая пара


Задачи

Опрашивать датчик температуры по шине 1-Wire и каждые 3 секунды самостоятельно отправлять результаты на Web-сервер, на котором они будут храниться.

Алгоритм работы устройства:

  1. присваиваем нашему Ethernet Shield`у MAC адрес и ip-адрес
  2. инициализируем соединение с сервером на 80 порт
  3. получаем данные с цифрового датчика температуры, по 1-Wire шине
  4. формируем GET запрос
  5. отправляем GET запрос
  6. разрываем соединение


Исходный код скетча:

Комментарии по ходу кода должны внести ясность.

include <Ethernet.h>
// Библиотеки ниже нет в стандартной поставке среды разработки Arduino.
// придётся её скопировать.
include <DallasTemperature.h>

// MAC-адрес нашего устройства
byte mac[] = { 0x00, 0x3A, 0xF1, 0x19, 0x69, 0xFC };
// ip-адрес устройства
byte ip[] = { 192, 168, 1, 156 };
// ip-адрес удалённого сервера
byte server[] = { 79, 140, 28, 20 }; // измените на свой
char temp[6];
byte isdata=0;

Client client(server, 80); // 80-порт.
DallasTemperature tempSensor;

void setup()
{
 Ethernet.begin(mac, ip); // Инициализируем Ethernet Shield
 tempSensor.begin(7); // Датчик температуры на 7-й пин
 Serial.begin(9600); // Скорость консольного порта 9600 (пригодится для отладки)
}

void loop()
{
  delay(3000); // задержка в 3 сек.
  // Соединяемся
  if (client.connect()) {
  Serial.println("connecting..."); // Serial.println для отладки. Лучше его оставить, на всякий случай, потом будет легче понять, в чём проблема.
  // Обработчик ошибок датчика
  switch(tempSensor.isValid())
   {
     case 1:
       Serial.println("Invalid CRC"); // ошибка контрольной суммы
       tempSensor.reset(); // сбросить девайс
       return;
     case 2:
       Serial.println("Invalid device"); // какой-то "левый" датчик :)
       tempSensor.reset(); // сбросить девайс
       return;
   }
 
   Serial.println("connected");
   char buf[80];
   float f=tempSensor.getTemperature(); // получаем температуру

   Serial.println(tempSensor.getTemperature());
  
   // Ниже извращения с отделением дробной части и целой. Почему-то Arduino не хочет работать с float.
   // Вместо числа вставляет вопросик. Наверное, виной тому отсутствие аппаратной поддержки работы с
   // числами с плавающей запятой в Arduino. Буду рад увидеть более красивое решение в комментариях.
   int temp1 = (f - (int)f) * 100; // выделяем дробную часть
   // Составляем GET запрос. Переменная code нужна для того, чтобы вражеский термометр не слал какие попало значения.
   // проверяется на стороне Web-сервера.
   sprintf(buf, "GET /class/backend/meteo.php?temp=%0d.%d&code=123456 HTTP/1.0", (int)f, abs(temp1));
 
   Serial.println(buf);
   client.println(buf); // Отправляем GET запрос
   client.println("Host: opck.info"); // Указываем, какой конкретно host на данном ip нас интересует.
   client.println();
  
  } else {
   Serial.println("connection failed");
  }

 while (client.available()) {
  isdata=1;
  char c = client.read(); // Читаем, что нам ответил Web-сервер
  Serial.print(c);
  
 }
 
 if (!client.connected()) {
  isdata=0;
  Serial.println();
  Serial.println("disconnecting.");
  client.stop(); // Завершаем соединение
 }
}



Сборка устройства:

  1. первую «ногу» датчика цепляем на «минус» GND
  2. вторую «ногу» (DQ) на 7-й пин
  3. третью на «плюс»
  4. вторую и третью нужно соединить резистором на ~ 4,7 К. Но я заменил резистор на светодиод и получил индикатор обращения к шине датчика (ВНИМАНИЕ! Без резистора или светодиода работать ничего не будет. Не забудьте!)


По идее, вот и всё. Должно работать.
Работает, но боевые условия показали, что когда падает солнечный свет на датчик, тот может нагреваться и показывать температуру гораздо выше реальной. Всё правильно — он покажет температуру на солнце. А нам нужна температура воздуха.

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

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

Делаем корпус для датчика

Подходящей по размеру оказалась банка от водоэмульсионной краски (такие же бывают из-под клея ПВА, объёмом 2-3 литра). В нижней части банки делаем отверстие под вентилятор. И прикрепляем его к банке. В центре банки размещаем площадку под датчики, диаметром немного меньшим самой банки, чтобы воздух мог циркулировать.
Несколько фото:

Банка от водоэмульсионки

Банка от водоэмульсионки
Детали и банка с проделанным отвестием
Детали и банка с проделанным отвестием

Установка датчика в корпус
Установка датчика в корпус

Датчик в корпусе, вид сверху
Датчик в корпусе, вид сверху

Как вы помните, резистор я заменил светодиодом, поэтому делаем и для него отверстие, чтобы всегда было видно работу устройства.

Корпус, вид сбоку
Корпус, вид сбоку

Крышка от банки нам не нужна, вместо неё нужен навес, такой, чтобы и воздух пропускал, и чтобы атмосферные осадки не попадали внутрь (датчик-то будет расположен на улице).

Корпус для Arduino я сделал из пластмассовой коробки от mp3-плеера Explay C360.

Arduino
Arduino

Backend, принимающий данные:

На стороне сервера работает скрипт, к которому обращается термометр. Скрипт проверяет правильность секретного кода, чтобы показания нельзя было подменить.
А затем добавляет новую запись в таблицу MySql. Потом эти данные можно выводить как угодно. При этом каждую минуту данные за прошедшую минуту усредняются и добавляются в другую таблицу.
Нужно это для того, чтобы:
1. проще было делать выборки в базе (не правда ли, удобнее указать конкретную минуту и получить результат)
2. выборки были быстрее (за год ~500 000 записей вместо 10 000 000)

Во время длительной работы датчика обнаружилась проблема, иногда он самопроизвольно (раз в 3-4 часа) выдаёт рандомное значение. Поэтому я добавил проверку на изменение температуры больше чем на 1 градус в течении 15 секунд. Такие значения игнорируются.

Что из этого всего вышло:

На своём сайте я разместил страничку с термометром и добавил график температуры за последние сутки.
Посмотреть можно тут: Ethernet термометр.

Недостатки:

Точность датчика 0.5* С, что для меня недостаточно. Но есть способ улучшить его характеристики. Понадобится ещё один, или более датчиков (желательно из разных партий). Получаем данные со всех датчиков и считаем среднее арифметическое. Так можно добиться точности до сотых градуса.

Планы на будущее:

  • датчик влажности
  • датчик давления
  • датчик скорости ветра
  • датчик освещённости
  • поставить несколько таких в городе и делать свои прогнозы погоды
  • питать Arduino по Power over Ethernet
  • автоматизировать включение и частоту вращения вентилятора в зависимости от освещения
  • удалённое управление
  • сброс данных на случай отсутствия связи (для меня это критично)


Известные мне недостатки:

— высокая цена — 2180 руб. (Freeduino 2009 (800 р.) + Ethernet Shield v2 (1300 р.) + 1 датчик (80 р.))
— если вентилятор включить слишком быстро, то он сам вносит погрешность в температуру, обдувая датчик. Он не должен сдувать, а лишь проталкивать воздух.

Ссылки по теме:

Блог Arduino на Хабре
Онлайн-термометр
DS18B20 Datasheet

PS: статья целиком и полностью принаддежит liderman — все вопросы к нему
SovGVD @SovGVD
карма
47,2
рейтинг 7,1
Web разработчик
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое

Комментарии (96)

  • +1
    Тепло у вас ;-) Почти лето :-)
  • +1
    А как вы собираетесь снизить погрешность до 0,1 градуса?
    • +2
      Увеличив количество датчиков, это не решит проблемы
      • 0
        статья не моя, сложно ответить =) как только автора кто нибудь пригласит — думаю наверняка ответит
        • 0
          Если я не ошибаюсь, DS18B20 имеет точность 0,5°С (при этом после -15 она становится еще хуже), поэтому тут придется менять датчик на более точный и накапливать статистику
          • 0
            Более точного, работающего по 1-Wire я не нашёл, а 1024 разрядного АЦП Arduino (если я не ошибаюсь), хватит только на датчик с погрешностью 0.1, на датчик с погрешностью 0.01 нужен уже более продвинуты АЦП, если я не ошибся в расчётах…
        • +1
          Все, теперь можно заваливать автора статьи вопросами. Уважаю людей, который могут не только работать головой, но и руками, ради такого и инвайта не жалко. Будем надеяться, товарищ liderman нас порадует еще многими техническими статьями.
      • +2
        Ага. Только хотел написать, нужны датчики с большей чувствительностью. Кому-то над почитать трудов по статистике, а еще ОЧЕНЬ желательно — по метрологии.
        • 0
          и не только температурные, потому как для прогноза надо знать тучу параметров )
          начиная с давления и заканчивая расположением фронтов

          такой термометр подойдет для удаленного слежения за теплицей или инкубатором )
          • +1
            Гроу-бокс :-) Надо будет в перспективе озадачиться
      • 0
        Для 18B20 можно задать разрядность преобразования 12 бит и тогда точность будет не пол градуса, а 0,0625
        • 0
          Это многие знают.
          Вопрос больше в том для чего такая точность? Даже конопля не требует такого должного ухода.
          • +4
            Зачем тогда было писать «А как вы собираетесь снизить погрешность до 0,1 градуса?» Если «многие знают» то и предложили бы автору.
        • +1
          Это не спасёт, просто будет шуметь больше разрядов и всё.
      • 0
        Датчики с разных партий имеют разную погрешность она не всегда составляет чётко 0.5 градуса. Если взять хотя бы среднее значение хотя бы от 2-х, то теоритически можно улучшить показатели, особенно если удачно подобрать датчики
  • +1
    Еще на эту тему — habrahabr.ru/blogs/DIY/55780/
  • НЛО прилетело и опубликовало эту надпись здесь
    • 0
      можно спросит у telegamochka, заказать на seeeduino.com или amperka.ru
      • 0
        а для Украины не знаете подобных магазинов?
        • 0
          seeedstudio.com/depot/, если есть карточка visa classic (заодно и дешевле раза в 2 выйдет), а чтоб конкретно украинский — хз
        • 0
          Недавно купил на Ebay за $42 Arduino Duemilanove Kit, в набор входит сама Ардуина, LCD Shield — двухстрочный LCD с кнопками (удобно для навигации по меню), Prototyping Shield и Sensor Shield. Все работает, посылка из Китая пришла за 7 дней, сам удивился… Три сервомоточика еще едут, цена тоже более чем приятная — $3 за штуку.
          Там же можно купить Ардуино + Ethernet за $35.50.
          Еще — на Aukro я видел человек продает, большой выбор Арудин и шилдов.
        • +1
          В Киеве был один мужичок который сделал партию Мега и Нано, но он их уже распродал.
          Остались только эти ребята radiodetali.lg.ua/.
          Я же долго терзаясь заказал seeedstudio с разными датчиками, чему несказанно рад, т.к. доставили за 2 недели.
        • 0
          есть arduino.shopium.ua/ хотя это и не совсем то
          • 0
            Так это и есть сайт того мужика который уже продал все ардуины. То есть нужных устройств у него нет :(
        • 0
          Наверно уже несколько поздновато, но все же напишу:
          arduino-ua.com
    • 0
      Самым простым для меня способом оказалась покупка на freeduino.ru, главным образом из-за оплаты, т.к. карты у меня нет. Доставка идёт из города Кемерова, заказ формируют быстро. По почте, до Оренбургской области, посылка шла ~ 2 недели.
      Ребята хорошо упаковывают Arduino, так что ничего не повредится, в комплекте идёт инструкция и диск с ПО и документацией.

      Следующие покупки буду делать на seeeduino.com, т.к. цены вдвое ниже.
  • 0
    а не лучше ли было использовать sqlite?
  • +1
    а какая в данном случае разница?
  • +1
    Что-то мне это напомнило :-D www.g0l.ru/blog/n2426 Я градусник для серверной делал с сигнализацией через смс, только до конца не довёл ибо уже уволили
  • 0
    Насчёт вот этой строки — int temp1 = (f — (int)f) * 100; // выделяем дробную часть
    Нафига? Сразу в GET-запрос выводить значение температуры и всё гут. Т.е. у меня вот таким макаром:

    client.print(«GET /address?password=pass&temp=»);
    client.print(tempSensor.getTemperature());

    А разбирать уж на стороне сервера. KISS, однако.
    • 0
      Ещё совет — «вторую и третью нужно соединить резистором на ~ 4,7 К. или светодиод...»
      Можно обойтись подтягивающим резистором, реализованным внутри чипа ATMega. Достаточно добавить
      pinMode(pin, INPUT); // Сюда будем подключать подтягивающий резюк
      digitalWrite(pin, HIGH); // «Подключаем» подтягивающий резистор (реализован внутри ATmega)
      где pin в данном случае = 7
  • 0
    Люди, мож ещё кому-нить пригодится (на полноценный топик не тянет) — учёт расхода воды.
  • 0
    У меня тоже работает аналогичный самодельный уличный датчик температуры, но в отличие от описанного — он у меня беспроводной, т.е. обмен данными идет по радиоканалу, в частности по технологии Zigbee
    • 0
      Эх, скорее бы уж придумывали беспроводную передачу питания :-( Совсем уж слаботочку не предлагать.
      • +1
        это к Тесле ;)
    • 0
      waspmote?
      • 0
        не, не такой, самодельный…
        на улице коробочка с 2-мя махонькими платками (каждая 3-4 см) соединенных между собой проводочками (лапшой). На одной платке простенький контроллер с датчиком DS18B20 — эта платка температуру обсчитывает и передает данные на вторую плату, на которой модуль Zigbee со встроенной антенной. Он передает данные, потом переходит в сон (у меня интервал сна 15 минут), далее просыпается и посылает данные…
        Вначале я запитывал эту хрень от 3.6V литиевой батарейки (LI-SOCL2) — она работает до температур -40. Реально проверял только до -15. Ниже в прошлом году не было :)
        Обычная литиевая батарейка (то что в обычных магазинах продают) ниже -10 градусов цельсия уже не работает…
        Так вот, такой батарейки хватало на месяц. Поэтому я потом начал питать датчик по проводочкам…

        Уже дома стоит сервачок в один из USB-портов которого воткнута другая платка — Zigbee приемник, он постоянно активен и ждет передачу. Далее уже python ловит данные с порта и пишет их в базу при условии, что пакет получен полностью (бывает из-за радиопомех битые пакеты).
  • 0
    А не проще купить китайский usb-термометр за $11?
    cgi.ebay.com/Laptop-PC-USB-Power-Thermometer-Sensor-Data-Auto-Email-/350416524613?pt=LH_DefaultDomain_0&hash=item519673d545
    • 0
      USB-термометр надо будет в USB-порт втыкать, т.е. комп нужен. А суть топика именно в автономной железке (ну, шоп инет только был и питание).
      • 0
        ну не обязательно в комп, можно в роутер с usb-портом и линуксом какимто… только тогда прийдется драйвера написать.
        Есть еще такие устройства как usb-сервер: маленькая коробочка с usb и ethernet портами. На комп ставится программка-виртуальный usb-хаб, и устройство включенное в эту коробочку будет видно на удаленном компе. Эдакий TCP/IP <-> USB преобразователь.
        • 0
          Это да, вариантов много. Но с ардуиной интереснее :-)
          • 0
            Посмотрел я сколько стоит Ethernet Shield, да гораздо дешевле\интересней\проще купить какой нить старый рутер под ddwrt.
            А дуину прицепить через uart или usb… Дуино здесь по сути становится контроллером ввода-вывода со всяких железяк, а вот на рутере можно уже замутить грамотный web-face всему этому делу.
            • 0
              Ну это смотря где покупать. На seeeduino.com ~600 руб. Если бы я выбирал где можно купить подешевле то тоимость всего устройства была бы около 1200-1500 руб.
    • 0
      И вообще, конечно, проще что-то купить. Но если все будут только покупать, кто ж тогда будет придумывать штуки которые потом остальные покупать будут? Да и интересное это дело — придумывать и реализовывать. Попробуйте как-нибудь, вместо того чтоб на E-bay сидеть.
      • 0
        придумывать нужно чтото действительно новое, а не велосипеды
        • +4
          Ну, один велосипед, другой… А потом глядишь и что-то дельное выйдет :-)
        • 0
          Меня всегда забавляют люди, которые еще не научились толком складывать и умножать, но с серьезным видом говорят о интегралах.
          Поэтому уважаемый Quadratoff предлагаю нам с вами:

          — не мешать людям получать базовые навыки и образование в области электроники;
          — говорить что же действительно нужно людям;

          А порадуемся за миллионы студентов и аспирантов, которые вместо навыков отжимания мобильных получат вполне приличный навык организации электронных систем.
  • 0
    если вентилятор включить слишком быстро, то он сам вносит погрешность в температуру, обдувая датчик.

    Это отчего? Вентилятор сильно греется при работе?
  • +1
    >если вентилятор включить слишком быстро, то он сам вносит погрешность в температуру, обдувая датчик

    Каким образом? Автор считает, что если обдувать [сухой] датчик окружающим воздухом, то он будет показывать температуру ниже, чем температура воздуха? По-моему автору нужно перечитать учебник физики.
    • 0
      поддерживаю. автору надо обязательно прочитать учебники. сходить на консультацию в экоцентры, которые ведут подобные сводки (например сходить в эколабораторию аэропортов), там работают специалисты с физическим образованием по специальности «физики неравновесных процессов».

      маленький совет автору. поставьте Ваш корпус для датчика не горизонтально или под углом, но вертикально. корпус удлинните до отношения диаметра трубы к длине не менее один к десяти (на порядок короче). датчик можно поставить чуть ниже центра (во второй четверти трубы). в трубе на уровне датчика прорежте круглое окошечко для самого щупа. таким образом у Вас будет естественная конвекция масс воздуха. снизу датчика подсос, сверху теплый нагретый от датчика вверх.
      • 0
        Спасибо за совет с трубой! Это очень хорошее решение, как мне кажется.
    • 0
      Ну прежде чем советовать кому то что то перечитать, то для начало это нужно прочитать самому ;-)
      Датчик конечно сухой, а вот воздух имеет влажность от сюда и проблемы. Я это обнаружил эксперементально, включив обдув на полную температура резко упала на 2 градуса, когда я прекратил обдув температура вернулась в предидущее состояние. Эксперемент повторил пару раз.
      • 0
        Вы правильно мыслите. при ветре 3 метра в секунду температура среды падает в среднем на 1 градус. благодаря влажности и возникающего при этом перепада давления. ветер способствеут более интенсивному испарению, следовательно более низкому давлению, сделовательно более низкой температуре. так на пляже в жару можно влажным полотенцем обмотать плотно бутылку с водой и поставить под палящее солнце. когда полотенце высохнет, жидкость в бутылке будет реально прохладной.
        • 0
          >ветер способствеут более интенсивному испарению, следовательно более низкому давлению, сделовательно более низкой температуре

          Всё верно, только не в том порядке ;)
          Ветер -> более низкое давление -> испарение -> более низкая температура.

          >так на пляже в жару можно влажным полотенцем обмотать плотно бутылку с водой

          Влажным полотенцем, да. То, что при испарении влага забирает энергию (т.е. тепло) с поверхности тела, ни для кого не секрет. Но в данном случае сенсор сухой (я не зря это подчеркнул).
          Откуда влага для испарения? Конденсат? Тогда объясните мне физику процесса, почему влага вдруг конденсируется и тут же испаряется. При объяснении очень желательно не упустить процессы передачи энергии.
          • 0
            Мне то же интересно узнать. Эксперимент показал что температура при обдувании падает (проводил при температуре 25 градусов и нуле). Но как?
            • 0
              Так может она без обдува была повышенной, а при обдуве как раз падает до реальной?
              • 0
                Разумеется я проверил несколько раз, то включал то выключал обдув. Температура, то падала, то опускалась и так далее.
                • 0
                  Вероятнее всего в вашем случае либо завышено питание, либо опрос идет не по прописанному в даташите алгоритму. Т.е. датчик нагревается изнутри.
                  • 0
                    Опрос идёт стандартной библиотекой. Тем более датчик цифровой и тут нет наводок, кроме шума создаваемого погрешностью измерения.

                    Питание не завышено, подключено стандартно.
  • +1
    Опрашивать раз в 3 секунды — лишнее, температура так быстро не меняется. Выводить значения температуры надо согласно погрешности измерения. И фильтровать данные.
    Хороший проект, хорошо бы сделать API для получения температуры с указанием координат датчика
    • 0
      API я сейчас пишу. Ещё сделаю несколько графических информеров.
  • 0
    Датчик для улицы лучше другой подобрать, а DS-18B20 я, например, использую для мониторинга температуры в серверной
    msevm.com/main/therm/ds18b20.jpg -тут вполне устраивает.
    Непонятны 2 момента: 1) коробка из-под клея с вентилятором далеко не идеальное решение 2) на сайте висит прогноз погоды — он откуда берется?
    Ну и еще идейку не новую подкину:
    за стекло на улице устанавливаешь любой обычный термометр — на него направляешь веб-камеру, а ее транслируешь на сайт. Для особо продвинутых есть готовые решения: www.systems21.ru/akcp.php — типа такого.

    НУ и напоследок еще один вопрос: в принципе мы имеем самоделку с довольно высокой стоимостью и некоторыми спорными моментами, не задумывался ли автор о поиске уже полностью готового решения? Мне кажется ненамного дороже выйдет, а по части точности и юзабилити в разы лучше, например вот такой девайс:
    www.hw-group.com/products/HWg-STE/STE_ip_temperature_sensor_ru.html

    • 0
      А чем Вам DS-18B20 не сгодился. Датчиков лучше него, работающих по 1-Wire я не нашёл. Остаётся использовать аналоговый датчик, со всем вытекающими.
      1 — да не идеальное, но что мешает это улучшить. Stepler выше предложил отличный вариант.
      2 — берётся с замечательного сервиса weather.co.ua

      > не задумывался ли автор о поиске уже полностью готового решения?
      > Мне кажется ненамного дороже выйдет, а по части точности и юзабилити в разы лучше, например вот такой девайс:
      > www.hw-group.com/products/HWg-STE/STE_ip_temperature_sensor_ru.html

      Задумывался. Но ничего не мешает сделать девайс лучше. Про юзабилити спорно. Что может быть удобнее интерфейса доступа, который ты придумал для себя сам)
      К тому же у этого устройства нижняя граница измерения температуры "-30", а у нас запросто может быть "-40" зимой. Ну и такие продукты в силу своей узкой специализации обычно дороги.
  • 0
    Есть вопрос — если точность 0.5 градуса, то зачем выводить инфу по температуре с точностью до сотых?
    Из-за флуктуаций постоянно меняеться цифра на страничке. Может быть стоит навесить простенькое вычисление среднего значения, а на графике бахнуть простенькую интерполяцию?
    • 0
      Маркетинг) Ну просто когда что то меняется перед глазами, «ощущение онлайна» увеличивается

      А график сгладить наверное стоит.
  • 0
    Всем привет из Ярославля. :) Но там всё просто, обычный датчик, подключённый к компьютеру.
  • +2
    поставить несколько таких в городе и делать свои прогнозы погоды

    Как метеоролог скажу, без ежесуточных вертикальных разрезов атмосферы над площадью хотя бы в 1000км. прогноз не составить. Вот книжка интересная на эту тему aviaclub.ru/uploads/media/Aviacionnaja_meteorologija.pdf
    • 0
      Zak, спасибо за книгу. Уже начал читать.
  • 0
    клева!!! слушай, а можно несколько таких сетевых друг на друга?
  • 0
    Где покупали датчики 1-Wire? По инету искал, всё какие-то дорогие варианты, от 30 долларов.
    • 0
      От куда такие цены?
      80 руб стоит на freeduino.ru/arduino/products.html#Procee
      Но можно купить ещё дешевле, зайдите в ближайший магазин электронных компонентов
      • 0
        Дешевле всего не у местных барыг, а оптом покупать на eBay у китайцев.
        Я купил 20 датчиков за 36$, т.е. ~55 рублей за штуку.
  • 0
    В для измерения влажности можно использовать датчик hih-4000 от Honeywell, но он аналоговый, его надо на АЦП вешать.
    • 0
      Ну так в Ардуино есть АЦП, т.н. аналоговый вход. 0-5В.
      А hih-4000 это действительно оптимальный датчик по цене и легкости подключения.
    • 0
      Мне кажется разумнее использовать
      SHT10: www.platan.ru/cgi-bin/qwery.pl/id=906155583&group=5547
      т.к. он во-первых, цифровой и работает по 1-Wire, во-вторых, у него погрешность 0.5% в отличии от hih-4000 у которого она аж 2%!
      • 0
        Но тут возникает вопрос цены. Так что нужно смотреть на задачу.
        • 0
          Так он же дешевле стоит чем HIH-4000-004.
          HIH-4000-004 стоит 550 руб., а SHT10 470 руб.

          Так что у SHT10 и точность лучше и дешевле на 80 руб, к тому же имеет встроенный термометр и он цифровой! Ценя я взял с platan.ru, но это довольно не дешёвый магазин. Можно найти дешевле.
          • 0
            А у нас SHT10 тяжело найти, и он подороже может быть.
            Всеравно, спасибо за пояснения, поищу SHT10
  • 0
    Если уж речь зашла о датчиках, то для измерения атмосферного давления а выбрал MPXA4115AC6U, он относительно недорогой.
    Или есть такой вариант wiring.org.co/learning/basics/airpressure.html

    В качестве датчика освещенности я планирую использовать фоторезистор, но пока еще не решил как его отградуировать.

    Датчик скорости ветра возможно сделаю не датчике угла поворота или на переменном резисторе, еще не решил.

    Еще нужен датчик направления ветра, это что-то в виде флюгера с электронным компасом, о нем я пока не думал.

    Во общем у меня тоже живет мысль сделать домашнюю метеостанцию, и родилась она где-то полгода назад.

    В вашем решении мне неясно, зачем делать обдув датчика воздухом, может проще его просто высунуть на улицу залив эбокситкой?
    • 0
      Заливал эпоксидкой, через полгода мой 1820 сдох. Имхо от разных коэффициентов термического расширения родного компаунда и заливки.
    • 0
      В качестве датчика давления удобнее использовать BMP085, он цифровой и работает по I2C, погрешность у него не большая, всего 1 гПа. Цена: ~500 руб.

      Для флюгера можно использовать датчик угла (энкодер). Цена вопроса 140 руб. И получаете цифровой сигнал. Компас тут имхо не нужен. Один раз откалибровать по аналоговому компасу и всё.
  • +1
    Точность выше ± 0,5 градуса вами может быть получена только если датчик установлен на северной (теневой) стороне и на большой высоте относительно близлежащих зданий. Ну или на поляне в парке. Иначе неминуема тепловая «засветка» от асфальта, стен ближайших зданий, или стены вашего здания. Я решал аналогичную проблему, только результаты мне нужно выдавать в RDS/PS на моих эфирных станциях. Так в солнечный день погрешность от реальной температуры была +5 +10 +15 градусов, от сезона. Асфальтовые джунгли вокруг. А ближайшая северная сторона была в 200 метрах. Даже если эти условия будут соблюдены, то даже ночью температура воздуха флуктуирует в диапазоне ± 0,5 градусов от того, с какого направления дует ветер, то ли из ближайшего лесопарка, то ли из центра города. Не будет информация о флуктуациях избыточной?
  • +1
    «если вентилятор включить слишком быстро, то он сам вносит погрешность в температуру, обдувая датчик. Он не должен сдувать, а лишь проталкивать воздух»

    Почему? Датчик же не потеет, с него ничего не испаряется. Он от своего питания нагревается совсем незначительно. С чего бы ему от интенсивного обдува врать?
  • 0
    Интересно, когда появиться фирма производитель стандартных корпусов для электронных элементов. Недорогих и стандартизованных для различного рода устройств? А то уже эти банки, пустые упаковки от CD дисков и другого рода «лыжи» уже так надоели…
    • 0
      В чип-и-дипе давно продаются замечательные пластмассовые корпуса любых типоразмеров.
      К сожалению, больше нигде таких не видел, а тут за кусок пластмассы просят несколько сотен :(
  • +2
    Я теперь на Хабре, и с радостью отвечу Ваши вопросы.
    Спасибо SovGVD, за то что опубликовал мою статью и спасибо miguello за приглашение на сайт
  • 0
    Гораздо целесообразнее для хранения температуры использовать Round-Robin Database, которая фактически предназначена для подобных задач, и предоставляет достаточное количество фич, включая построение графиков (по умолчанию, конечно же, не интерактивных и не таких замечательных). Есть разнообразные модули и библиотеки для PHP, python и еще много для чего.

    В целом — отличная статья, правда, дороговато выходит, если использовать только в качестве высокотехнологичной игрушки :)
    • 0
      Ну ни так уж и дорого если заказывать например на www.seeedstudio.com:
      — Seeeduino V2.2 (Atmega 328P) $22.50
      — Wiznet Ethernet shield -w5100 $32.00
      — DS18B20 — 80 руб
      Итого: ~1715 рублей (по курсу 30 руб за 1 доллар)
  • 0
    Mysql в данном случае overkill. Для таких задач гораздо удобнее rrdtool.
    • 0
      Лично для моего проекта мне нужны сырые данные. А так можно и rrdtool. Но по прошествии времени использование в качестве БД Mysql показало себя хорошо. Хотя кто бы сомневался)
  • 0
    Много времени прошло, но всё-таки. Советую для вашего градусника виджет/гаджет сделать. Вот про мои (под Оперу и под винду 7).
    • 0
      Да, сделаю обязательно.
  • 0
    Помогите не могу никак разобраться! У меня Ардиуно Мега 1280 и ни одна из двух библиотек OneWire не работает! — все отлично компилируется и записывает в ардуину, но ключи не считываются! Все время повторяется надпись No more addresses. Кто знает в чем может быть дело? может есть какое то несоостветствие в номерах выводов на плате, но как узнать что чему соовтетсвтует???
  • 0
    сброс данных на случай отсутствия связи (для меня это критично)

    можно задействовать EEPROM, которого в ATMega168 512 байт или 1 килобайт в ATMega328, причем «усреднять» значения можно на самом Arduino, на случай отсутсвия связи писать значения в EEPROM, а при востановлении — отсылать всю «пачку» на сервер
  • 0
    картинки пропали :(

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.