Buenas. Estoy con un proyecto y estoy usando el ESP8266 para dar conectividad a mi Arduino Uno.
Pero me surge el siguiente problema:
Estoy utilizando dos sensores de ultrasonidos HC-SR04, y cargando un programa simple en Arduino donde sólo calculo la distancias de estos sensores, me devuelve los valores correctamente.
A la hora de cargar el programa en el que utilizo el ESP8266, las mediciones que me devuelven estos sensores toman valores extraños y fluctúan mucho. Las conexiones y la función para calcular estos valores son los mismos que en el programa simple. De alguna manera el ESP8266 tiene que estar haciendo algo raro. Alguien sabe a que se puede deber ?
Gracias y un saludo.
No veo nada raro en tu esquema de conexiones, ni el el código que has puesto.
Sereno:
No veo nada raro en tu esquema de conexiones, ni el el código que has puesto.
Estas equivocado, el cableado es incorrecto y no crea correctamente el objeto, por eso no le funciona.
Gracias por responder, os dejo un esquemático y la función que calcula la distancia del sensor:
Y la función:
int ping(int TriggerPin, int EchoPin){
long duration, distanceCm;
digitalWrite(TriggerPin,LOW);
delayMicroseconds(4);
digitalWrite(TriggerPin,HIGH);
delayMicroseconds(10);
digitalWrite(TriggerPin,LOW);
duration = pulseIn(EchoPin, HIGH);
distanceCm = duration * 10 / 29.2 /2;
return distanceCm;
}
Vuelvo a insistir en que el conexionado de ambos programas es el mismo, y la función que calcula la distancia también, no entiendo por qué se vuelven locos los sensores HC-SR04
**Acabo de encontrar una solución, tengo los dos sensores enchufados a la fuente de alimentación de 5V de Arduino, cuando están los 2 conectados devuelven valores raros, si solo dejo conectado 1 funciona bien. Además, si intento conectar el otro sensor a una fuente externa, deja de funcionar correctamente el primero también. Explicación?
El código que dejas no está completo. Si leíste las normas del foro, ellas te piden que proveas siempre toda la información.
En el esquema mas o menos parece entenderse cuales pines usas para conectar los sensores, 5 y 6 x un lado, 8 y 9 por otro. Pero no costaba mucho indicarlo, algo que se hubiese leído en el código completo.
Luego vemos que tienes un ESP y parece estar conectado a los pines 2 y 3 pero no veo adaptación de niveles, porque el pin RX del ESP no puede recibir 5V del UNO y debe como minimo pasar por un divisor de tensión 1k y 2k. Buscalo y entenderás.
El esquema no deja claro las alimentaciones de 5V y 3.3V ademas de GND.
Algo que esta mal pero no tiene que ver con tu problema de los HC-SR04 es que no debes alimentar un ESP8266-01 con los 3.3V del UNO. La salida de 3.3 entrega máximo uno 60mA y el ESP01 requiere mucho mas al momento de TX y RX por lo tanto puede que funcione alguna vez o para responderte a comandos AT pero será errático.
Debes usar un AMS1117 (regulador LDO de 3.3V) o cualquier otro similar.
La fotoresistencia LDR me parece entender que esta entre GND y A0 ? Eso no sirve, debe tener una resistencia desde A0 a 5V
Tienes varias fallas en tu esquema.
Algo mas cuando dibujes un esquema diferencia positivo (ROJO) de negativo (NEGRO) y otro positivo (3.3V) usando colores diferentes y siempre siempre une las conexiones de modo ortogonal o sea a 90 grados.
De lo contrario no se entiende lo que estas haciendo. Critica constructiva.
Hola, gracias por tu respuesta.
Se que no debo de alimentar el ESP con los 3.3V del Arduino, tengo una fuente de alimentación externa que proporciona la corriente necesaria. Lo que no sabía era lo del pin RX. Debo colocar entonces un divisor de tensión, pero cual es la razón? Se supone que los pines de Arduino entregan 5V y debo regularlos a 3.3V?
Tengo que decir que el ESP8266 me está dando muchos problemas, en el momento que hago cosas con el deja todo de funcionar bien
Gracias y un saludo
Para que te ayudemos coloca todo el código y diagrama completos.
En tu diagrama conectas la fotoresistencia a GND, pero debería estar alimentada con 5 V ( puede ser con 3,3V pero no podrías utilizar toda la escala).
He ajusto el divisor de tensión para el pin RX del ESP8266, parece que el ESP funciona, aunque ahora me mete carácteres raros en la comunicación serial.
Sin embargo, los sensores HC-SRC04 siguen mostrando valores raros.
Aquí dejo el esquemático del divisor de tensión, por si hubiera algún error. (las resistencias son de 1k)
El código completo es el siguiente:
#include<SoftwareSerial.h>
#include <Servo.h>
Servo servoMotor;
SoftwareSerial BT1(3, 2); // RX | TX
char txt;
String TXT;
const int pinWater = 11;
float foodLevel = 12;
int distanceSensor1;
int distanceSensor2;
boolean serverOn = true;
const int EchoPin = 5;
const int TriggerPin = 6;
const int EchoPin2 = 8;
const int TriggerPin2 = 9;
const int pinLight = 11;
int lightSensor;
int counter;
long media;
long media2;
void setup()
{
Serial.begin(9600);
BT1.begin(9600);
pinMode(pinWater, OUTPUT);
servoMotor.attach(10);
delay(10);
servoMotor.write(160);
pinMode(pinLight, OUTPUT);
counter = 0;
media = 0;
media2 = 0;
}
void setServerMode(){
delay(5000);
Serial.println("Somos server");
BT1.println("\n");
BT1.println("AT+CWMODE=3");
delay(1000);
BT1.println("AT+CIPMUX=1");
delay(1000);
BT1.println("AT+CIPSERVER=1,80");
}
void setClientFood(){
distanceSensor1 = ping(TriggerPin, EchoPin);
delay(500);
lightSensor = analogRead(A0);
// delay(500);
// distanceSensor2 = ping(TriggerPin2, EchoPin2);
TXT="";
BT1.println("\n");
BT1.println("AT+CIPSERVER=0");
delay(1000);
BT1.println("AT+CWMODE=1");
Serial.print("Enviando al servidor");
delay(1000);
BT1.println("AT+CIPMUX=0");
delay(1000);
BT1.println("AT+CIPSTART=\"TCP\",\"" "api.thingspeak.com" "\",80");
delay(1000);
BT1.println("AT+CIPSEND=90");
delay(1000);
BT1.println("GET /update?key=N4DR57NTUGR6UWKM&field1=464&field2=475&field3=" + String(lightSensor));
delay(1000);
BT1.println("AT+CIPCLOSE");
BT1.setTimeout(200);
delay(1000);
BT1.println("AT+CWMODE=3");
BT1.setTimeout(200);
delay(1000);
BT1.println("AT+CIPMUX=1");
BT1.setTimeout(200);
delay(1000);
BT1.println("AT+CIPSERVER=1,80");
BT1.setTimeout(200);
}
void setFeeder(){
servoMotor.write(90);
delay(1600);
servoMotor.write(160);
}
void setWater(){
digitalWrite(pinWater,HIGH);
delay(3000);
digitalWrite(pinWater,LOW);
}
int ping(int TriggerPin, int EchoPin){
long duration, distanceCm;
digitalWrite(TriggerPin,LOW);
delayMicroseconds(4);
digitalWrite(TriggerPin,HIGH);
delayMicroseconds(10);
digitalWrite(TriggerPin,LOW);
duration = pulseIn(EchoPin, HIGH);
distanceCm = duration * 10 / 29.2 /2;
return distanceCm;
}
void loop(){
// distanceSensor1 = ping(TriggerPin, EchoPin);
// delay(500);
// Serial.println(distanceSensor1);
// distanceSensor2 = ping(TriggerPin2, EchoPin2);
// delay(500);
// Serial.println(distanceSensor2);
// counter = counter + 1;
// if(counter >=60){
// Serial.println("Actualizando valores sensores");
// media = media / 60;
// media2 = media2 / 60;
// setClientFood();
// counter = 0;
// media = 0;
// }
if(serverOn==true){
setServerMode();
serverOn = false;
}
if (Serial.available()){
txt = Serial.read();
BT1.print(txt);
}
while (BT1.available()){
delay(2);
char txt2= BT1.read();
TXT += txt2;
}
if (TXT.length()>0) {
Serial.print(TXT);
if(TXT.indexOf("readsensor") > 0){
Serial.print("Leyendo sensores");
setClientFood();
}else if(TXT.indexOf("feeder") > 0){
Serial.print("Activando comedero");
setFeeder();
}else if(TXT.indexOf("water") > 0){
Serial.print("Activando agua");
//setWater();
}else if(TXT.indexOf("lights") > 0){
Serial.print("Activando luces");
digitalWrite(pinLight, HIGH);
delay(1000);
}else if(TXT.indexOf("off") > 0){
Serial.print("Activando luces");
digitalWrite(pinLight, LOW);
}
TXT="";
}
delay(1000);
}
Lo de la fotoresistencia no tengo problemas, el esquemático está mal, pero la tengo bien conectada y funcionando
Ya te puedo dar la repuesta porque tu código no funciona, Esta hecho con distintas funciones que individualmente funcionan, pero cuando se unen no. El problema radica en los delays(), Ve a documentación y encontraras información como diseñar tus funciones para que unidas funcionen (con milis() ) .
Por eso se pide el código completo.
Saludos