Ahora lo he entendido!, he modificado el código añadiendo la lectura y escritura de la variable desde la SD pero me surgen 2 problemas (he cambiado a MEGA por falta de pines)
//----------------------ARDUINO MEGA------------------------------------------------------
//--------------------------------------------------------------------------
// PROGRAMA PUERTA AUTOMATICA CON BARRERA DE SEGURIDAD,ENCODER Y CIERRE AUTOMATICO
//---------------------------------------------------------------------------------------------
// PIN-0 ---
// PIN-1 ---
// PIN-2 --- PULSADOR ABRIR
// PIN-3 --- PULSADOR CERRAR
// PIN-4 --- SCK MICRO SD
// PIN-5 --- ENCODER A
// PIN-6 --- ENCODER B
// PIN-7 --- BANDA SEGURIDAD
// PIN-8 --- RELE SALIDA ABRIR
// PIN-9 --- RELE SALIDA CERRAR
// PIN-10 -- RELE SALIDA FRENO MOTOR
// PIN-11 -- BARRERA SEGURIDAD
// PIN-12 -- RELE FALLO ALIMENTACIÓN
// PIN-50 -- MISO MICRO SD
// PIN-51 -- MOSI MICRO SD
// PIN-52 -- SCK MICRO SD
#include <SD.h>
#include <SPI.h>
#include <Encoder.h>
File myFile;
Encoder myEnc(5, 6);
long newPosition;
long oldPosition = -999;
int posicion_anterior;
unsigned long tiempo;
unsigned long tiempo1;
int tiempo_retardo = 5000;
int resultado;
// Constantes para definir los pines
#define pulsador_abrir 2
#define pulsador_cerrar 3
#define banda_seguridad 7
#define rele_abrir 8
#define rele_cerrar 9
#define rele_freno 10
#define barrera_seguridad 11
#define fallo_alimentacion 12
//--------------------------------
const int ledPin = 13;
bool puerta_abierta = false;
bool puerta_cerrada = false;
bool subiendo = false;
bool bajando = false;
bool estado_puerta_indefinido = false;
bool cierre_auto = false;
bool bloqueo_tiempo = false;
bool emergencia = false;
bool retardo = false;
bool bloqueo = false;
bool valor_pulsador_abrir = false;
bool valor_pulsador_cerrar = false;
bool estado_micro_abierta = false;
bool estado_micro_cerrada = false;
bool estado_barrera_seguridad = false;
bool estado_banda_seguridad = false;
bool estado_alimentacion = false;
void setup() {
retardo = false; //----------------CAMBIAR A TRUE SI QUEREMOS ACTIVAR EL RETARDO CIERRE AUTOMATICO--------------------------
cierre_auto = false;
bloqueo_tiempo = false;
estado_alimentacion = false;
bloqueo = false;
pinMode(fallo_alimentacion, INPUT);
pinMode(pulsador_abrir, INPUT);
pinMode(pulsador_cerrar, INPUT);
pinMode(ledPin, OUTPUT);
pinMode(rele_abrir, OUTPUT);
pinMode(rele_cerrar, OUTPUT);
pinMode(barrera_seguridad, INPUT);
pinMode(rele_freno, OUTPUT);
pinMode(banda_seguridad, INPUT);
digitalWrite(rele_abrir, LOW);
digitalWrite(rele_cerrar, LOW);
digitalWrite(rele_freno, LOW);
Serial.begin(9600);
if (!SD.begin(4)) {
Serial.println("No se pudo inicializar");
return;
}
Serial.println("inicializacion exitosa");
LeeArchivo();
}
void loop() {
tiempo = millis();
valor_pulsador_cerrar = digitalRead(pulsador_cerrar);
valor_pulsador_abrir = digitalRead(pulsador_abrir);
estado_barrera_seguridad = digitalRead(barrera_seguridad);
estado_banda_seguridad = digitalRead(banda_seguridad);
estado_alimentacion = digitalRead(fallo_alimentacion);
if (newPosition <= 0) {
puerta_cerrada = true;
} else {
puerta_cerrada = false;
}
if (newPosition >= 50) {
puerta_abierta = true;
} else {
puerta_abierta = false;
}
if (estado_banda_seguridad | estado_barrera_seguridad) {
emergencia = true;
} else {
emergencia = false;
}
lectura_encoder();
cierre_puerta();
apertura_puerta();
parada_cierre();
parada_apertura();
// apertura_sin_posicion();
subida_emergencia();
temporizador();
falta_alimentacion();
}
void cierre_puerta() {
if (emergencia == false && !subiendo && puerta_abierta && valor_pulsador_cerrar == true) {
digitalWrite(rele_cerrar, HIGH);
digitalWrite(rele_freno, HIGH);
bajando = true;
Serial.println("Cerrando Puerta");
}
}
void apertura_puerta() {
if (!bajando && puerta_cerrada && valor_pulsador_abrir == true) {
digitalWrite(rele_abrir, HIGH);
digitalWrite(rele_freno, HIGH);
subiendo = true;
Serial.println("Abriendo Puerta");
}
}
void parada_cierre() {
if (bajando | cierre_auto && puerta_cerrada) {
digitalWrite(rele_cerrar, LOW);
digitalWrite(rele_freno, LOW);
bajando = false;
cierre_auto = false;
bloqueo_tiempo = false;
Serial.println("Puerta Cerrada");
}
}
void parada_apertura() {
if (subiendo && puerta_abierta) {
digitalWrite(rele_abrir, LOW);
digitalWrite(rele_freno, LOW);
subiendo = false;
cierre_auto = false;
Serial.println("Puerta Abierta");
}
}
void apertura_sin_posicion() {
if (!puerta_abierta && !puerta_cerrada && valor_pulsador_abrir == true) {
digitalWrite(rele_abrir, HIGH);
digitalWrite(rele_freno, HIGH);
subiendo = true;
Serial.println("Buscando Posición");
}
}
void subida_emergencia() {
if (bajando | cierre_auto && emergencia) {
digitalWrite(rele_cerrar, LOW);
digitalWrite(rele_abrir, HIGH);
bajando = false;
subiendo = true;
bloqueo_tiempo = false;
Serial.println("Apertura Seguridad");
}
}
void temporizador() {
if (retardo && puerta_abierta && !bloqueo_tiempo && !emergencia) {
tiempo1 = tiempo;
resultado = tiempo1 + tiempo_retardo;
bloqueo_tiempo = true;
Serial.println(tiempo1);
Serial.println(resultado);
}
if (!emergencia && retardo && puerta_abierta && tiempo > tiempo1 + tiempo_retardo) {
digitalWrite(rele_freno, HIGH);
digitalWrite(rele_cerrar, HIGH);
cierre_auto = true;
bajando = true;
Serial.println("Cierre auto");
}
}
void lectura_encoder() {
newPosition = myEnc.read() + posicion_anterior;
if (newPosition != oldPosition) {
oldPosition = newPosition;
Serial.println(newPosition);
}
}
void falta_alimentacion() {
if (estado_alimentacion == true) {
Serial.println("CORTE ALIMENTACION");
guardar();
}
}
void LeeArchivo()
{
myFile = SD.open("PRUEBA.txt");
if (myFile)
{
while (myFile.available())
{
char palabra = myFile.read();
//Serial.print(palabra);
posicion_anterior = myFile.parseInt();
Serial.println(posicion_anterior);
}
myFile.close();
}
else
{
Serial.println("Error Al Abrir El Archivo");
}
}
void guardar() {
if (!bloqueo) {
SD.remove("PRUEBA.txt");
myFile = SD.open("PRUEBA.txt", FILE_WRITE);
if (myFile) {
Serial.print("Escribiendo valor");
myFile.seek(0);
myFile.println(newPosition);
// close the file:
myFile.close();
bloqueo = true;
} else {
Serial.println("Error al abrir archivo");
}
}
}
Cuando ejecuto este void
void guardar() {
if (!bloqueo) {
SD.remove("PRUEBA.txt");
myFile = SD.open("PRUEBA.txt", FILE_WRITE);
if (myFile) {
Serial.print("Escribiendo valor");
myFile.seek(0);
myFile.println(newPosition);
// close the file:
myFile.close();
bloqueo = true;
} else {
Serial.println("Error al abrir archivo");
}
}
}
Después chequeo la sd y efectivamente el valor está ahí (el guardado lo hago borrando y creando de nuevo por que no se como leer el ultimo valor si hay mas de uno).
Cuando ejecuto la lectura solo me aparece el ultimo digito
void LeeArchivo()
{
myFile = SD.open("PRUEBA.txt");
if (myFile)
{
while (myFile.available())
{
char palabra = myFile.read();
//Serial.print(palabra);
posicion_anterior = myFile.parseInt();
Serial.println(posicion_anterior);
}
myFile.close();
}
else
{
Serial.println("Error Al Abrir El Archivo");
}
}
No se si estoy leyendo de manera correcta el archivo.
Y el otro problema es que veo es que el encoder parece que no hace todas las lecturas que debería.