15.12.2012

Температура и Влажность

Из серии статей про измерения температуры незаслуженно выпал сенсор DHT11, представляющий собой недорогой цифровой датчик температуры и влажности в одном корпусе:



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

Насколько важна влажность в помещении? Считается, что оптимум лежит около 50% - именно при такой влажности растения, люди и животные будут чувствовать себя комфортно. В частности - люди меньше болеют вирусными заболеваниями, а растения не рискуют превратиться в экибану.

Вот так устроен этот датчик внутри (а ведь он заменяет собой целый психрометр):


С одной стороны микроплатки - аналоговый сенсор, с другой - микросхема, оцифровывающая измерения и реализующая интерфейс с MCU. 

Протокол обмена - однопроводный, по структуре сильно похож на DS18B20, но с важными оговорками:
  • DHT11 не умеет работать в "паразитном" режиме (питание по линии данных);
  • каждый DS18B20 имеет персональный идентификатор, что дает возможность подключения нескольких таких датчиков к одному пину Arduino - у DHT11 такой возможности нет - один датчик будет использовать строго один цифровой пин.
DHT11 медленнее конвертирует измеренные значения - считывать их можно не чаще, чем раз в секунду. Погрешность у него тоже больше:

ПоказательDS18B20DHT11
Допустимый диапазон t,°C-55..+1250..+50
Погрешность измерения t, min±0.5°C@-10..+85°C±2°C@0..+50°C
Погрешность измерения t, max±2°C±2°C
Разрешение шкалы t,°C0.5/0.25/0.125,/0.06251
Допустимый диапазон RH, %-20..95
Погрешность измерения RH, min-±4% +25°C
Погрешность измерения RH, max-±5%
Разрешение шкалы RH, %-1

(для тех, кто склонен путать разрешающую способность и точность: хотя DS18B20 можно настроить таким образом, чтобы он отдавал 12-битные значения с разрешением 0,0625 градуса, его точность не станет лучше 0.5С. Но можно сделать "более живой" дисплей с отображением двух знаков после запятой ;)

Из характеристик видно невооруженным глазом, что DHT11 практически идеально подходит для жилых помещений и комнатных температур. Если датчик попадает в условия, выходящие за допустимые пределы, он начинает врать (попутно ускорится процесс старения аналогового сенсора), после чего требуется несложный процесс восстановления. Более подробно про это можно прочесть в описании: DHT11.pdf.

Как подключить DHT11 к Arduino? Начнем с расположения его пинов:


(третий пин не надо никуда подключать)

Рекомендуемая схема подключения содержит обязательный для однопроводных линий резистор-подтяжку к VCC и, в качестве опции, рекомендуется конденсатор (фильтр по питанию между VCC и GND):


На макетке это выглядит так (сенсор подключен к цифровому пину D8 платы Freeduino Nano):



Кстати, если вам в руки попал DHT11 на небольшой платке, можно подключать его напрямую к Arduino - скорее всего, резистор и конденсатор там уже и так есть:


Разберемся, как происходит обмен DHT11 с Arduino. Логически, это представляется такой последовательностью:
  1. Arduino запускает считывание показаний, переводя свой пин в режим выхода - как минимум на 18 миллисекунд переводит его в LOW, затем на 40 мкс в HIGH - и, после этого, переключает его в режим входа;
  2. Через 20..40 мкс DHT11 отвечает подтверждением, также сначала переводя шину в LOW на 80 мкс, а затем в HIGH на 80 мкс;
  3. DHT11 начинает побитную передачу информации, каждый бит начинается с уровня LOW в течение 50 мкс, и затем HIGH разной продолжительности: если 26-28 мкс, то это ноль, если же 70 мкс - единица;
  4. По окончании передачи 40 бит информации DHT11 "на прощание" еще раз переводит шину в LOW на 50 мкс и освобождает ее.
Полученная от DHT11 пачка из 40 бит представляется в виде последовательности из 5 байт следующего содержания:
  1. Целая часть значения влажности;
  2. Дробная часть значения влажности;
  3. Целая часть значения температуры;
  4. Дробная часть значения температуры;
  5. Контрольная сумма.
Как всегда, можно воспользоваться готовой библиотекой, которая считывает показания и вычисляет контрольную сумму для проверки. Что характерно, байты с дробной частью приходят всегда нулевые - пусть вас это не смущает, так и задумано ;)

Примеры использования DHT11 с Arduino: во-первых, данные можно выводить в последовательный порт и наблюдать на Serial Monitor:

#include <dht11.h>

dht11 sensor;

#define DHT11PIN 8

