• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Нужна помощь подключение HC-SR04(датчик расстояния)

zukum

New member
Доброго времени суток!
Подключал ли кто-то HC-SR04 к esp8266. Мои попытки успехом не увенчались. Пытался подключить выводы Trig и Echo от HC-SR04 к GPIO0 и GPIO2 соответственно. На питании 3.3v запрос дистанции (использовал код из библиотеки Ultrasonic из Arduino) возвращает ноль. Попытка подключить питание на сонар 5в, приводит к тому что не стартует esp8266 (синий светодиод на плате не загорается, т.е. вебсервер не стартует).

Может кто подскажет что не так делаю.

Вот код написанный под среду разработки Arduino(переделал пример из статьи с этого сайта):
Код:
#include <ESP8266WiFi.h>

// Trig - 0, Echo - 2
// Ultrasonic ultrasonic(0, 2);
float dist_cm = 0;
#define Trig_pin 0
#define Echo_pin 2
long  duration,distacne_cm,distance_inc;
#define CM 1
#define INC 0

const char* ssid = "Net341";
const char* password = "A3F28F89DB";

// Create an instance of the server
// specify the port to listen on as an argument
WiFiServer server(80);

long Timing()
{
  digitalWrite(Trig_pin, LOW);
  delayMicroseconds(2);
  digitalWrite(Trig_pin, HIGH);
  delayMicroseconds(10);
  digitalWrite(Trig_pin, LOW);
  duration = pulseIn(Echo_pin, HIGH);
  return duration;
}

long Ranging(int sys)
{
  Timing();
  distacne_cm = duration /29 / 2 ;
  distance_inc = duration / 74 / 2;
  if (sys)
    return distacne_cm;
  else
    return distance_inc;
}

void setup() {
  Serial.begin(115200);
  delay(10);
// инициализация пинов для ультрасоника
   pinMode(Trig_pin, OUTPUT);
   pinMode(Echo_pin, INPUT);


  // prepare GPIO2
//  pinMode(2, OUTPUT);
//  digitalWrite(2, 0);
 
  // Connect to WiFi network
  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);
 
  WiFi.begin(ssid, password);
 
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");
 
  // Start the server
  server.begin();
  Serial.println("Server started");

  // Print the IP address
  Serial.println(WiFi.localIP());
}

void loop() {
  // Check if a client has connected
  WiFiClient client = server.available();
  if (!client) {
    return;
  }

  // Wait until the client sends some data
  Serial.println("new client");
  while(!client.available()){
    delay(1);
  }
 
  // Read the first line of the request
  String req = client.readStringUntil('\r');
  Serial.println(req);
  client.flush();

  dist_cm = Ranging(CM);     // get distance
  Serial.print(";dist=");
  Serial.println(dist_cm);
 
  
  client.flush();

  // Prepare the response
  String s = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n<!DOCTYPE HTML>\r\n<html>\r\nGPIO is now ";
  //s += (dist_cm)?"high":"low";
  s += dist_cm;
  s += "</html>\n";

  // Send the response to the client
  client.print(s);
  delay(1);
  Serial.println("Client disonnected");

  // The client will actually be disconnected
  // when the function returns and 'client' object is detroyed
}
 

zukum

New member
Спасибо за ответ!
К сожалению код для Eclipse если не ошибаюсь, как есть его использовать нет возможности.
В приведенном примере используется пин5, у меня плана ESP-01, на ней вывод RX, TX, GPIO0, GPIO2.
В своем примере я использовал GPIO0 и 2. В остальном код вроде не различается. Логика простая.
Вычитал на форуме что при старте esp8266 необходимо чтобы выводы GPIO 0 и 2 были подтянуты к плюсу. Сделал так - запитал HC-SR04 от 5v, выводы Echo и Trig подключаю после старта esp8266, при этом сервер на esp8266 работает нормально, но дистанцию все равно не зачитывает.

