Hola que tal muy buen día tengan todos ustedes miembros del foro, pues como habrán leído el titulo del tema es un Robot controlado por 3 motores, les explicare un poco el funcionamiento de lo que trato de hacer:
Este es un robot el cual era un jueguete, pero se quiso adaptar para ser controlado por arduino como un proyecto escolar y como es un proyecto escolar tiene cierto punto de complejidad creo yo para novatos en programación con arduino.
Este robot tiene 3 motores para hacerlo funcionar, es decir para moverse hacia adelante, atrás o a los lados, estos movimientos se tienen realizaran por medio de un sensor ultrasonico "automatico" y por medio de una app y un modulo bluetooth "manual", se agregaron otros sensores mas, como un sensor de presencia PIR el cual al ser accionado este emite unos sonidos obtenidos desde una memoria SD, un sensor de temperatura DTH11, la cual es mostrada por una pantalla LCD de 16x2, un sensor de gotas "LLUVIA" que activa un motor y unos leds, y por ultimo un sensor de color que activan unos leds RGB.
como todo novato tengo los mismos problemas que algunos han comentado aquí y en otros lados, que los códigos individuales funcionan perfectamente y al momento de unirlos "PUM" se hace un desastre total, ahora mismo estoy tratando a unir los códigos de audio y de temperatura pues creo que me han generado un poco mas de problemas, ya que al inicio muestro un mensaje de bienvenida el cual se muestra correctamente, pero al momento de pasar a mostrar la temperatura este se queda pasmado y solo se muestra el numero "3" por toda la pantalla, pero el código sigue funcionando con el sensor de presencia y el audio si se emite correctamente solo que la temperatura nunca es mostrada, a continuación les dejo el código por si alguien me pudiera aportar alguna idea de como solucionar ese error y seguir buscando otros errores en los códigos siguientes que pienso agregar.
#include <LiquidCrystal.h>
#include "DHT.h"
#define DHTPIN 5
#define DHTYPE DHT11
DHT dht(DHTPIN, DHTYPE);
#include <SD.h> //define libreria LCD
#define SD_ChipSelectPin 53 //define pin de SD (SPI)
#include <TMRpcm.h> //libreria reproduccion asincrona sonido
#include <SPI.h> // SPI, para controlar SD
#define __MAX_ESTADOS_TALKING 4
#define __MIN_ESTADOS_TALKING 2
TMRpcm tmrpcm;
/// variables SD y audio///
int numeroFrases;
//sensor de movimiento
int calibrationTime = 10;
int pirPin = 4;
// Maquina de EStados
int MEstados,MEstados2;
int max_estados = 0; // control de numero maximo de cambios
//temporizadores
long t1;
int masdelay = 0; // poner delay aleatorio
long t_espera_aleatoria; //para introducir intervalos aleatorios
//alternador de sonido
String nombre_archivo = String(20);
String terminacion = String(5);
char cadena[60];
//variables LCD//
LiquidCrystal lcd(13, 12, 10, 9, 8, 7);
void setup (){
{
dht.begin();
presentacion();
}
{
MEstados = 0;
MEstados2 = 0;
tmrpcm.speakerPin = 11; //5,6,11 or 46 on Mega, 9 on Uno, Nano, etc
Serial.begin(115200);
if (!SD.begin(SD_ChipSelectPin)) {
Serial.println("SD fail");
return;
}
else{
Serial.println("SD ok");
}
tmrpcm.play("inicio"); //el sonido inicial
//Inicializo sensor de movimiento
pinMode(pirPin, INPUT);
digitalWrite(pirPin, LOW);
//Estabilizar el sensor de movimiento
for(int i = 0; i < calibrationTime; i++){
delay(1000);
}
delay(50);
t1 = millis();
}
}
void loop(){
{
int h = dht.readHumidity();
int t = dht.readTemperature();
///////////humedad
lcd.setCursor(0,1);
lcd.print("HUMEDAD: ");
lcd.setCursor(8,1);
lcd.print(h); //escribe humedad
lcd.print("%");
//////////Temperatura
lcd.setCursor(0,0);
lcd.print("TEMPERATURA:");
lcd.setCursor(12,0);
lcd.print(t); //escribe temperatura
lcd.print("C");
}
//Gestion de la maquina de Estados
if (MEstados2!=MEstados){
MEstados = MEstados2;
Serial.print(millis());Serial.print(":");Serial.print(MEstados);Serial.print(":");
}
//Maquina de estados ppal
switch(MEstados){
case 0: //Deteccion de movimiento
max_estados = 0;
if(digitalRead(pirPin) == HIGH){
//no hago nada sigo contando
}
else{
t1= millis();
}
if ((millis()-t1)>10){
MEstados2 = 1;
numeroFrases = random(__MIN_ESTADOS_TALKING,__MAX_ESTADOS_TALKING);
t1 = millis();
}
break;
case 1: //He detectado movimiento
tmrpcm.stopPlayback();
aleatorio(10);
nombre_archivo = "audio1";
nombre_archivo = nombre_archivo + terminacion;
nombre_archivo.toCharArray(cadena,40);
Serial.println(nombre_archivo);
tmrpcm.play(cadena);
MEstados2 = 101;
t1 = millis();
break;
case 101:
if (millis()-t1>3500){
MEstados2 = 2;
t1 = millis();
}
break;
case 2:
max_estados++;
MEstados2 = 3;
if (max_estados>=numeroFrases){
Serial.println("Salgo por maxEstados");
MEstados2 = 100;
}
break;
case 3: //Reproduce una cadena aleatoria
tmrpcm.stopPlayback();
aleatorio(19);
nombre_archivo = "aa";
nombre_archivo = nombre_archivo + terminacion;
nombre_archivo.toCharArray(cadena,40);
Serial.println(nombre_archivo);
tmrpcm.play(cadena);
//masdelay= random(1000,3500);
//delay(masdelay);
MEstados2 = 103;
break;
case 103: //espera fija entre frases
if (millis()-t1>3500){
MEstados2 = 104;
t1 = millis();
t_espera_aleatoria = random(1000,3000);
}
break;
break;
case 104://espera aleatoria entre frases
if (millis()-t1>t_espera_aleatoria){
MEstados2 = 2;
t1 = millis();
}
break;
case 100: //Acabo y vuelvo a estado de deteccion
if(digitalRead(pirPin) == LOW){
MEstados2 = 0;
tmrpcm.stopPlayback();
aleatorio(8);
nombre_archivo = "audio2";
nombre_archivo = nombre_archivo + terminacion;
nombre_archivo.toCharArray(cadena,40);
tmrpcm.play(cadena);
delay(8000);
t1 = millis();
}
}
}
//para seleccionar los archivos de froma aleatoria
void aleatorio(int imax){
byte aux_aleatorio = random(1,imax); //para cada sonido hay 10 variantes
switch(aux_aleatorio){
case 1:
terminacion = "-1";
break;
case 2:
terminacion = "-2";
break;
case 3:
terminacion = "-3";
break;
case 4:
terminacion = "-4";
break;
case 5:
terminacion = "-5";
break;
case 6:
terminacion = "-6";
break;
case 7:
terminacion = "-7";
break;
case 8:
terminacion = "-8";
break;
case 9:
terminacion = "-9";
break;
case 10:
terminacion = "-10";
break;
case 11:
terminacion = "-11";
break;
case 12:
terminacion = "-12";
break;
case 13:
terminacion = "-13";
break;
case 14:
terminacion = "-14";
break;
case 15:
terminacion = "-15";
break;
case 16:
terminacion = "-16";
break;
case 17:
terminacion = "-17";
break;
case 18:
terminacion = "-18";
break;
case 19:
terminacion = "-19";
break;
default:
terminacion = "-11";
break;
}
}
void presentacion() {
// set up the LCD's number of columns and rows:
dht.begin();
lcd.begin(16, 2);
lcd.setCursor(0, 1);
lcd.print("Bienvenidos");
for (int positionCounter = 0; positionCounter < 57; positionCounter++) {
lcd.scrollDisplayLeft();
}
lcd.setCursor(0, 0);
lcd.print("Proyecto arduino");
for (int positionCounter = 0; positionCounter < 45; positionCounter++) {
lcd.scrollDisplayLeft();
delay(450);
}
{
delayMicroseconds(500);
lcd.clear();
}
}