Блог

● Проект 21: Датчик влажности и температуры DHT11

Опубликовано: 23.04.2018
В этом эксперименте мы рассмотрим датчик для измерения относительной влажности воздуха и температуры DHT11 и создадим проект вывода показаний датчика на экран ЖКИ WH1602.

Необходимые компоненты:
контроллер Arduino UNO R3;
плата для прототипирования;
датчик DHT11;
LCD-экран WH1602;
резистор 50 Ом;
• потенциометр 1 кОм;
провода папа-папа.
внешний блок питания +5 В.

Датчик DHT11 (см. рис. 21.1) не отличается высоким быстродействием и точностью, однако может найти свое применение в радиолюбительских проектах из-за своей невысокой стоимости. Датчик DHT11 состоит из емкостного датчика влажности и термистора. Кроме того, датчик содержит в себе простенький АЦП для преобразования аналоговых значений влажности и температуры.

Рис. 21.1. Датчик DHT11
 
Датчик имеет 4 вывода в одну линию с шагом 2,54 мм:

• 1 – VCC (питание 3–5 В);
• 2 – DATA (вывод данных);
• 3 – не используется;
• 4 – GND (земля).

Протокол обмена – однопроводный, по структуре весьма похож на DS18B20, но с важными оговорками:

• DHT11 не умеет работать в «паразитном» режиме (питание по линии данных);
• каждый DS18B20 имеет персональный идентификатор, что дает возможность подключения нескольких таких датчиков к одному пину Arduino. Однако у DHT11 подобной возможности нет – один датчик будет использовать строго один цифровой пин.

В нашем эксперименте мы будем считывать данные с датчика DHT11 и выводить на экран ЖКИ WH1602, который мы рассматривали в эксперименте 16. Рекомендуемая схема подключения к Arduino содержит обязательный для однопроводных линий резистор-подтяжку к VCC, в качестве опции рекомендуется конденсатор (фильтр по питанию между VCC и GND). У нас в наличии DHT11 в виде модуля, его можно подключать к Arduino напрямую – резистор и конденсатор там уже есть. Схема подключения датчика DHT11 и WH1602 к плате Arduino показана на рис. 21.2. Для питания ЖКИ нужен отдельный блок питания +5 В.

Рис. 21.2. Схема подключения датчика DHT11 и WH1602 к Arduino

Приступим к написанию скетча. Для работы с датчиками DHT11 (DHT21, DHT22) в Arduino есть библиотека OneWire. Содержимое скетча для чтения данных с датчика и вывода на экран индикатора WH1602 показано в листинге 21.1.

#include "DHT.h"
#define DHTPIN 2 // пин подключения контакта DATA
#define DHTTYPE DHT11 // DHT 11
#include <LiquidCrystal.h>
// инициализация с указанием контактов подключения
LiquidCrystal lcd(12, 11, 7, 6, 5, 4);
DHT dht(DHTPIN, DHTTYPE);
void setup()
{
lcd.begin(16,2); // режим работы
dht.begin();
}
void loop()
{
// получение с датчика данных влажности и температуры
float h = dht.readHumidity();
float t = dht.readTemperature();
if (isnan(t) || isnan(h)) // ошибка получения данных
{
lcd.clear();lcd.setCursor(0,0);
lcd.print("Failed to read");
}
else // вывести данные на ЖКИ
{
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Humidity: ");lcd.print(h); lcd.println(" %");
lcd.setCursor(0,1);
lcd.print("Temp: "); lcd.print(t);lcd.println(" *C");
}
delay(2000); // пауза перед следующим измерением
}

Порядок подключения:

1. Подключаем датчик DHT11 и WH1602 по схеме на рис. 21.2.
2. Загружаем в плату Arduino скетч из листинга 21.1.
3. Смотрим на экране дисплея показания относительной влажности и температуры.

Листинги программ скачать
Читать далее

● Проект 20: Датчик температуры DS18B20

Опубликовано: 23.04.2018
В этом эксперименте мы рассмотрим популярный цифровой датчик температуры DS18B20, работающий по протоколу 1-Wire, и создадим проект вывода показаний датчика на экран ЖКИ WH1602.

Необходимые компоненты:

контроллер Arduino UNO R3;
плата для прототипирования;
датчик DS18B20;
LCD-экран WH1602;
резистор 50 Ом;
• потенциометр 1 кОм;
провода папа-папа.
внешний блок питания +5 В.

