Показаны сообщения с ярлыком Датчики. Показать все сообщения
Показаны сообщения с ярлыком Датчики. Показать все сообщения

07.05.2013

Web-термометр

"Погодная станция своими руками" - вот как можно было бы назвать статью, но я решил пока просто рассказать о том, как соорудить web-термометр, подключить его к домашней LAN  и наблюдать показания через браузер ;)

Для этого нам потребуется Arduino-совместимая плата, поддержка Ethernet и несколько температурных датчиков.


03.04.2013

Температура и влажность (2)

У датчика измерения температуры и влажности DHT-11 (о его возможностях и стыковке с Arduino я подробно писал в предыдущей статье) есть "старший брат", сенсор DHT-22 (часто под этим названием фигурирует AM2302, производимый фирмой AOSONG):



Несколько проигрывая DHT11 по габаритам, этот датчик имеет более широкий диапазон измеряемых величин и обладает большей точностью. Ранние версии даташитов объясняют, что измерением температуры занимается встроенный DS18B20, однако в последних вариантах его заменили на термистор.

Сравнительная таблица из предыдущей статьи должна быть дополнена так:

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

Точность измерения относительной влажности возрастает для значений меньших 12% и больших 90%, а также имеет некоторый гистерезис. Считывание очередного значения возможно не чаще, чем один раз в 2 секунды. Более подробно можно прочесть в документации: AM2302.pdf.

Подключение DHT22 к Arduino выглядит аналогично DHT11. Пины имеют идентичное назначение, схема подключения не отличается, да и протокол общения с датчиком, по сути, тот же.




Отличия начинаются в трактовке считываемых значений. Мы по-прежнему получаем от сенсора по 40 бит:
  1. Старшая часть значения влажности;
  2. Младшая часть значения влажности;
  3. Старшая часть значения температуры;
  4. Младшая часть значения температуры;
  5. Контрольная сумма.
Значение относительной влажности и температуры выдаются в десятых долях, например: если прочитано 010Dh, то эту цифру надо перевести в десятичный формат (269), а затем разделить на 10 - получится 26,9. И, кстати, отрицательные значения температуры кодируются единицей в старшем разряде считываемого 16-битного значения: 1000 0000 0110 0101 означает -10,1 °C.


Существует несколько вариантов библиотек для Arduino (и вы можете написать свой собственный!), вот наиболее известные:
В примере ниже я использую именно последний вариант, он простой и универсальный (работает не только с DHT22, но и с DHT11).  Архив с библиотекой надо распаковать в каталог sketchbook/libraries и перед загрузкой скетча в Arduino не забыть исправить значение константы DHT22_PIN на номер пина, к которому подключен вывод DATA датчика:

#include <dht.h>

dht DHT;

#define DHT22_PIN 6

void setup()
{
  Serial.begin(115200);
  Serial.println("DHT TEST PROGRAM ");
  Serial.print("LIBRARY VERSION: ");
  Serial.println(DHT_LIB_VERSION);
  Serial.println();
  Serial.println("Type,\tstatus,\tHumidity (%),\tTemperature (C)");
}

void loop()
{
  // READ DATA
  Serial.print("DHT22, \t");
  int chk = DHT.read22(DHT22_PIN);
  switch (chk)
  {
    case DHTLIB_OK:  
                Serial.print("OK,\t"); 
                break;
    case DHTLIB_ERROR_CHECKSUM: 
                Serial.print("Checksum error,\t"); 
                break;
    case DHTLIB_ERROR_TIMEOUT: 
                Serial.print("Time out error,\t"); 
                break;
    default: 
                Serial.print("Unknown error,\t"); 
                break;
  }
  // DISPLAY DATA
  Serial.print(DHT.humidity, 1);
  Serial.print(",\t\t");
  Serial.println(DHT.temperature, 1);

  delay(2000);
}


После старта программы надо вызвать окно Serial Monitor-а (Ctrl+Shift+M):



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

Диапазон питания датчика составляет +3.3...+5.5В, поэтому его можно с успехом использовать с трехвольтовыми Arduino и конструировать довольно компактные и малопотребляющие конструкции - например, при помощи Freeduino Pro Mini.  Рекомендуемая длина кабеля, соединяющего DHT22 с MCU при питании от 3.3В не должна превышать 100 см

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

25.12.2012

IR-приемник на Arduino

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

