Hola compañeros, os escribo por que me encuentro con un problema que me ha surgido a raiz de juntar 2 sketch de arduino. El proyecto se trata de una estacion meteorologica. Bueno paso a contaros un poco la situacion.
Por una parte tenia ya todo preparado para que los datos se fuesen mostrando segun fuese pulsando un boton hacia delante y con otro boton hacia detras, sumando y restando el estado segun el boton pulsado.
Hasta ahi genial, luego quise crear un menu para que tuviese mejor presentacion y como que lo consegui pero no podia mostrar los datos, solo las opciones a elegir en el menu.
Entonces me echaron una mano y me ayudaron con un programa que trata del uso de un rotaryEncoder. Este programa va de 0 a 9 por ejemplo y cuando pulsas el boton del encoder entonces se multiplica por 10 el numero en el que estes, dandote acceso a cambiar el estado y poder visualizar otra cosa, y si lo mantienes pulsado 3 segundos vuelve atras. No se si me he explicado bien. El programa se lo dejo aqui, y funciona perfectamente para lo que lo quiero.
#include <RotaryEncoder.h>
#define NIVELES 2 //Numero de niveles
#define buttonPin 5 //Pin del boton
#define debounceDelay 20 //Tienpo de retardo
#define TimeOut 3000
#define Vnivel1 9 //Volumen del nivel 1, cantidad de posibilidades iniciales
/* Nivel Inicial --> 0 a 6
* Nivel 1 --> 10 a 12
* Nivel 2 --> 20 a 22
* Nivel 3 --> 30 a 32
* Nivel 4 --> 40 a 46
* Nivel 5 --> 50 a 52
* Nivel 6 --> 60 a 61
* Nivel 7 --> 70
* Nivel 8 --> 80
* Nivel 9 --> 90
*/
int maxnivel[Vnivel1+1]={9,12,22,32,46,52,62,70,80,90};// limite de los niveles
int cifras(int entrada);
RotaryEncoder encoder(6, 7);
int ledState = HIGH;
unsigned long int LowTime = 0;
void menuEncoder();
void setup()
{
Serial.begin(9600);
pinMode(buttonPin, INPUT_PULLUP);
}
void loop()
{
menuEncoder();
}
void menuEncoder()
{
static long int pos = 0;
encoder.tick();
long int newPos = encoder.getPosition();
if (pos != newPos)
{
if (newPos > maxnivel[pos/10] || newPos < (pos-pos%10))//
{
encoder.setPosition(pos);
}
else
{
Serial.println(encoder.getPosition());
//Serial.println(maxnivel[pos/10]);
pos = newPos;
encoder.setPosition(pos);
}
}
int reading = digitalRead(buttonPin);
if (reading == LOW)
{
LowTime = millis();
delay(debounceDelay);
while(!digitalRead(buttonPin) && (millis() - LowTime) < TimeOut);//Serial.println(millis()-LowTime);
LowTime = millis() - LowTime;
//Serial.print("time:");
//Serial.println(LowTime);
if (LowTime > 1000) //Atras
{
newPos = encoder.getPosition()/10;
encoder.setPosition(newPos);
pos = newPos;
Serial.println(encoder.getPosition());
}
if (LowTime > 0 && LowTime < 1000) //Aceptar
{
if (pos/10 < 1)
{
newPos = encoder.getPosition()*10;
encoder.setPosition(newPos);
pos = newPos;
Serial.println(encoder.getPosition());
}
}
}
}
int cifras(int entrada)
{
int i=0;
while(entrada/10 > 0)
{
i++;
}
return i;
}
Bueno hasta ahi muy contento con los resultados, el problema vino al mezclar ese programa con el que seria el proyecto y en el que tendria que funcionar como lo hace el solo aparte.
Al girar en rotaryEncoder no pasa de 1, se mueve entre 0 y 1 y raramente llega a 2, al pulsar el boton en 1 accede a las opciones que estan configuradas, pero nuevamente entre 10 y 11, y si pulso durante 3 segundos vuelve atras, no se por que sucede esto. No se si es problema de distribucion de codigo o algo parecido, por eso necesito vuestra ayuda. El segundero del reloj tambien se retrasa al mostrarse por pantalla, la hora la recibe por puerto serie del gps y la posicion por la que va el rotaryEncoder se muestra por el puerto serie. No se que hacer. Os dejo el codigo completo del otro programa... si se que es un poco extenso pero si no lo dejo entero alomejor no podeis ayudarme.
----Ojo el programa os tengo que dejar el archivo por que no me permite subir mas de 9000 caracarteres----
Muchas gracias por vuestro tiempo y si veis que algo esta mal o me dais alguna recomendacion, os lo agradeceria bastante.
Como dato puedo dejar esto que creo que es importante, lo que descarta colapso de la placa ¿no?:
"El Sketch usa 33874 bytes (13%) del espacio de almacenamiento de programa. El máximo es 253952 bytes.
Las variables Globales usan 1372 bytes (16%) de la memoria dinámica, dejando 6820 bytes para las variables locales. El máximo es 8192 bytes."
EDITO: El modelo de rotary encoder que uso es un keyes 40, pero la funcion es la misma que uno culaquiera, este viene ya es una placa con sus pines de conexion. La libreria rotary si esta cambiada por que para que sumase uno en la cuenta, en el programa de ejemplo, habia que hacer dos movimientos a derecha o restar 1 dos movimientos a izquierda. El click central funciona a la prefeccion
Proyecto_Estacion_1.ino (16.5 KB)
Adafruit_BMP280_Library.zip (6.49 KB)
Adafruit_Sensor-master.zip (6.7 KB)
BH1750-master.zip (6.57 KB)
DHT.zip (4.15 KB)
OneWire.zip (17.9 KB)
RotaryEncoder.zip (2.09 KB)
TinyGPSPlus-0.95a.zip (41.2 KB)
U8glib_Arduino-master.zip (1.08 MB)