DS18B20 – цифровой термометр с программируемым разрешением от 9 до 12 битов, которое может сохраняться в EEPROM-памяти прибора. DS18B20 обменивается данными по шине 1-Wire и при этом может быть как единственным устройством на линии, так и работать в группе. Все процессы на шине управляются центральным микропроцессором.

Диапазон измерений датчика: от –55 °C до +125 °C с точностью 0,5 °C в диапазоне от –10 °C до +85 °C. В дополнение DS18B20 может питаться напряжением линии данных (так называемое питание от паразитного источника) при отсутствии внешнего источника напряжения.
Каждый датчик типа DS18B20 имеет уникальный 64-битный последовательный код, который позволяет общаться со множеством датчиков DS18B20, установленных на одной шине. Первые 8 битов – код серии (для DS18B20 – 28h), затем 48 битов уникального номера, и в конце 8 битов CRC-кода. Такой принцип позволяет использовать один микропроцессор, чтобы контролировать множество датчиков DS18B20, распределенных по большому участку.
В нашем эксперименте мы будем считывать данные с датчика температуры DS18B20 и выводить на экран ЖКИ WH1602, который мы рассматривали в эксперименте 16. Схема подключения датчика температуры DS18B20 и WH1602 к плате Arduino показана на рис. 20.1.

цифровой датчик температуры DS18B20
Рис. 20.1. Схема подключения датчика температуры DS18B20 и WH1602 к Arduino

Приступим к написанию скетча. Для работы с устройствами 1-Wire в Arduino есть стандартная библиотека OneWire. Содержимое скетча для чтения данных с датчика и вывода на экран индикатора WH1602 показано в листинге 20.1. Последовательность данных для чтения данных с устройств 1-Wire следующая:
1. Произвести RESET и поиск устройств на линии 1-Wire.
2. Выдать команду 0x44, чтобы запустить конвертацию температуры датчиком.
3. Подождать не менее 750 мс.
4. Выдать команду 0xBE, чтобы считать ОЗУ датчика (данны о температуре будут в первых двух байтах).

#include <OneWire.h>
OneWire ds(10); // линия 1-Wire будет на pin 10
#include <LiquidCrystal.h>
// инициализация с указанием контактов подключения
LiquidCrystal lcd(12, 11, 7, 6, 5, 4);
void setup(void)
{
Serial.begin(9600);
// установить размерность дисплея
lcd.begin(16, 2);
lcd.clear();
}
void loop(void)
{
int t=get_temp();
lcd.setCursor(0,1);lcd.print(" ");
lcd.setCursor(0,1);
lcd.print(t/16);lcd.print(".");lcd.print((t%16)*100/16);
}
// получение данных с датчика DS18B20
int get_temp()
{
byte i;
byte present = 0;
byte data[12];
byte addr[8];
int Temp;
if ( !ds.search(addr))
{Serial.print("No more addresses.\n");
ds.reset_search();
return -1;
}
// вывод в монитор уникального адреса 1-Wire устройства
lcd.setCursor(0,0);
lcd.print("R=");
for( i = 0; i < 8; i++)
{lcd.print(addr[i], HEX);lcd.print(" ");}
if ( OneWire:crc8( addr, 7) != addr[7])
{
Serial.print("CRC is not valid!\n");
return -1;
}
if ( addr[0] != 0x28)
{
Serial.print("Device is not a DS18S20 family device.\n");
return -1;
}
ds.reset();
// запустить конвертацию температуры датчиком
ds.write(0x44,1);
delay(750); // ждем 750 мс
present = ds.reset();
ds.select(addr);
ds.write(0xBE); /
// считываем ОЗУ датчика
for ( i = 0; i < 9; i++)
{ data[i] = ds.read();}
Temp=(data[1]<<8)+data[0];
return Temp;
}

Порядок подключения:

1. Подключаем датчик DS18B20 и WH1602 по схеме на рис. 20.1.
2. Загружаем в плату Arduino скетч из листинга 20.1.
3. Смотрим на экране дисплея показания датчика температуры.

Листинги программ скачать
Читать далее

● Проект 19: Шаговый двигатель 4-фазный, с управлением на ULN2003 (L293)

Опубликовано: 23.04.2018
В этом эксперименте мы рассмотрим подключение к Arduino шагового двигателя.

Необходимые компоненты:

контроллер Arduino UNO R3;
плата для прототипирования;
• шаговый двигатель;
• микросхема L293;
провода папа-папа.
кнопка – 3 шт.;
резистор 1 кОм – 3 шт.;
внешний блок питания +5 В.

