Работа с несколькими датчиками HC-SR04

Добрый день, я постигаю азы программирования на этой чудесной платформе и впервые написал что то более менее серьезное. Наверняка вы как продвинутые в этом плане люди увидете кучу ошибок или проблем в моем творении, кинте тапком что я сделал по вашему мнению не так, но пожалуйста, с обоснованием или хотябы с небольшим пояснением как нужно.
Если кратко что это такое, мне нужно подключить несколько датчиков расстояния ультразвуковых и опрашивать их по очереди, если значение расстояния превышает порог (допустим 50см), то записать это, и после опроса всех датчиков (планируеться от 2 до 8) в вебку вывести число датчиков что превысили его.

#include <NewPing.h>                                 
#include <SPI.h>
#include <Ethernet.h>


#define SONAR_NUM 2                                  // количество сенсоров.
#define MAX_DISTANCE 500                             // Maximum distance (in cm) to ping.
#define ena1 30                                      //trigger for 1
#define ena2 30                                      //trigger for 2
const int ID = 1;                                    // номер платы
int activatedSensors = 0;                            // установка переменной
const int sensorPins[SONAR_NUM] = {ena1, ena2};
long sensors[SONAR_NUM];                             //array to store sensor distances 

byte mac[] = { 0xFA, 0xFA, 0x01, 0x00, 0x01, 0x71 }; // Мак-адрес Ethernet
IPAddress ip(192, 168, 1, 101);                      // IP-адрес Arduino
byte gateway[] = { 192, 168, 1, 1 };                 // IP-адрес шлюза
byte subnet[] = { 255, 255, 255, 0 };                // Маска подсети

EthernetServer server(80);

NewPing sonar[SONAR_NUM] = {                         // Sensor object array.
  NewPing(4, 5, MAX_DISTANCE),                       // Each sensor's trigger pin, echo pin, and max distance to ping. 
  NewPing(6, 7, MAX_DISTANCE), 

};

void setup() {
pinMode(ena1, OUTPUT);
pinMode(ena2, OUTPUT);
Ethernet.begin(mac, ip, gateway, subnet);           // start the Ethernet connection and the server:
server.begin();                                     // start the server
}

void loop() {

 for (uint8_t i = 0; i < SONAR_NUM; i++) {          // Loop through each sensor and display results.
    delay(50);                                      // Wait 50ms between pings (about 20 pings/sec). 29ms should be the shortest delay between pings.
    sensors[i] = sonar[i].ping_cm(); 
  }

  
  if (sensors[0] > 0 && sensors[0] <= MAX_DISTANCE){
 
  digitalWrite(ena1, HIGH);
  }else{
  digitalWrite(ena1,LOW);
  }
 {
  activatedSensors = 0;
  for (int i = 0; i < SONAR_NUM; i++) {
    int sensorReading = digitalRead(sensorPins[i]);
      if (sensorPins[i] == HIGH) {
        activatedSensors++;
      }
    }
  }
  
  EthernetClient client = server.available();     // выводим вебстраницу

  if (client) {
    bool currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        if (c == '\n' && currentLineIsBlank) {
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println("Connection: close");
          client.println("Refresh: 1");
          client.println("Access-Control-Allow-Origin: *");
          client.println();
          client.println("<!DOCTYPE HTML>");
          client.println("<html>");
          client.println("<head>");
          client.println("<title>");
          client.println("ID: " + String(ID));
          client.println("</title>");
          client.println("</head>");
          client.println("<body>");
          client.println("ID: " + String(ID));
          client.println("Busy Parks: " + String(activatedSensors) + " of " + String(SONAR_NUM));    // Вывод активированных датчиков
          client.println("</body>");
          client.println("</html>");
          break;
        }
        if (c == '\n') {
          currentLineIsBlank = true;
        } else if (c != '\r') {
          currentLineIsBlank = false;
        }
      }
    }
    delay(1);
    client.stop();
  }
   delay(1000);                                                             // Пауза между обновлениями в миллисекундах
  
 }

Т.е. никаких проблем с этим кодом у Вас нет, Вам просто хочется, чтобы Вас похвалили. Я правильно понял?

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

Т.е. питание на датчики не подаётся вовсе, просто их пины Vcc соединены между собой? Всё так?

Оригинальное решение!

И как? Работает?

1 лайк

Если Вы зададите вопрос, я (или другие) постараюсь на него ответить, а так … не вижу смысла что-то говорить, тем более, когда сразу же ставят условия, что мол говорить надо не как попало, а только

Хрен Вас знает, что Вы называете обоснованием. Практика же показывает, что “что ни скажи - всё не слава Богу”.

не дорисовал проводок на схеме извиняюсь, невнимателен. конечно датчикам питание подаеться с пина 5в МК
я открыт к любой критике, она деалет процесс обучения более результативным

имееться ввиду что легко написать, “ты сделал хрень” я же прошу указать хотябы где конкретно
например тут можно по другому или тут неправильно что то использовал

Началось, в колхозе утро!

Слушайте, Ardrunya, может Вам залогиниться под своим именем?

простите, я вас не понял.

интересно, а если выводы ECHO со всех датчиков посадить на один пин ардуино, будет работать?

1 лайк

По идее схема ИЛИ получиться. Если каждый Эхо через резистор. Хотя не.

думал об этом, поставить диод на каждый датчик и соединить пины, и дергать тригом их по очереди, но это если потребуеться более 4 штук например, пока пинов хватает посчитал это необоснованым усложнением схемы

Можно фото в студию этих модулей? Именно их, а не из тырнета. Заднюю сторону.

тут все про модули что я ипользую Arduino Ultrasonic Sensor Module Tutorial - How Ultasonic Module Works and Interfacing it with Arduino

мои точь в точь эти, если неоходимо именно фото моих могу сделать через пару часов как буду их забирать с почты

Какие-то навороченные. Непонятно только есть i2c и меняется ли адрес. Видимо нет.
В простом режиме можно применить сдвиговый регистр. Будет 8 датчиков.

i2c нет в них, только пин на RX (запуск измерения), и ответ на TX

Конечно, вы правы. Эта схема будет толко завтра мной собрана и включена, (датчики задерживаються в доставке), завтра все соберу и дополню пост, понял свою ошибку о публикации без конкретной проблемы походу на форумы не пишут


исправляю свою грубую ошибку

а предупреждения не смущают?
а также строки 8 и 9 и всё что с ними связано

1 лайк