Estoy intentando conectar 4 sensores ultrasónicos HC-SR04 a Arduino UNO utilizando un chip PCF8574P de NXP. Si hay 4 sensores conectados a los pines Arduino, todo está bien.
El problema aparece cuando trato de enlazarlos a través de PCF8574P. La velocidad de respuesta cae dramáticamente: casi 4 segundos para enviar señales y leer la respuesta de los 4 sensores.
Lo que realmente toma tiempo es pulseIn (). Este es el lugar donde más tiempo me dedico ...
Aquí está el código:
#include <Wire.h>
#include "PCF8574.h"
PCF8574 pcf_us; //Ultrasonic sensors
//The matrix of pin assignments for the ultrasonic sensors (trig (OUTPUT), echo (INPUT))
int usPinMatrix[4][2] = {
{0, 4}, //0 (pin for trig), 4 (pin for echo)
{1, 5}, //1 (pin for trig), 5 (pin for echo)
{2, 6}, //2 (pin for trig), 6 (pin for echo)
{3, 7} //3 (pin for trig), 7 (pin for echo)
};
void setup() {
Serial.begin (9600);
Serial.println("Initializing device...");
Wire.begin();
//PCF8574P I2C address
/*
A0 A1 A2 address
- - - 0x20
+ - - 0x21
- + - 0x22
+ + - 0x23
- - + 0x24
+ - + 0x25
- + + 0x26
+ + + 0x27
*/
pcf_us.begin(0x21);
for (int i = 0; i <= 3; i++){
pcf_us.pinMode(usPinMatrix[i][0], OUTPUT);
pcf_us.pinMode(usPinMatrix[i][1], INPUT);
};
};
void loop() {
int us_pin, trigPin, echoPin, duration, distance;
for (int i = 0; i <= 3; i++){
Serial.print(usPinMatrix[i][0]);
Serial.print(") ");
Serial.print("Send sound... ");
pcf_us.digitalWrite(usPinMatrix[i][0], HIGH);
pcf_us.digitalWrite(usPinMatrix[i][0], LOW);
Serial.print("Switch off... Reading from ");
Serial.print(usPinMatrix[i][1]);
Serial.print("... ");
duration = pulseIn(usPinMatrix[i][1], HIGH);
distance = duration / 2 / 29.1;
Serial.print("Duration: ");
Serial.print(duration);
Serial.print(" s ");
Serial.print(distance);
Serial.println(" cm");
if (usPinMatrix[i][0] == 3) Serial.println("");
};
};
Esto es lo que obtengo cuando ejecuto el código:
0) Send sound... Switch off... Reading from 4... [Waiting] Duration: 0 s 0 cm
1) Send sound... Switch off... Reading from 5... [Waiting] Duration: 0 s 0 cm
2) Send sound... Switch off... Reading from 6... [Waiting] Duration: 0 s 0 cm
3) Send sound... Switch off... Reading from 7... [Waiting] Duration: 0 s 0 cm
¿Qué estoy haciendo mal?