HC-SR04_ESP8266-0

В нашем случае будем использовать модуль Wemos D1 Mini Pro на микроконтроллере  ESP 8266 и Ультразвуковой датчик  модель HC-SR04+  работает при напряжении в диапазоне от 3,3 Вольт — 5 Вольт    (помечено как HC-SR04+ на задней стороне платы модуля).

Таблица сравнения параметров ультразвукового датчика моделей HC SR04 и HC SR04+

Имя параметра Напряжение питания

 

Min

значения

Типичные значения Max

значения

Физическая величина
Напряжение питания

 

3 .0 5.5 V
Потребление в режиме тишины Vcc = 5V 2.8 mA
Потребление в режиме тишины Vcc = 3.3V 2.2 mA
Min дальность обзора Vcc = 5V 2 3 cm
Min дальность обзора Vcc = 3.3V 2 3 cm
Max дальность обзора Vcc = 5V 400 (~200) 450 (~200) 600 (~200) cm
Max дальность обзора Vcc = 3.3V 350 (~180) 400  (~180) 550  (~180) cm
Эффективный угол обзора 15 градус
Погрешность измерения расстояния 1 %
Разрешение (градация выходного сигнала): 1-3 мм
выход GPIO
Рабочая температура -20 80 Градус С

     Вы можете использовать любую схему ESP 8266 и любой совместимый Ультразвуковой датчик, необходимо будет только согласование этих двух устройств по напряжению питания,  микроконтроллер  ESP 8266 для  уменьшения энергопотребления работает при напряжении V CC = 3,3 Вольт, а модули ультразвуковых датчиков, обычно в целях требований повышенного напряжения питания пьезоэлектрических ультразвуковых преобразователей, работают при напряжением V CC =    5 Вольт соответственно, для этого потребуется согласование логических уровней сигналов по напряжению для обмена импульсами между ESP 8266 и ультразвуковым датчиком.

Классическая схема на МОП-транзисторе для преобразования логических уровней напряжения

 

preobrazovanie-logicheskih-urovnej

Используется всего один МОП-транзистор. Рассмотрим работу схемы. Когда на входе 3,3V GPIO будет логический ноль, МОП-транзистор Q1 откроется (так как напряжение затвор-исток будет 3,3 Вольт), на выходе 5V logic также будет логический ноль так как он через транзистор Q1 будет подключен к входу 3,3V GPIO. Когда на входе 3,3V GPIO будет логическая единица, то есть  напряжение  3,3 Вольт, то напряжение затвор-исток составляет 0 Вольт, транзистор Q1 закроется  сопротивление R2 подтянет напряжение на выходе 5V logic до 5 Вольт.

Схема также преобразует логический уровень напряжения 5 Вольт в 3,3 Вольт в обратном направлении. Транзистор Q1 имеет встроенный диод между выводами стока и истока — если на входе 5V logic будет логический ноль — 5 Вольт, то и выходе 3,3V GPIO через диод будет логический ноль — 3,3 Вольт . Когда на входе 5V logic будет логическая единица + 5 Вольт, то и выходе 3,3V GPIO будет логическая единица напряжением +3,3 Вольт подтянутая через резистор R1.

         Приведенная выше схема часто используется для преобразования уровней двунаправленных шин , например таких , как  I2C. Для  шины I2C, вам потребуется две копии схемы, одна для SDA линии, другая для SCL.

          Используя ультразвуковой датчик HC-SR04+ с модулем Wemos D1 Mini Pro  Вам никаких согласований по напряжению питания и напряжению логических уровней не потребуется, также не потребуется  преобразователь интерфейса  USBUART ( он установлен на модуле Wemos D1 Mini Pro),  а в режиме отладки не нужен блок питания, напряжение 5 Вольт подаётся на всю схему Рис. 2 через интерфейс USB от вашего компьютера.

HC SR04 ESP8266 11

 