Один из таких аспектов - дистанционный пульт для исполнительного устройства на основе Arduino. Изготавливать его самостоятельно может оказаться довольно муторным делом - во времена первых советских бытовых компьютеров, например, можно было изготовить самостоятельно пленочную клавиатуру или разобрать калькулятор с шикарными герконовыми клавишами. Но теперь, стоит нам оглянуться по сторонам - и на глаза обязательно должен попасться ИК-пульт от какой-то бытовой техники (телевизора, музыкального центра, кондиционера). Если управляемое устройство находится в прямой видимости управляющего - это определенно возможность схалявить наш вариант:


Как грамотно построить схему ИК-приемника? Начнем с краткой справки по структуре сигнала: обычно, это серия световых импульсов определенной частоты - что-то около 38 кГц. Импульсы по специальным правилам образуют посылки, в которых кодируются команды (проще говоря - каждой кнопке соответствует свой код). Для передачи используется инфракрасный светодиод, для получения - инфракрасный приемник.


В основе приемника обязательно лежит фотодиод: полупроводниковое устройство, реагирующее на свет небольшой ЭДС. Для использования получаемый сигнал надо немного усилить, очистить от помех и демодулировать. Стоит ли говорить, что намного практичнее использовать готовую схему - фотоприемник, который уже включает в себя перечисленные узлы:




Стоит запомнить, пожалуй, единственный принципиальный момент - от того, насколько соответствуют частоты пульта и приемника, зависит дальность приема. Иными словами, если излучение модулировано частотой 38 кГц, а фотоприемник по спецификации рассчитан на 36 кГц - все равно будет работать, только придется ближе подходить ;) Выглядят подобные устройства, например, так:



Подключить фотоприемник к Arduino можно с минимальным комплектом деталей:



Резистор R1 и емкость C1 нужны для стабилизации питания, подтягивающий резистор опционален (хотя, как вы понимаете, подтягивающий резистор уже есть в Arduino и использовать можно его).

В качестве библиотеки можно взять вариант от Ken Shirriff,  который не только поддерживает форматы NEC, SIRC, RC5, RC6, но и может принимать вообще "сырые" посылки, ни к одному известному коду не относящиеся (и умеет еще много другого, конечно же ;)

Первым делом надо загрузить в Arduino тестовый скетч IRecvDemo и решительно испытать на нем все необходимые кнопки вашего ИК-пульта, просматривая результат в окне Serial Monitor-а:

/*
 * IRremote: IRrecvDemo - demonstrates receiving IR codes with IRrecv
 * An IR detector/demodulator must be connected to the input RECV_PIN.
 * Version 0.1 July, 2009
 * Copyright 2009 Ken Shirriff
 * http://arcfn.com
 */

#include <IRremote.h>

int RECV_PIN = 11;

IRrecv irrecv(RECV_PIN);

decode_results results;

void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn(); // Start the receiver
}

void loop() {
  if (irrecv.decode(&results)) {
    Serial.println(results.value, HEX);
    irrecv.resume(); // Receive the next value
  }
}


В результате вы получите некоторую таблицу значений, которую можно использовать уже в скетче исполнительного устройства.

И, кстати, вызов decode  неблокирующийся. После его вызова управление сразу же возвращается и, таким образом, скетч может работать и "заниматься своими делами", принимая команды от пульта в фоновом режиме.

Не забудьте также посмотреть самое лучшее в инете описание IR-кодов на страницах SB Projects.

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 можно, например, здесь.

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

16.04.2011

Сеть 1-Wire в "полевых условиях"

О практическом применении сети 1-Wire и температурных датчиков DS18B20 в частности, написано много и  подробно. Цель этой статьи - рассказать, как использовать эти датчики (или другие устройства сети) в суровых "полевых условиях". Не секрет, что на столе под лампой светлой цифровой датчик DS18B20 или его бюджетный брат DS18S20 замечательно работает  с минимальным обвязом со стороны микроконтроллера в т.н. двухпроводной схеме:



Фактически, весь "обвяз" состоит из резистора 4К7, между шиной питания VCC (+5В) и шиной данных VDO, который и позволяет датчику паразитно питаться от этой же шины. Схема проста, наглядна и кроме этого, позволяет экономить на одном проводе в кабеле сети. Для расстояний менее 10 метров - вполне оправдано, правда точность преобразования будет не лучше 2°C (разрядность АЦП датчика DS18B20 снижается с 12 до 10 бит), что во многих случаях будет вполне достаточно.

К сожалению,  двухпроводный способ включения практически непригоден в "полевых условиях" из-за незащищенности от помех. Дальнейшее увеличение длины сетевого кабеля  будет приводить к большему числу сбоев, вплоть до полного отказа сети. Поэтому, часто приходится отказываться от паразитного питания в пользу трехпроводного подключения:




Дополнительная выделенная линия питания сулит нам следующие "бонусы":
  1. Длина сетевого кабеля 100 метров и более;
  2. Количество одновременно подключенных датчиков - не менее 32шт.;
  3. Разрешающая способность АЦП - 0,0625°C и точность измерения - 1°C.
Однако, еще остается борьба с помехами на длинных линиях связи. Простейшей защитой является включенный в обратном направлении диод Шоттки между линией данный и общим проводом, именно так советует поступать Brian C. Lane, автор популярного проекта DigiTemp. Мы лишь немного расширим данное решение для трехпроводной схемы включения:


D1 - сборка быстродействующих диодов Шоттки BAV199, механизм действия такой защиты подробно описан в блоге Уважаемого киберсатаниста DI HALT;
L1, L2 - фербиды BLM21AG221SN1D - индуктивности для защиты от высокочастотных помех, возникающих при коммутации сильноточных потребителей;
C1 - керамический конденсатор, естественный спутник ножек питания цифровой микросхемы;
IC1 - собственно цифровой датчик температуры DS18B20Z в корпусе SOIC8.

Все компоненты - SMD (0805 и SOT23) для уменьшения размера платы датчика:



После сборки, плата температурного датчика выглядит следующим образом:


Обязательно защищаем плату датчика от влаги (цапонлаком или акриловым лаком):


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

Контактные площадки для пайки кабеля сети 1-Wire сознательно сделаны крупными и вот почему...

Трактат о проводочках кабеля

Самой распространенной ошибкой при построении сети 1-Wire является выбор в пользу Ethernet-кабеля Cat.5! Подавляющее большинство читателей скажет - "у нас все очень хорошо и бодро работает на обрезках сетевухи". Не спорю ни в коем случае, кабель Cat.5 длиной 10..30 м вполне годится для 3-х проводного способа подключения датчиков, более того - вот вам рекомендованная схема использования народного кабеля, которую и сам использую на даче для водоснабжения дома:




"Ну таки и в чем дело?" - скажет проницательный читатель. А вот в чем: в кардинальном различии "физики и логики" сетей Ethernet и 1-Wire. Не вдаваясь в сложности организации сети Ethernet, просто прошу поверить (и с мультиметром проверить) в то, что из-за значительного падения напряжения на длинных и весьма тонких проводах кабеля Cat.5e датчику сети 1-Wire банально не хватает напряжения питания!

Вывод напрашивается простой и логичный - использовать кабель с проводами бОльшего сечения и желательно - экранированный! Для своих целей, я выбрал вполне доступный по цене (и наличию в магазинах) кабель МКЭШ-3х0.5 - схема подключения датчиков будет выглядит так:


Несколько худший, но вполне приемлемый результат, можно получить с кабелем МКЭШ-2х0.35 и следующей схемой подключения:




Наконец, можно использовать вполне приличный провод от торшера - ПВС3х0.75...ПВС3х1

Заключение


Нынешний владелец торговой марки 1-Wire - компания Maxim, для защиты нежных ножек микропроцессора от "суровых полевых условий", предлагает приборчик DS9503, который по сути - просто быстродействующий диод Шоттки + токоограничивающие резисторы в линиях питания и данных. Сам я его еще в руках не держал, но как только это случиться - немедленно опишу полученные впечатления.

Послесловие


C огромным удовольствием - благодарю Илью Данилова за помощь словом и хардвером в освоении платформы Ардуино, конструктивные замечания и неоценимую поддержку в разработке проекта ОткрытогоПЛК!


  • Скачать проект платы-подавителя помех в формате Eagle.

20.06.2010

Ультразвуковой сенсор GH-311

Мне пришла небольшая партия ультразвуковых датчиков GH-311, которая с успехом запустилась с Arduino/Freeduino:


Общеизвестно, что принцип ультразвукового обнаружения объектов входит в состав летучей мыши ;) Несчастное животное посылает короткие импульсы на частоте ~40 КГц и прислушивается к тому, насколько быстро появляется эхо - чем быстрее, тем ближе объект, от которого отразился звук.

С точки зрения робототехники, ультразвуковые датчики довольно энергетически прожорливы, но имеют неоспоримое преимущество перед парами инфракрасных светодиодов и фотодиодов: они будут работать стабильно независимо от того, как меняется окружающее освещение.


Модель GH-311 обладает следующими характеристиками (наткнулся на них в крайне лаконичном даташите):

  1. Power Voltage: DC 6-12V
  2. Quiescent current : Less than 2mA
  3. output Level: High 5V
  4. output Level: Low 0V
  5. Sensing Angle: no greater than 15°
  6. Sensing distance: 2mm-3m