void setup()
{
  Serial.begin(115200);
  Serial.println("DHT11 TEST PROGRAM ");
  Serial.print("LIBRARY VERSION: ");
  Serial.println(DHT11LIB_VERSION);
  Serial.println();
}

void loop()
{
  Serial.println("\n");

  int chk = sensor.read(DHT11PIN);

  Serial.print("Read sensor: ");
  switch (chk)
  {
    case DHTLIB_OK: 
         Serial.println("OK"); 
         break;
    case DHTLIB_ERROR_CHECKSUM: 
         Serial.println("Checksum error"); 
         break;
    case DHTLIB_ERROR_TIMEOUT: 
         Serial.println("Time out error"); 
         break;
    default: 
         Serial.println("Unknown error"); 
         break;
  }

  Serial.print("Humidity (%): ");
  Serial.println(sensor.humidity);

  Serial.print("Temperature (oC): ");
  Serial.println(sensor.temperature);
  
  delay(2000);
}



Во-вторых, немного усложнив схему, можно выводить данные на LCD-дисплей:





#include <LiquidCrystalRus.h>
#include <dht11.h>

LiquidCrystalRus lcd(12, 11, 5, 4, 3, 2);
dht11 sensor;

#define DHT11PIN 8

void setup() {
  lcd.begin(16, 2);
  lcd.clear();
}

void loop() {
  switch (sensor.read(DHT11PIN)) {
    case DHTLIB_OK: 
                break;
    case DHTLIB_ERROR_CHECKSUM: 
                lcd.print("Checksum error");
                delay(2000);
                return;
    case DHTLIB_ERROR_TIMEOUT: 
                lcd.print("Time out error"); 
                delay(2000);
                return;
    default: 
                lcd.print("Unknown error"); 
                delay(2000);
                return;
  }
  lcd.setCursor(0, 0);
  lcd.print("Влажность,%:");
  lcd.print(sensor.humidity);
  lcd.setCursor(0, 1);
  lcd.print("Температура,C:");
  lcd.print(sensor.temperature);
  delay(2000);
  
}


Куда двигаться дальше? 

Если стремиться к увеличению точности, можно найти достаточное количество датчиков, наиболее близкие по исполнению - DHT21/22. Они же, соответственно, и более дороги.

Купить DHT11 можно, например, здесь.

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

12.12.2012

Ёлкадуино R2

Опять наступает декабрь, и снова хочется чего-то новогоднего. Если уважаемый читатель еще не забыл - в прошлом году был представлен проект новогоднего Arduino-совместимого дерева HNYduino. Практически сразу появились замечания и дополнения, и через год родилась версия R2:


Из предыдущей версии были унаследованы две 74HC595, к которым подключены по 8 зеленых и красных светодиодов (более подробно об увеличении числа пинов Arduino этим способом я уже писал). 

Но кое-что, конечно же, было изменено.


Первым делом ATmega328P была заменена на ATmega32u4, так что можно было бы сразу гордо писать Leonardo-compatible. Это сразу же добавило возможность и питать, и программировать ёлку напрямую от miniUSB (никаких дополнительных переходников USB-TTL не требуется). Возможность батарейного питания по-прежнему сохранена, переключение выполняется при помощи механического переключателя.


Расположенные в прежней версии по центру светодиоды убраны, а их место занял трехцветный пятимиллиметровый светодиод, подключенный к выводам, поддерживающим аппаратный ШИМ - таким образом можно подбирать практически любое сочетание цветов, плавно управляя яркостью через analogWrite().


Ближе к вершине располагается электретный микрофон, играющий роль датчика звука (чувствительность настраивается с помощью потенциометра, расположенного с противоположной стороны).


Выход датчика, кстати, подключен к аналоговому входу A0

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



Ну что, скажете "опять ерунда какая-то"? ;) 

Возможно, да. Но при помощи смекалки и навыков программирования Arduino с ее помощью можно сделать что-то забавное, красивое и даже полезное. Важно, в чьих руках она окажется ;)

Чертежи, схема, библиотека и примеры появятся в самое ближайшее время здесь и в wiki, купить готовый экземпляр можно здесь.



01.12.2012

ArduinoIDE 1.0.2

В конце октября - начале ноября произошло сразу несколько событий: была официально выпущена в продажу и почти сразу же распродана Arduino Due, вышла ArduinoIDE 1.5 специально для поддержки этой самой Due, затем вышла ArduinoIDE 1.0.2 - не поддерживающая Due, но содержащая много полезных фиксов для платы Leonardo.

12.11.2012

Апгрейдим Netduino

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

Оно состоит из двух фрагментов:
  1. TinyBooter - бутлоадер;
  2. TinyCLR - .NET Micro Framework runtime.