Шаговые двигатели представляют собой электромеханические устройства, задачей которых является преобразование электрических импульсов в перемещение вала двигателя на определенный угол. ШД нашли широкое применение в области, где требуется высокая точность перемещений или скорости. Наглядными примерами устройств с ШД могут служить принтеры, факсы и копировальные машины, а также более сложные устройства: станки с ЧПУ (числовым программным управлением), фрезерные, гравировальные машины и т. д.
Шаговый двигатель – синхронный бесщёточный электродвигатель с несколькими обмотками, в котором ток, подаваемый в одну из обмоток статора, вызывает фиксацию ротора. Последовательная активация обмоток двигателя вызывает дискретные угловые перемещения (шаги) ротора. Напрямую, к выводам Arduino подключать ШД нельзя, для подключения используют либо драйверы шаговых двигателей (например, A4988), либо драйверы двигателей постоянного тока (ULN2003, L293). В эксперименте будем использовать микросхему L393, которая содержит в себе четыре мощных усилителя (см. рис. 19.1). Если на вход усилителя подается 1, то выход сажается на 12 В, если на вход подается 0, то вывод сажается на землю. Таким образом, подавая комбинации 0 и 1 на разные входы, можно сажать выводы двигателя на шины разной полярности, вращая движок в разные стороны.

Рис. 19.1. Драйвер двигателей L293

Подключим к Arduino шаговый двигатель и с помощью кнопок будем задавать перемещение шагового двигателя в разные стороны.
Схема соединений для данного эксперимента показана на рис. 19.2.

подключение к Arduino шагового двигателя
Рис. 19.2. Схема соединений шагового двигателя и Arduino

Напишем скетч управления поворотом шагового двигателя с помощью кнопок. При нажатии на первую кнопку шаговый двигатель перемещается на 200 шагов по часовой стрелке, при нажатии на другую кнопку шаговый двигатель перемещается на 200 шагов против часовой стрелки. При написании скетча будем использовать Arduino-библиотеку Stepper. Содержимое скетча показано в листинге 19.1.

#include <Stepper.h>
#define STEPS 200 // Количество шагов
Stepper stepper(STEPS, 8, 9, 10, 11);
// клавиши
int pinButtons1[]={6,7};
int lastButtons1[]={0,0};
int currentButtons1[]={0,0};
int countButtons1=2;
void setup()
{
stepper.setSpeed(50);
}
void loop()
{
// проверка нажатия кнопок
for(int i=0;i<countButtons1;i++)
{
currentButtons1[i] = debounce(lastButtons1[i],pinButtons1[i]);
if (lastButtons1[i] == 0 && currentButtons1[i] == 1)
// если нажатие...
{
if(i==0)
stepper.step(10*STEPS);
else
stepper.step(-10*STEPS);
}
lastButtons1[i] = currentButtons1[i];
}
}
// Функция сглаживания дребезга
int debounce(int last,int pin1)
{
int current = digitalRead(pin1); // Считать состояние кнопки
if (last != current) // если изменилось...
{
delay(5); // ждем 5 м с
current = digitalRead(pin1); // считываем состояние кнопки
return current; // возвращаем состояние кнопки
}
}



1. Подключаем элементы к плате Arduino по схеме на рис. 19.2.
2. Загружаем в плату Arduino скетч из листинга 19.1.
3. При нажатии на одну из кнопок шаговый двигатель делает 200 шагов в одну сторону и останавливается, при нажатии на другую кнопку двигатель делает 200 шагов в обратную сторону.



Листинги программ скачать
Читать далее

● Проект 18: Обрабатываем данные от джойстика. Управление Pan/Tilt Bracket с помощью джойстика

Опубликовано: 23.04.2018
В этом эксперименте мы рассмотрим подключение к Arduino двухосевого аналогового джойстика.

Необходимые компоненты:

контроллер Arduino UNO R3;
плата для прототипирования;
модуль джойстика;
кронштейн Pan/Titl Bracket;
сервопривод – 2 шт.;
провода папа-папа.