МОжет есть какая-то особенность работы с GPIO по сравнению с работой с пинами Arduino. На ардуино датчик прекрасно работает.
 

AnonymUser

New member
К сожалению код для Eclipse если не ошибаюсь, как есть его использовать нет возможности.
моожно собрать через командную строку командой make , если win поставьте с этого поста http://esp8266.ru/forum/threads/smi...abotki-proshivok-esp8266.167/page-4#post-4333
Благодаря нашему уважаемому сообществу и в особенности, Дмитрию Кирееву, у Sming наконец появилась полноценная система автоматической инсталяции и сборки.
или соберите сами https://github.com/anakod/Sming/releases

расчет проверяли?
на сигнальный пин сигнал идет(отключите от датчика и проверьте)? А ответ от датчика к esp? попробуйте просто вывод данных без расчетов.


upd:

[HASHTAG]#define[/HASHTAG] Trig_pin 0
pinMode(Trig_pin, OUTPUT);

согласно таблице http://esp8266.ru/wp-content/uploads/esp8266-gpio.jpg gpio 0 не работает на output
 
Последнее редактирование:

zukum

New member
Вот где собака порылась. Оба используемых мною пина не работают на out. Спасибо за ценный совет. Буду думать что делать, пинов в исполнении esp01 не так много
 

anakod

Moderator
Команда форума
Это какая-то странная таблица, у меня прекрасно I2C заводится на GPIO0,2
Единственное условие при загрузки модуля они должны быть в правильном состоянии.

PS Кстати UART пины тоже вполне можно использовать как GPIO
 

sharky

New member
А уровни согласовать не забыли?
Там в каментах к либе сминговой я писал про согласование.

Hsr04 пятивольтовый а эха должна приходить трехвольтовая, иначе не взлетит.
 

zukum

New member
GPIO0 и GPIO2 работают на OUTPUT и на INPUT, доказано на опыте.
Но то-ли лыжи не едут то-ли еще чего, но не считывается расстояние.
Итак выяснилось что ESP посылает сигнал в сонар, и сонар отвечает - ардуина считывает сигнал ответа, так что здесь сомнений нет. Согласование выводов сделал( LM1117DT-3.3), по крайней мере при подачи 5v через согласователь на GPIO2 который настроен на INPUT показывает 1 на входе. Может функция PulseIn как-то криво работает...
 
Последнее редактирование:

zukum

New member
Еще один ньюанс, если при старте ESP к нему подключен сонар(HC-SR04) - GPIO0 на Trig и GPIO2 на Echo, при этом сонар запитан от 5v, на ESP загорается синий светодиод и он не отвечает, если наоборот подключить - ESP переходит в режим прошивки. Как это можно победить?
 

zukum

New member
Победил проблему! Ура!
На GPIO2 так и не удалось подключить Echo от ултрасоника. Пришлось применить грязный хак из http://esp8266.ru/esp8266-esp-01-hacked/. Вывел GPIO14, подключил к нему Echo. Модуль стал стартовать без проблем но дистанцию не показывал. Выяснилось что PulseIn для esp не работает, написал свою, все заработало.
Всем спасибо за помощь!
 

zukum

New member
Картинка, если кому интересно я использую для макетирования IDE шлейф, удобно. Но надо учитывать что часть пинов соединены между собой. Опытным путем проверяется
esp.jpg
 
Последнее редактирование модератором:

zukum

New member
Конечно поделюсь:
Код:
unsigned long Mypulsein(int pin, int level)
{
  int i = 0;
  unsigned long start, startImp, finishImp;
  start =  millis();
  startImp =  micros();
  finishImp =  micros();
  do {
    if (digitalRead(pin)==level){
      i = 1;
      startImp =  micros();
    }
  } while((i==0)&&((millis()-start)<500));
  i = 0;
  do {
    if (digitalRead(pin)!=level){
      i = 1;
      finishImp =  micros();
    }
  } while((i==0)&&((millis()-start)<1000));
 
  return finishImp - startImp;
}
 
Сверху Снизу