На этом уроке мы начнем осваивать возможности платы iBoard.
Напомним ее основные составляющие, важные для нашего проекта:
Для теста я погрел датчик пальцами и потом отпустил: на скриншоте видно, как падает измеряемая температура (датчик охлаждается до комнатной температуры).
Теперь в вашем арсенале есть светодиодные модули (которые мы в дальнейшем будем использовать как "нагрузку") и датчик температуры.
Скетчи и необходимая для работы температурного датчика библиотека (OneWire) находятся в архиве по ссылке.
Напомним ее основные составляющие, важные для нашего проекта:
- ATmega328
- LAN-интерфейс (Wiznet W5100)
- Интерфейс для подключения nRF24L01+
- семь 3-x пиновых входов/выходов
Помимо этого есть еще слот для карты microSD и интерфейс для модулей xBee (обе эти составляющие в нашем проекте не используются, вы можете самостоятельно придумать, как их использовать).
Для программирования iBoard потребуется программатор Foca V2.2:
В принципе, это не является строго необходимым - можно обойтись программатором ArduinoISP (потребуется любая ардуинка). Как это сделать описано в соответствующем мануале, но с программатором это сделать несколько проще.
Результатом нашего сегодняшнего урока должен стать модуль, который снимает данные о температуре с датчика DS18B20.
Работа с этим температурным датчиком очень проста - используется библиотека OneWire и для подключения датчика требуется задействовать всего один пин (естественно, потребуется еще подключить питание и "общий").
У самого элемента DS18B20 три вывода:
- "Общий" (земля)
- Сигнальный
- Питание
Для подключения датчика потребуется еще один резистор номиналом 4.7кОм (подключается между сигнальным и питающим выводом датчика).
Когда DS18B20 продается не как компонент, а как датчик, часто необходимый резистор уже имеется в схеме и такой датчик подключается без каких либо дополнительных элементов.
У меня DS18B20 был только в виде электронного компонента (без какого либо "обвеса"), поэтому мне пришлось сделать из него датчик самостоятельно.
Для этого потребовался трехжильный кабель (земля, сигнальный, питание), трех-контактный разъем (уже не помню от какого компонента), резистор на 4.7кОм и небольшой кусочек термоусадки).
Разъем нужен для того, чтобы было удобно подключать к соответствующему разъему на плате iBoard.
В процессе создания "датчика" я не фотографировал, поскольку все предельно просто и запутаться негде. Результат представлен ниже:
- Коричневый провод - земля,
- Красный - питание,
- Желтый - сигнальный.
Датчик с такой распиновкой можно напрямую подключать к iBoard (естественно, согласно надписей на плате).
Особенность работы этого датчика с iBoard в том, что во всех примерах описывается подключение его к цифровым пинам, а на iBoard все цифровые пины задействованы под другую периферию, а на разъем выведены только аналоговые (A0-A7).
Но это не является проблемой - пины A0-A5 можно использовать и как обычные цифровые. Пины A6 и A7 можно использовать только как аналоговые входы.
Подключим наш датчик на пин A5.
Соответственно, наш скетч для работы с датчиком температуры будет следующим:
Если вы все сделали правильно, то в мониторе порта появятся данные о текущей температуре:#include <OneWire.h>byte data[12];byte addr[8];float celsius;OneWire ds(A5); // on pin A5void setup(void) {Serial.begin(9600);ds.search(addr);ds.reset();ds.select(addr);}void loop(void) {byte i;ds.search(addr);ds.reset();ds.select(addr);ds.write(0x44,1);delay(1000);ds.reset();ds.select(addr);ds.write(0xBE); // Read Scratchpadfor ( i = 0; i < 9; i++) data[i] = ds.read(); // we need 9 bytesunsigned int raw = (data[1] << 8) | data[0];byte cfg = (data[4] & 0x60);if (cfg == 0x00) raw = raw << 3; // 9 bit resolution, 93.75 mselse if (cfg == 0x20) raw = raw << 2; // 10 bit res, 187.5 mselse if (cfg == 0x40) raw = raw << 1; // 11 bit res, 375 mscelsius = (float)raw / 16.0;Serial.println(celsius);}
Для теста я погрел датчик пальцами и потом отпустил: на скриншоте видно, как падает измеряемая температура (датчик охлаждается до комнатной температуры).
Теперь перейдем к той части, где готовимся к управлению "нагрузкой".
В качестве нагрузки мы будем использовать обычные светодиоды (красный и зеленый - просто чтобы визуально можно было отличать). Для подключения воспользуемся имеющимися разъемами - будем использовать аналоговые пины в роли цифровых. Задействуем A0 (красный) и A1 (зеленый).
Как известно, напрямую светодиоды не стоит подключать к выходам микроконтроллера - есть риск "спалить" соответствующий пин из-за слишком большого тока. Поэтому настоятельно рекомендуется ставить токоограничительные резисторы (номинал их может быть выбран достаточно произвольно, лишь бы результирующий ток не превысил допустимых 40мА на пин). Я использовал резисторы номиналом 330Ом.
Чтобы все было "красиво" использовал трех-контактнтые разъемы (задействованы только 2 пина - сигнальный и общий). Подключил светодиод и резистор последовательно. Всю конструкцию спрятал под термоусадкой. Получились вот такие "модули":
Для проверки работоспособности воспользуемся модифицированным скетчем blink:
Если все сделано правильно - светодиоды будут "перемигиваться".#define greenLed A0#define redLed A1void setup() {pinMode(greenLed, OUTPUT);pinMode(redLed, OUTPUT);}void loop() {digitalWrite(greenLed, HIGH);digitalWrite(redLed, LOW);delay(1000);digitalWrite(greenLed, LOW);digitalWrite(redLed, HIGH);delay(1000);}
Теперь в вашем арсенале есть светодиодные модули (которые мы в дальнейшем будем использовать как "нагрузку") и датчик температуры.
Скетчи и необходимая для работы температурного датчика библиотека (OneWire) находятся в архиве по ссылке.
Очень полезный "курс". Когда ждать продолжения?
ОтветитьУдалить