Бутлоадер запускается сразу после включения питания, грузит TinyCLR, который, в свою очередь - запускает ваше приложение из flash-памяти.

Итак, сначала надо найти интересующую прошивку, например в wiki. Важно скачать именно тот вариант, который относится к вашему типу платы (т.е. прошивки для Netduino и Netduino Plus отличаются).

Если требуется апдейтить только TinyCLR (еще это называют minor-апдейтом, то есть незначительными исправлениями), используют утилиту MFDeploy (ее можно найти через меню "Пуск": .Net Micro Framework SDK | Tools). После запуска установите в боке Device USB и Netduino_netduino и нажмите Ping:



Как видите, если устройство подключено, оно должно откликнуться и хоть что-то сообщить. Чтобы получить более подробную информацию о выбранном устройстве, используйте команду Device Capabilities (Ctrl+Shift+C), там можно разглядеть текущую прошитую версию TinyCLR:



Если Netduino все-таки не отзывается, нажмите расположенную на нем кнопку сброса, и, не отпуская, переподключите плату к шине (отключите, а потом снова воткните в USB - после 20 секунд плата войдет в специальный failsafe-режим), при этом на Ping она будет отвечать "TinyBoot".

Теперь в боксе Image File надо выбрать файлы для прошивания. Обычно их два - ER_CONFIG и ER_FLASH. Можете добавить сразу оба, после этого можно нажать Deploy.



Дождитесь завершения процесса и еще раз нажмите Ctrl+Shift+C -  информация с номерами прошивок должна измениться.

Для более значимых апгрейдов (например, с 4.1 до 4.2) требуется замена TinyBooter. В этом случае надо прибегнуть к фирменной атмеловской утилите "SAM-BA CDC" (можно скачать бесплатно с сайта ATMEL, правда придется заполнить несложную регистрационную форму), но для начала надо полностью похерить содержимое флеш-памяти:
Подключите Netduino к источнику питания, затем соедините Erase Pad (небольшая токопроводящая площадочка рядом с пином D0) с питанием +3.3В на более чем полсекунды. Готово! Если и было там какое-то firmware, то теперь оно стерто.

Переподключите плату - теперь вы увидите в списке устройств неизвестное устройство  c VID=03EB и PID=6124. Если указать мастеру установки поискать драйвера в папке инсталлированной атмеловской утилиты, должен установиться виртуальный последовательный порт (запомните его номер!):



Самое время запустить SAM-BA-CDC Tool, выбрать номер свежеустановленного последовательного порта, тип платы "at91sam7x512-ek" и нажать Connect:



Теперь последовательно проделаем следующие действия:
  1. Выберите в выпадающем списке Scripts "Boot from Flash (GPNVM2)", затем нажмите кнопку Execute;
  2. Выберите там же "Enable Flash Access", затем опять нажмите Execute;
  3. Выберите файл для зашивания (кнопка рядом с полем Send File Name), выберите файл TinyBooterDecompressor.bin;
  4. Нажмите Send File и подождите завершения (всего пара секунд);
  5. В окне с вопросом о залочивании областей (lock regions) откажитесь - ответьте No;
  6. По желанию, можно проверить записанный файл - поправьте размер файла в поле size (receivedfile) путем добавления 2-3 нулей в конце и нажмите "Compare sent file with memory". Должно появиться "match".
После этого можно закрыть  SAM-BA-CDC Tool и переподключить Netduino к источнику питания - новый TinyBooter будет ожидать загрузки нового TinyCLR, как это делать - см. выше.

От себя добавлю - после обновления до .Net Micro Framework 4.2 все мои нарекания по работе с Visual Studio исчезли. Только не забудьте после апгрейда выбрать в свойствах проекта .Net целевую версию 4.2, иначе Deploy вашего приложения из студии будет завершаться неуспехом:



Ну и вот ради чего все это было проделано ;) Пошаговая отладка великолепно работает в виртуальной машине:




05.10.2012

Скоро Due!

Вот и прошел очередной Maker Faire в Нью-Йорке, и появились первые слухи по поводу даты входа Arduino Due. Вот что пишет Engadget:

The Due is roughly the size of the Mega 2560, but swaps the 16MHz, 8-bit processor found in your standard issue Arduino for a 96MHz Cortex-M3. Predictably, the Due is a much more capable development platform, and could easily replace multiple AVR-based Arduinos in products like DIY Drones' UAVs. The Due isn't expected ship till at least November in large quantities, but preview boards are currently being handed out to select developers.

То есть, в народ она пойдет где-то после ноября, есть и спецификации (взято отсюда):