Рис. 2 Схема соединения модуля WeMos D1 Micro Pro на микроконтроллере ESP8266 с ультразвуковым датчиком HC-SR04+ нарисована в графическом редакторе Fritzing , документацию как пользоваться Fritzing можно почитать например на  Робоше, библиотеку модулей фирмы WeMos, изображения  модуля WeMos D1 Mini и обратной стороны модуля WeMos D1 Mini Вы найдете на форуме хороших инженеров — схемотехников.

Рис. 3 График реального времени, отображаемый данные с ультразвукового датчика HC-SR04+ на сервере   «Интернет вещей» — thingspeak.com
Х- ВРЕМЯ; Y -ДИСТАНЦИЯ ДО ОБНАРУЖЕННОГО ОБЪЕКТА;

Если у вас нет соединительных проводов, можно использовать любые провода и панельки которые идут дополнительно в комплекте к модулю ESP 8266 Wemos D1 Mini Pro

ESP8266

Рис. 4 Комплект поставки модуля ESP 8266  D1 Mini Pro от фирмы Wemos

После построения схемы  Рис. 2 Скачиваем следующие программы:

  1. Среду разработчика программ Arduino IDE
  2. Читаем «МОНИТОР ПОРТА СРЕДЫ РАЗРАБОТЧИКА ПРОГРАММ Arduino IDE«
  3.  Скачиваем и загружаем в Arduino IDE ESP8266WiFi.h — Библиотеку WiFi функций для ESP8266
  4. Ниже приведенную программу без комментариев для загрузки в Arduino IDE

Программа (Scetch) расписана с комментариями (ВСЕ ЧТО НАПИСАНО ЗЕЛЕНЫМ ЦВЕТОМ) очень подробно для изучения с нуля языка С ++ и конечно же языка “Wiring” для Arduino:

// АКАДЕМИЯ РОБОТОТЕХНИКИ
// https://MirRobo.ru
//
// Программа написана в среде разработчика программ Arduino IDE на языке “Wiring”   —
// диалект  языка С++
//
// ПОДКЛЮЧЕНИЕ УЛЬТРАЗВУКОВОГО ДАТЧИКА HC-SR04 К МИКРОКОНТРОЛЛЕРУ ESP-8266
//
// ПОДКЛЮЧЕНИЕ МИКРОКОНТРОЛЛЕРА ESP-8266 К ИНТЕРНЕТ ЧЕРЕЗ ТОЧКУ ДОСТУПА
// ИЛИ ЧЕРЕЗ ИНТЕРНЕТ WiFi МАРШРУТИЗАТОР
//
// ДЛЯ ПОДКЛЮЧЕНИЯ К ИНТЕРНЕТУ МИКРОКОНТРОЛЛЕРА ESP-8266 ПРОПИСЫВАЕМ СТАТИЧЕСКИЙ IP

// АДРЕС, МАСКУ IP АДРЕСА, АДРЕС ШЛЮЗА ПО УМОЛЧАНИЮ
//
// ДЛЯ ВЫВОДА ДАННЫХ ПОЛУЧАЕМЫХ С УЛЬТРАЗВУКОВОГО ДАТЧИКА HC-SR04 БУДЕМ ИСПОЛЬЗОВАТЬ
// МОНИТОР ПОРТА СРЕДЫ РАЗРАБОТЧИКА ПРОГРАММ Arduino IDE
// ДЛЯ ПОСТРОЙКИ ГРАФИКА ИЗ ДАННЫХ ПОЛУЧАЕМЫХ С УЛЬТРАЗВУКОВОГО ДАТЧИКА HC-SR04 БУДЕМ
// ИСПОЛЬЗОВАТЬ СЕРВИС «Интернет вещей» — thingspeak.com
//
// ДЛЯ ПРЕДСТАВЛЕНИЯ НА САЙТЕ АКАДЕМИИ РОБОТОТЕХНИКИ ГРАФИКА ДАННЫХ ПОЛУЧАЕМЫХ С
// УЛЬТРАЗВУКОВОГО ДАТЧИКА HC-SR04 ИСПОЛЬЗУЕМ С СЕРВИСА thingspeak.com ТАКОЙ ЖЕ
// ФРЕЙМ КАК НА YOUTUBE СЕРВИСЕ, НАСТРАИВАЕМ ЕГО ПОД СИГНАЛЫ ПОСТУПАЮЩИЕ С
// УЛЬТРАЗВУКОВОГО ДАТЧИКА HC-SR04

