Hola Amigos, tengo un problema al momento de llamar una función dentro del void loop, esta función lo unico que hace es darme el estado de las conexiones GMS y WAN que tengo en el Arduino, estas las imprime en un display LCD Serial por Tx.
Se supone que debería hacer todas las demás sentencias declaradas que tengo en el void loop una vez llamada la función, como utilizar un boton, o prender un led. El tema es que si tengo problemas, ya que cuando llamo esta función dentro del void loop no me deja hacer anda más, trata de utilizar un boton y no pasa nada, sigue entregándome los datos en la pantalla pero nada mas. Cuando comento la función, todas las demás sentencias función sin ningun problema, pero cuando la descomento, vuelve el problema.
Les dejo el codigo para que lo revisen:
void loop() {
estadoLCD();
// lee el pin de entrada 2
int buttonState = digitalRead(pushButton);
Process mail;
Process sonido;
if (buttonState > 0 ){
digitalWrite(relay1,LOW);
delay(2000);
digitalWrite(relay1,HIGH);
//modem.sendSMS("+56977582886", message);
// mail.runShellCommand("ssmtp camilo.nunez@cnf.cl < /mnt/sda1/arduino/seguridad/alerta.txt");
// sonido.runShellCommand("madplay /mnt/sda1/arduino/seguridad/alerta.mp3");
delay(5); //espera 5 milisegundos antes de reiniciar el proceso
}
}
/*-----------------------------------------------------------INICIO DEFINICION FUNCIONES------------------------------------------------------------------------------------*/
void estadoLCD(){
clearScreen();
selectLineOne();
lcdSerial.print("WAN:");
lcdSerial.print(verificarInternet());
lcdSerial.print(" ");
lcdSerial.print("GSM:");
lcdSerial.print(verificarGMS());
selectLineTwo();
lcdSerial.print(tiempo());
delay(60000); //dos minutos
}
String verificarGMS(){
if(modem.isOn()==true){
return "SI";
}else{
return "NO";
}
}
//Funcion para verificar si hay conexion a internet
String verificarInternet(){
Process verificar;
verificar.begin("python");
verificar.addParameter("/mnt/sda1/arduino/python/testInternet.py");
verificar.run();
while (verificar.available()){
String resultadoPython = verificar.readString(); // Con esto obtenemos la respuesta en forma de String desde el scritp de Python
resultadoPython.trim(); // Limpiamos de espacios en el incio y fin del string obtenido
if(resultadoPython == "1"){ //Estos son los procesos que realiza si el codigo de la tarjeta esta en la base de datos, el scritp de Python devuelve un "1" si esta.
return "SI";
break;
}
if(resultadoPython == "0"){ //Estos son los procesos que realiza si el codigo de la tarjeta NO esta en la base de datos, el scritp de Python devuelve un "2" si NO esta.
return "NO";
break;
}
}
}
Me parece que te quedas sin RAM.
Yo lo que haria es mover esas dos asignaciones como globales y probar el funcionamiento.
Además pondria una función que te permita ver cuanta RAM tienes disponible con o sin las lineas comentadas.
Cuando un programa no funciona o se enlentece generalmente ese es el problema, RAM agotada.
Por otro lado, no publicas todo el código asi que mas no puedo sugerir.
Más que ram creo que es el problema de los delay (aunque es verdad que deberías mover las variables que te dijo surbyte ), en la función estadoLCD tienes
delay(60000); //dos minutos
cuando utilizas delay, el loop principal de arduino se detiene, por lo que no estaría ejecutando ninguna otra función. Para evitar eso, es mejor usar millis();
aquí hay un tutorial donde explican su funcionamiento, fíjate en los comentarios del código .
jajaja sabes que hice cuando miré el código... leo estadoLCD() y supongo actualiza lcd, algo que tomará milisegundos.. jajaja pues no. 2 MINUTOS.
No se para que usas semejante delay!!
Había escrito una modificación con while pero luego me doy cuenta que hace lo mismo que delay asi que no sirve.
Cambie el código como dijeron, dejando millis en vez de delay, ahora si funciona el boton, pero solo cuando terminar de imprimir los datos en el LCD Serial, y funciona solo en fracciones de segundo, la idea es que funciones en paralelamente al LCD.
El código quedo así:
void loop() {
unsigned long currentMillis = millis();
if (currentMillis - previousMillis > interval) {
previousMillis = currentMillis;
clearScreen();
selectLineOne();
lcdSerial.print("WAN:");
lcdSerial.print(verificarInternet());
lcdSerial.print(" ");
lcdSerial.print("GSM:");
lcdSerial.print(verificarGMS());
selectLineTwo();
lcdSerial.print(tiempo());
}
// lee el pin de entrada 2
int buttonState = digitalRead(pushButton);
if (buttonState > 0 ) {
digitalWrite(relay1, LOW);
delay(2000);
digitalWrite(relay1, HIGH);
//modem.sendSMS("+56977582886", message);
// mail.runShellCommand("ssmtp camilo.nunez@cnf.cl < /mnt/sda1/arduino/seguridad/alerta.txt");
// sonido.runShellCommand("madplay /mnt/sda1/arduino/seguridad/alerta.mp3");
}
}
String verificarGMS() {
if (modem.isOn() == true) {
return "SI";
} else {
return "NO";
}
}
//Funcion para verificar si hay conexion a internet
String verificarInternet() {
Process verificar;
verificar.begin("python");
verificar.addParameter("/mnt/sda1/arduino/python/testInternet.py");
verificar.run();
while (verificar.available()) {
String resultadoPython = verificar.readString(); // Con esto obtenemos la respuesta en forma de String desde el scritp de Python
resultadoPython.trim(); // Limpiamos de espacios en el incio y fin del string obtenido
if (resultadoPython == "1") { //Estos son los procesos que realiza si el codigo de la tarjeta esta en la base de datos, el scritp de Python devuelve un "1" si esta.
return "SI";
break;
}
if (resultadoPython == "0") { //Estos son los procesos que realiza si el codigo de la tarjeta NO esta en la base de datos, el scritp de Python devuelve un "2" si NO esta.
return "NO";
break;
}
}
}
Algnas correcciones las dejaré comentadas como // CORREGIDO
//defino variables
byte buttonState;
boolean bState = false;
unsigned long off_time;
void loop() {
unsigned long currentMillis = millis();
if (currentMillis - previousMillis > interval) {
previousMillis = currentMillis;
clearScreen();
selectLineOne();
lcdSerial.print("WAN:");
lcdSerial.print(verificarInternet());
lcdSerial.print(" ");
lcdSerial.print("GSM:");
lcdSerial.print(verificarGMS());
selectLineTwo();
lcdSerial.print(tiempo());
}
// CORREGIDO
if ((bState) && (millis()>=off_time)) {
// esta on siempe que sea igual o mayor que off_time
digitalWrite(relay1,HIGH);
bState = false;
}
else if (!bState) { // lo apago
buttonState = digitalRead(pushButton);
if (buttonState == HIGH) {
digitalWrite(relay1, LOW);
bState = true;
off_time = millis() + 2000;
}
}
//modem.sendSMS("+56977582886", message);
// mail.runShellCommand("ssmtp camilo.nunez@cnf.cl < /mnt/sda1/arduino/seguridad/alerta.txt");
// sonido.runShellCommand("madplay /mnt/sda1/arduino/seguridad/alerta.mp3");
}
}
String verificarGMS() {
if (modem.isOn() == true) {
return "SI";
} else {
return "NO";
}
}
//Funcion para verificar si hay conexion a internet
String verificarInternet() {
Process verificar;
verificar.begin("python");
verificar.addParameter("/mnt/sda1/arduino/python/testInternet.py");
verificar.run();
while (verificar.available()) {
String resultadoPython = verificar.readString(); // Con esto obtenemos la respuesta en forma de String desde el scritp de Python
resultadoPython.trim(); // Limpiamos de espacios en el incio y fin del string obtenido
if (resultadoPython == "1") { //Estos son los procesos que realiza si el codigo de la tarjeta esta en la base de datos, el scritp de Python devuelve un "1" si esta.
return "SI";
break;
}
if (resultadoPython == "0") { //Estos son los procesos que realiza si el codigo de la tarjeta NO esta en la base de datos, el scritp de Python devuelve un "2" si NO esta.
return "NO";
break;
}
}
}
que raros son los programas o que malo soy yo programando, haciendo parcialmente lo mismo no puedo hacerlo funcionar y en tu caso si.. jaja.
Me alegro que haya quedado resuelto.