Всем доброго дня! Подключил к 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); }
Можно, а чего нельзя-то. Во всех пустых циклах вместо {}; написать некий контроль времени и возврат ошибки, если таймаут просрочен. При таком алгоритме опроса они все будут ждать друг друга.
Есть же прекрасный механизм прерываний. На кой чего-то ждать, если можно тупо спать? А прерывание само оповестит, когда что-то изменится.