Для управления каким-либо устройством на основе Arduino, перемещающимся в двухмерной системе координат, отлично подойдет джойстик. Для плат Arduino существуют модули аналогового джойстика, имеющие ось X, Y (потенциометры 10 кОм) и дополнительную кнопку – ось Z. Джойстик позволяет плавно и точно отслеживать степень отклонения от нулевой точки. Сам джойстик подпружиненный, поэтому он будет возвращаться в центральное состояние после его отпускания из определенной позиции.
Контакты Vcc и GND между всеми тремя группами контактов соединены. Таким образом, для подключения нужно 5 проводов: ось X, ось Y, кнопка Z, питание Vcc и общий GND. Джойстики – пассивные модули и не потребляют какую-либо энергию от платы Arduino. Выводы VERT и HORZ подключаются к аналоговым входам A0 и A1 Arduino, SEL – к цифровому входу D2. Схема подключения показана на рис. 18.1.

подключение к Arduino джойстика
Рис. 18.1. Схема подключения платы джойстика к Arduino

Напишем скетч считывания данных джойстика и вывода значений в монитор последовательного порта Arduino IDE. Содержимое скетча показано в листинге 18.1.

const int axisX=A0 // ось Х подключена к A0
const int axisY=A1 // ось Y подключена к A1
const int axisZ=2 // ось Z (кнопка джойстика) подключена к D2
int valX, valY, valZ = 0; // переменные для хранения значений осей
void setup()
{
pinMode(axis_Z, INPUT_PULLUP); // конфигурируем D2 как INPUT с включением
// подтягивающего резистора внутри процессора
Serial.begin(9600);
}
void loop() {
valX = analogRead(axisX); // значение оси Х
valY = analogRead(axisY); // значение оси Y
valZ = 1-digitalRead(axisZ); // значение оси Z (кнопка)
// выводим значения в монитор
Serial.print("X:");Serial.print(valX, DEC);
Serial.print(" | Y:");Serial.print(valY, DEC)
Serial.print(" | Z: ");Serial.println(valZ, DEC);
delay(500); // пауза перед следующим считыванием данных
}

Порядок подключения:

1. Подключаем джойстик к плате Arduino по схеме на рис. 18.2.
2. Загружаем в плату Arduino скетч из листинга 18.1.
3. Смотрим в мониторе последовательного порта Arduino IDE вывод значений смещения по осям X и Y и состояние кнопки (ось Z).

подключение к Arduino двухосевого аналогового джойстика
Рис. 18.2. Схема подключения платы джойстика и Pan/Title Bracket к Arduino

Создадим более понятный пример использования джойстика для управления положением кронштейна Pan/Titl Bracket с двумя сервоприводами, на котором можно разместить, например, камеру и менять положение камеры влево/вправо и вниз/вверх с помощью джойстика. Схема соединений для данного эксперимента показана на рис. 18.2.
Перемещением джойстика по оси X мы будем управлять поворотом нижнего сервопривода (влево/вправо), перемещением джойстика по оси Y будем управлять поворотом верхнего сервопривода (вверх/вниз). Среднее нейтральное положение джойтика по каждой оси (при аналоговом значении 512) соответствует углу поворота сервопривода на угол 90°. Содержимое скетча показано в листинге 18.2.

#include <Servo.h> // подключение библиотеки Servo
Servo servo1, servo2;
const int pinServo1=8; // Пин для подключения 1 сервопривода
const int pinServo2=9; // Пин для подключения 2 сервопривода
// переменные для хранения углов поворота сервоприводов
int angleServo1,angleServo2 = 0;
const int axisX=A0; // ось Х подключена к A0
const int axisY=A1; // ось Y подключена к A1
int valX, valY = 0; // переменные для хранения значений осей
void setup()
{
// подключить переменную servo1 к выводу pinServo1
servo1.attach(pinServo1);
// подключить переменную servo2 к выводу pinServo2
Servo2.attach(pinServo2);
}
void loop()
{
valX = analogRead(axisX); // значение оси Х
valY = analogRead(axisY); // значение оси Y
// масштабируем значение к интервалу 0-180
angleServo1=map(valX,0,1023,0,180);
angleServo2=map(valY,0,1023,0,180);
// поворот сервоприводов на полученный угол
servo1.write(angleServo1);
servo2.write(angleServo2);
delay(15); // пауза для ожидания поворота сервоприводов
}

Порядок подключения:

1. Собираем Pan/Title Bracket и сервоприводы.
2. Подключаем джойстик и Pan/Title Bracket к плате Arduino по схеме на рис. 18.2.
3. Загружаем в плату Arduino скетч из листинга 18.2.
4. Управляем положением Pan/Title Bracket перемещением джойстика по осям X и Y.

Листинги программ скачать

Читать далее

Главное меню

Каталог

Полезные ссылки

Цена
от
до