// НОЯБРЬ 27 2016
// АВТОР: PetrDeCril’on
// Website: https://MirRobo.ru/

/* Подключаем библиотеки с расширением .h — это фрагменты уже кем то написанных программ содержащие часто используемые функции для наших программ, находятся простым поиском в сети Интернет */
#include <ESP8266WiFi.h> /*  ESP8266WiFi.h — Библиотека WiFi функций для ESP8266.  Директива #include используется для  включения сторонних библиотек*/

/* Создаем символьные переменные (запись-модификатор char обозначает символьный литерал длиной один байт) и присваиваем (знак =) — т.е. задаем значения которые изменить в дальнейшем будет нельзя ( запись константы модификатор: const).*/
/*Знак звездочка * указывает что имя ssid — возможно изменяемый в программе указатель на не возможно к изменению в программе значение «sonet» и модификаторы const char распространяются не на ssid а на не изменяемые в программе данные «sonet» */
//Задаем имя ssid и пароль pass WiFi точки доступа, у Вас их значения будут свои:
const char* ssid = «sonet»;
const char* pass = «123456»;

//Определяем и задаем к каким контактам (D7, D6)модуля микроконтроллера ESP-8266 будут подключены контакты (Echo, Trigger) ультразвукового датчика HC-SR04
#define echoPin D7 // Echo — входной сигнал эха от модуля ультразвукового датчика
// HC-SR04
#define trigPin D6 // Trigger — выходной сигнал запуска внутреннего микроконтроллера
// датчика HC-SR04 поступающий от модуля ESP-8266

long duration, distance; /* Задаём переменную duration — значение длины принимаемого импульса со входа Echo — эхо от модуля ультразвукового датчика HC-SR04; и переменную distance — вычисленное значение расстояния от датчика до предмета от которого отразился ультразвуковой импульс. long — переменная длиной 32 бита со знаком (4 байта), может принимать значения от -2147483648 до 2147483647 */

/* Задаем с помощью функции IPAddress х() из библиотеки ESP8266WiFi.h статические IP адреса, Вы можете эти строки убрать так как по умолчанию во всех точках доступа поднята динамическая IP адресация DHCP которая эти адреса раздаёт автоматически при подключению к точке доступа: */
IPAddress ip(172, 17, 18, 6); //статический IP адрес модуля ESP-8266
IPAddress gateway(172, 17, 18, 1);/*статический IP адрес шлюза по умолчанию — адрес WiFi точки доступа */
IPAddress subnet(255,255,255,240);//маска Вашей подсети.

/* Задаем в виде строковой переменной String ключ API вашего канала полученный Вами при регистрации на сервисе «Интернет вещей» — thingspeak.com */
String apiKey = «QL2UYHRXC99WP4BE»;

/* Создаем указатель server на символьную константу const char* со значением в виде адреса URL api.thingspeak.com сервиса «Интернет вещей»*/
const char* server = «api.thingspeak.com»;

/* Запускаем WiFi клиента функции взятой из библиотеки ESP8266WiFi.h */
WiFiClient client;

