Отслеживание подключенных датчиков

Тема в разделе "Arduino & Shields", создана пользователем John-F, 25 ноя 2021.

  1. John-F

    John-F Нуб

    Всем доброго дня!

    Подключил к Arduino датчики MH-Z14A по PWM, все работает прекрасно, данные передаются GET запросом на сервер, однако есть проблемка. Нужно понять подключен ли датчик к порту PWM, иначе скетч подвисает в ожидании изменения значения. Можно ли на PWM понять есть ли вход от датчика,типа исправен/неисправен. Просто в ближайшем будущем там будет 6 датчиков и если один из них накроется, то все встанет ((( Ниже мой код

    Код (C++):
    #include <Ethernet.h>
    #include <SPI.h>
    #include <SoftwareSerial.h>
    // SoftwareSerial SerialCom(13, 12); // RX, TX

    // MAC-адрес нашего устройства
    byte mac[] = { 0x00, 0x2A, 0xF6, 0x12, 0x69, 0xDU }; // MAC-адрес устройства
    byte ip[] = { 192, 168, 0, 335 }; // ip-адрес устройства
    byte server[] = { 192, 168, 0, 104 }; // IP компьютера на котором установлен сервер majordomo
    byte gateway[] = { 192, 168, 0, 1 };
    byte subnet[] = { 255, 255, 255, 0 };
    char buf[80];
    EthernetClient client;

    // Функция отправки HTTP-запроса на сервер
    void sendHTTPRequest()
    {
    Serial.println(buf);
    if (client.connect(server, 80))
    {
    Serial.println("OK");
    client.println(buf);
    client.println("Host: 192.168.0.104"); // IP компьютера на котором установлен сервер majordomo
    client.println();
    delay(2000);
    client.stop();
    }

    }

    // int numberOfSamples = 3000;

    // PWM interface
    const int PWM1Pin = 3;
    const int PWM2Pin = 5;

    void setup ()
    {
      Ethernet.begin(mac, ip, gateway, subnet); // Инициализируем Ethernet Shield
    // SerialCom.begin(9600);
      pinMode(PWM1Pin, INPUT_PULLUP);
      pinMode(PWM2Pin, INPUT_PULLUP);
    //  delay(180000); // preheat the CO2 sensor for 3 minutes
      Serial.begin(9600);

    }
    void loop ()
    {
      int ppm_PWM1 = gas_concentration_PWM1();
      Serial.println("PWM1:");
      Serial.println(ppm_PWM1);
     
      int ppm_PWM2 = gas_concentration_PWM2();
      Serial.println("PWM2:");
      Serial.println(ppm_PWM2);

      delay(20000); // sleep for 1 minute



    // отправляем значения на сервер majordomo

    sprintf(buf, "GET /objects/?object=MH-Z14a-gostinaya&op=set&p=Value&v=%d HTTP/1.0", (int)ppm_PWM1, abs(ppm_PWM1));
    //sprintf(buf, "GET /objects/?object=MH-Z14a-test&op=set&p=ValueSaved&v=%d HTTP/1.0", (int)ppm_PWM1, abs(ppm_PWM1));
    //sprintf(buf, "GET /objects/?object=MH-Z14a-gostinaya&op=m&m=arduino_get_co2&t=%d HTTP/1.0", (int)ppm_PWM1, abs(ppm_PWM1));
    sendHTTPRequest();
    sprintf(buf, "GET /objects/?object=MH-Z14a-gostevaya&op=set&p=Value&v=%d HTTP/1.0", (int)ppm_PWM2, abs(ppm_PWM2));
    sendHTTPRequest();
    }


    int gas_concentration_PWM1() {
      while (digitalRead(PWM1Pin) == LOW) {};
      long t0 = millis();
      while (digitalRead(PWM1Pin) == HIGH) {};
      long t1 = millis();
      while (digitalRead(PWM1Pin) == LOW) {};
      long t2 = millis();
      long tH = t1 - t0;
      long tL = t2 - t1;
      long ppm = 5000L * (tH - 2) / (tH + tL - 4);
      while (digitalRead(PWM1Pin) == HIGH) {};
      delay(10);
      return int(ppm);
    }

    int gas_concentration_PWM2() {
      while (digitalRead(PWM2Pin) == LOW) {};
      long t0 = millis();
      while (digitalRead(PWM2Pin) == HIGH) {};
      long t1 = millis();
      while (digitalRead(PWM2Pin) == LOW) {};
      long t2 = millis();
      long tH = t1 - t0;
      long tL = t2 - t1;
      long ppm = 5000L * (tH - 2) / (tH + tL - 4);
      while (digitalRead(PWM2Pin) == HIGH) {};
      delay(10);
      return int(ppm);
    }
     
  2. Asper Daffy

    Asper Daffy Иксперд

    Можно, а чего нельзя-то. Во всех пустых циклах вместо {}; написать некий контроль времени и возврат ошибки, если таймаут просрочен.
    При таком алгоритме опроса они все будут ждать друг друга.
     
  3. parovoZZ

    parovoZZ Гуру

    Есть же прекрасный механизм прерываний. На кой чего-то ждать, если можно тупо спать? А прерывание само оповестит, когда что-то изменится.
     
  4. John-F

    John-F Нуб

    А не очень нагло попросить пример такой реализации с PWM? )))
     
  5. Asper Daffy

    Asper Daffy Иксперд

    parovoZZ попал :)
     
    Andrey12, DetSimen и SergeiL нравится это.