Увы, GH-311 не умеет определять расстояние до объекта, а только сообщать: обнаружено что-то или нет - в зависимости от этого меняется состояние выхода OUT (5В/0В). В интернете можно найти однотипные вопли несчастных людей, натыкающихся на одни и те же грабли - они хотят измерять расстояние, а им говорят - нельзя. Нашел я и просьбу одного "студента", который просил исходный код микроконтроллера с тем, чтобы его усовершенствовать (конечно же, безответную). Это заставило меня присмотреться повнимательнее к схеме:


Модуль собран на кусочке двустороннего гетинакса размером 46 х 19 мм. Внешний слой - полностью "земляной", поэтому схему можно рассмотреть довольно подробно. "Сердцем" поделки является восьмибитный RISC-микроконтроллер HT48R05A, разработанный фирмой Holtek.


Некоторые просто обожают HT48xx и HT46xx, хотя, конечно же, возможности этих серий более чем скромные. Гарвардская архитектура включает 0,5К памяти программ (14 битная), 32 байта памяти программ и целых две (!) ячейки стека вызовов - это означает что третий вызов вложенной подпрограммы окажется волшебным (читаем - последним ;). Система команд очень урезана - нет даже умножения. Зато есть источники прерываний, watchdog и даже один таймер.

Память программ может быть либо масочным ROM (программируется на заводе), либо OTP (именно такой МК установлен в модуле), то есть - однократно программируемая. Это вам не Arduino, когда можно заливать программу во время отладки хоть по десять раз в минуту. После этого совершенно логичным выглядит наличие бесплатной IDE, в которой можно писать и отлаживаться на ассемблере и C, а также программно эмулировать микроконтроллеры в реальном времени и даже некоторые периферийные устройства, типа LCD.

Ну и напоследок - вопрос цены. Нашел в розничной продаже HT48RC06A за 26 рублей, а ведь в нем в два раза больше памяти программ и ОЗУ ;)

Весьма непонятным мне показалось решение с питанием - чтобы подключить GH-311 к Arduino, надо запитать последний от внешнего источника, соединить VIN с "+"-ом на модуле, GND - с "-", а OUT к любому цифровому входу, например к 12-му. Фокус в том, что от 5В модуль просто не заработает, потому что на нем использован стабилизатор HT7550-1 разработки все той же Holtek:



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



Но вернемся к Arduino. Подключив модуль вышеописанным методом, пишем скетч, зажигающий светодиод L:

int led = 13;       // Arduino led
int sensorPin = 12; // Digital Pin In
int sensorValue;    // Value for sensor output
int d = 250;        // Delay

void setup() {
}

void loop() {
  sensorValue = digitalRead(sensorPin);
  digitalWrite(led,sensorValue);
  delay(d);  
}

Как видите, как всегда - проще некуда.

Резюме: GH-311 можно использовать в охранных системах или датчиках присутствия, когда необходимо просто обнаружить объект.

03.05.2010

Фотоячейка

Неплохой альтернативой нашему фоторезистору ФР-764 может служить стандартный фото-свитч, он же - фотоячейка обыкновенная:



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

Соберем схему и вспомним скетч из предыдущего эксперимента.



В темноте получаем около 760..790, рассеянный дневной свет 260..290, а прямо под 20Вт-ной галогеновой лампой - в зависимости от расстояния - 30..125. Таким образом, чувствительность - выше, чем ФР-764.

Характеристики этой ячейки на поверку оказались такими: темновое сопротивление не менее 2 МОм, предельное напряжение 150 VDC, пик чувствительности - 540 нм. Но самое главное - скорость реакции - 25 мс. Именно поэтому иногда их называют "фотопереключатель".

14.08.2009

Фоторезистор

Наконец-то ко мне в руки попала партия фоторезисторов! Сделано в СССР, датчик называется ФР-764:



Датчик работает так: в темноте его сопротивление довольно велико (минимум - 3 МОм). Когда в прозрачное окошечко попадает свет, сопротивление падает пропрционально освещенности. Соответственно, чтобы использовать его в Arduino, собирается несложная схема:



Подключаем, естественно, к аналоговому входу. Подтягивающий резистор R1 и фоторезиcтор PH1 образуют делитель напряжения питания, опорное напряжение АЦП - оно же. Производим простейшее соединение на колодках Arduino:





Пишем простейший скетч, который считывает показания АЦП и отправляет их в последовательный порт (для наглядности - с переводом строки):

int val;

void setup()
{
Serial.begin(38400);
analogReference(DEFAULT);
}

void loop()
{
val = analogRead(0);
Serial.println(val);
delay(100);
}


Только не забудьте выставить соответствующую скорость порта в Arduino IDE:



и подключиться к порту через иконку Serial Monitor:



Первым делом, можно проверить, что считывается в "темноте":



В "темноте" ;) с АЦП будет считываться значение около 1010..1020, лампа дневного света над моим столом будет выглядеть как 950-980, а вот если к сенсору приблизить настольную "галогенку", можно получить около 500-600, в зависимости от расстояния.

Вероятно, после несложной калибровки ФР-764 можно использовать в схеме датчика освещенности или же в качестве сенсора работа, ориентирующегося на свет. Максимальное напряжение, которое можно приложить к датчику - 20 вольт, максимальная длина волны - около 660 нм. Получается, что граница чувствительности приходится на красный диапазон, который закхватывается не целиком. Если это критично, надо искать ФР-765 - у него предел составляет около 700 нм.

15.07.2009

Аналоговые датчики температуры и Arduino

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

Обычно, мы получаем сенсор в корпусе TO-92 (не перепутайте с транзистором):



На фото - популярный датчик TMP36 от Analog Devices. Как видите, выводов три, и если смотреть в положении "надписью к нам, ножками вниз", то получается (слева направо): питание (Vs), выход (Vout), земля (GND). Главная особенность таких датчиков - значение напряжения на выходе однозначно определяет температуру, независимо от напряжения питания (!). Последнее может варьироваться от 2,7 до 5,5 Вольт.

Это очень удобно, и позволяет нам выполнить проверку датчика вне схемы, если под рукой есть элемент питания 3В, хотя бы даже и батарейка CR2032. В активном состоянии датчик потребляет не более 50 мкА, для проверки в течение двух-трех минут вполне хватает. Собираем схему:



Теперь, подключая мультиметр к выходу датчика (разумеется, в режиме измерения напряжения), мы будем наблюдать напряжение около 0,78 В, что соответствует 28 °С.



Чтобы убедиться в работоспособности датчика, его надо слегка нагреть, отлично подойдут:
  • пальцы рук (температура вашего тела - 36,6 °С)
  • дующий горячим возухом фен (можно довести и до 50 °C)
  • кошка (температура 38-39 °C)

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



Теперь подключим датчик к Arduino. Пусть выход будет подключаться к analog0, а питание - к стабилизированному питанию +5В Arduinio:



Для чтения придется использовать АЦП, а ему, как известно, требуется опорное напряжение, надо выбрать один из трех вариантов: питание, внешнее на AREF или внутреннее.

Напряжение на выходе датчика TMP36 меняется от 100 мВ до 2В, так что использовать внутренний источник опорного напряжения 1,1В не получится. Хотя, такое значение у источника МК ATmega168/328, а вот в ATmega8 это будет уже 2,56 В. Гораздо проще ориентироваться на стабилизированные +5 В, которые поступают от USB.

Чтобы правильно перевести показания датчика в температуру, надо сначала понять, какое напряжение мы прочитали. АЦП возвращает число от 0 до 1023, при этом 0 = 0В, 1023 = 5В для нашего случая. Поэтому:

voltage = 5 В / 1024 * sensor

Заглянем в документацию на датчик: там оговаривается, что изменение на один градус цельсия соответствует изменению на 10 мВ, при этом 500 мВ будет соответствовать температуре 0°C. Получаем формулу:

tempC = (voltage - 0.5) * 100


 
void setup() {
Serial.begin(38400);
}

void loop() {
float voltage = 5.0 / 1024.0 * analogRead(0);
Serial.print(voltage);
Serial.println(" B");
float tempC = ( voltage - 0.5 ) * 100;
Serial.print(tempC);
Serial.println(" C");
delay(1000);
}


Одно маленькое замечание к тексту скетча: значение опорного напряжения надо писать именно "5.0", чтобы компилятор случаем не решил разделить 5 на 1024 целочисленным делением и не получил пожизненный ноль в итоге.



Вернемся к вопросу о точности. Наш АЦП имеет шаг измерения 4,9 мВ, в то время как сам датчик имеет погрешность ±1°C, или ±10 мВ. Таким образом, даже если мы понизим опорное напряжение, например, до 3,3 В и получив таким образом шаг преобразования 3,3 / 1024 = 3,2 мВ, это повышение точности не спасет нас от ошибки самого сенсора. С другой стороны, напряжение питания +5 В тоже может запросто "гулять" ±5%, но в итоге это порождает ту же самую ошибку ±10 мВ. Таким образом, как ни крути, для данной схемы погрешность измерения будет не менее ±2°C. Из этого следует, кстати, забавный метрологический вывод: дробную часть можно отбрасывать ;)

(в статье использованы материалы из статьи про измерение температуры by ladyada)