/* В программах для микроконтроллеров должны быть две обязательные функции: setup() и loop(), слово void используется при объявлении функций. После названия функции и круглых скобок идут фигурные скобки, внутри которых будет располагаться ваш код.

Функция setup() запускается один раз, после каждого включения питания или сброса платы Arduino. В теле данной функции пишется код для инициализации переменных, установки режима работы цифровых портов, и т.д.*/
void setup() {
Serial.begin(115200); /* Запускаем и программируем на модуле ESP-8266 последовательный интерфейс UART и задаем ему скорость обмена с Вашим компьютером 115200 бит/сек — бод */

delay(10); /* на всякий случай для увеличения времени реакции модуля ESP-8266 на предыдущую команду задаем паузу в 10 миллисекунд */

pinMode(trigPin, OUTPUT);/* задаем режим OUTPUT- «Выход» контакту D6 модуля ESP-8266 с именем в нашей программе trigPin */
pinMode(echoPin, INPUT);/* задаем режим INPUT- «Вход» контакту D7 модуля ESP-8266 с именем в нашей программе echoPin */

WiFi.begin(ssid, pass);/*Соединяемся с точкой доступа */
WiFi.config(ip, gateway, subnet);/*Прописываем статические IP адреса модуля ESP-8266 согласованные с точкой доступа WiFi, Вам эта функция может не понадобиться если у вас на точке доступа динамическая IP адресация DHCP*/

/* Выводим статус подключения модуля ESP-8266 к точке доступа WiFi в «Монитор порта» среды разработчика программ Arduino IDE: */
while (WiFi.status() != WL_CONNECTED) { /*Запускаем While — цикл который будет выполняться непрерывно и бесконечно до тех пор, пока значение функции WiFi.status() станет равно глобальной переменной WL_CONNECTED то есть произойдет соединение с точкой доступа WiFi — значение функции while () круглых скобках, (!= — логический знак «не равно») не станет равно логическому ЛОЖНО */

delay(500);/*для увеличения времени соединения модуля ESP-8266 с точкой доступа WiFi задаем паузу в 500 миллисекунд */

Serial.print(«.»);/*С помощью функции Serial.print() передаем в цикле изображение точки в «Монитор порта» среды разработчика программ Arduino IDE, через последовательный порт как ASCII текст — отображаем процесс подключения к точке доступа WiFi в виде цепочки точек */
}
Serial.println(» «);/* С помощью функции Serial.println() передаем пробел в «Монитор порта» через последовательный порт как ASCII текст с следующим за ним символом переноса строки (ASCII символ 13 или ‘\r’) и символом новой строки ( ASCII 10 или ‘\n’*/)

Serial.print(«WiFi connected, using IP address: «);/* Передаем в «Монитор порта» запись WiFi connected, using IP address: через последовательный порт как ASCII текст */

Serial.println(WiFi.localIP);/* Передаем в «Монитор порта» IP адрес модуля ESP-8266 через последовательный порт как ASCII текст с следующим за ним символом переноса строки (ASCII символ 13 или ‘\r’) и символом новой строки (ASCII 10 или ‘\n’) */

Serial.println(ssid);/*Передаем в «Монитор порта» ssid — имя WiFi сети через последовательный порт как ASCII текст с следующим за ним символом переноса строки (ASCII символ 13 или ‘\r’) и символом новой строки (ASCII 10 или ‘\n’) */

}

/* Функция loop() в бесконечном цикле последовательно раз за разом исполняет команды, которые описаны в её теле. Т.е. после завершения функции снова произойдет её вызов. То есть микроконтроллер постоянно работает и ждет внешних команд и данных с датчиков его можно перезагрузить программно кнопкой Reset или выключив/включив электропитание*/
void loop() {
/* В цикле void loop()  с контакта D6 модуля ESP-8266 (переменная в программе trigPin) посылаем с промежутком 50 миллисекунд импульсы длительностью 10 микросекунд для запуска внутреннего микроконтроллера датчика HC-SR04. С контакта D7 модуля ESP-8266 (переменная в программе echoPin) принимаем усиленный и преобразованный датчиком HC-SR04 импульс пропорциональный дистанции до обнаруженного объекта ультразвуковым датчиком и вычисляемой по эмпирической формуле дистанция в сантиметрах равна длительности принимаемого импульса деленная на 50, подбирая делитель можно откорректировать линейную погрешность ультразвукового датчика */

digitalWrite(trigPin, LOW);/*С помощью функции digitalWrite() подаем на цифровой вход/выход (pin(контакт D6 модуля ESP-8266 переменная в программе trigPinзначение логического нуля LOW0 Вольт (земля).*/

delayMicroseconds(2); /*задаем длительность логического нуля на trigPin 2 микросекунды*/

digitalWrite(trigPin, HIGH);/*Подаем на цифровой вход/выход (pin) (контакт D6 модуля ESP-8266 переменная в программе trigPinзначение логической единицы HIGH — Вольт (3.3 Вольт для 3.3 Вольт-вых  плат).*/

delayMicroseconds(10);/*задаем длительность логической единицы на trigPin 10 микросекунд */

digitalWrite(trigPin, LOW);/*Подаем на цифровой вход/выход(pin)(контакт D6 модуля ESP-8266 переменная в программе trigPin)значение логического нуля LOW0 Вольт (земля).*/

duration = pulseIn(echoPin, HIGH);/*Присваиваем переменной duration значение HIGH длительности принимаемого импульса с контакта D7 модуля ESP-8266 (переменная в программе echoPin) то есть принимаем усиленный и преобразованный датчиком HC-SR04 импульс пропорциональный дистанции до обнаруженного объекта ультразвуковым датчиком */

distance = duration/58.2;/*  Вычисляем по эмпирической формуле дистанцию до обнаруженного объекта (в см), опираясь на скорость звука в воздухе  изменяя значение коэффициента 58.2 можем скорректировать  линейную погрешность ультразвукового датчика*/

Serial.println(distance);/* Передаем в «Монитор порта» дистанцию до обнаруженного объекта (в см) через последовательный порт как ASCII текст с следующим за ним символом переноса строки (ASCII символ 13 или ‘\r’) и символом новой строки (ASCII 10 или ‘\n’) */

delay(50);/*Делаем промежуток 50 миллисекунд между выходными запускающими импульсами внутреннего микроконтроллера датчика HC-SR04*/

// ДЛЯ ПОСТРОЙКИ ГРАФИКА ИЗ ДАННЫХ ПОЛУЧАЕМЫХ С УЛЬТРАЗВУКОВОГО ДАТЧИКА HC-SR04 БУДЕМ
// ИСПОЛЬЗОВАТЬ СЕРВИС «Интернет вещей» — thingspeak.com

if (client.connect(server,80)) {/*Подключаемся к серверу api.thingspeak.com или  «184.106.153.149» */

/* Присваеваем  String — строковой переменной postStr последовательным подсоединением — конкатенацией — значения ключа API вашего канала полученный Вами при регистрации на сервисе «Интернет вещей» — thingspeak.com; поле канала &field1=; переменной distance определяющей дистанцию до обнаруженного объекта (в см), а также символы переноса строки (ASCII символ 13 или ‘\r’( и символы новой строки (ASCII 10 или ‘\n’): */
String postStr = apiKey;
postStr +=»&field1=»;
postStr += distance;
postStr += «\r\n\r\n»;
/* С помощью функции client.print() передаем на сервер api.thingspeak.com используя метод POST, HTML страницу с данными с ультразвукового датчика HC-SR04 */
client.print(«POST /update HTTP/1.1\n»);
client.print(«Host: api.thingspeak.com\n»);
client.print(«Connection: close\n»);
client.print(«X-THINGSPEAKAPIKEY: «+apiKey+»\n»);
client.print(«Content-Type: application/x-www-form-urlencoded\n»);
client.print(«Content-Length: «);
client.print(postStr.length);
client.print(«\n\n»);
client.print(postStr);

}
client.stop();/* С помощью функции client.stop() отключаемся от сервера api.thingspeak.com */

Serial.println(«Waiting…»);/* Передаем в «Монитор порта» сообщение ожидания: Waiting… через последовательный порт как ASCII текст с следующим за ним символом переноса строки (ASCII символ 13 или ‘\r’) и символом новой строки (ASCII 10 или ‘\n’)*/

delay(20000);/* Задаем минимальную задержку в 20 секунд между запросами к серверу api.thingspeak.com для передачи на него данных с ультразвукового датчика HC-SR04 */
}

После загрузки и запуска программы (прошивки) на микроконтроллере ESP8266 проверьте командой  PING подключение Вашей схемы к сети WiFi:
 ping-esp8266
УЛЬТРАЗВУКОВЫЕ ДАТЧИКИ
ПЕРЕДЕЛКА УЛЬТРАЗВУКОВОГО ДАТЧИКА HC-SR04