Báscula de cebo funcionado.

Dependencies:   mbed TextLCD

Revision:
2:11373e09c930
Parent:
1:93d8becc35f9
diff -r 93d8becc35f9 -r 11373e09c930 main.cpp
--- a/main.cpp	Wed May 25 16:11:32 2016 +0000
+++ b/main.cpp	Thu Jun 27 08:58:45 2019 +0000
@@ -1,52 +1,339 @@
 #include "mbed.h"
 #include "TextLCD.h"
 #include <string>
+#include "MSCFileSystem.h"
 
-//ZONA DE PRUEBAS 
+#define FSNAME "msc"
+
+MSCFileSystem msc(FSNAME);
 
-//definimos la bascula para despues obtener el peso
+LocalFileSystem local("local");    
+
+int saleBicho;
+//definimos la bascula para despues obtener el peso 
 Serial serialBascula(p9, p10); //Tx,Rx
 
-//Iniciamos I2C Communication 
-I2C i2c_lcd(p28,p27); // SDA, SCL 
-TextLCD_I2C lcd(&i2c_lcd, 0x4E, TextLCD::LCD16x2, TextLCD::HD44780); // I2C bus, PCF8574 Slaveaddress, LCD Type, Device Type 
+
+//Definimos los LED
+DigitalOut ledAux1(p15);
+DigitalOut ledAux2(p29);
+DigitalOut ledAux3(p30);
+DigitalOut ledManual(p16);          //Led de estado manual por defecto apagado
+DigitalOut ledEntrada(p17);         //Led de puerta de entrada por defecto apagado
+DigitalOut ledSalida(p18);          //Led de puerta de salida
+DigitalOut ledIzquierda(p19);       //Led de puerta Izquierda
+DigitalOut ledDerecha(p20);         //Led de puerta Derecha
+
+//Definimos las entradas
+DigitalIn manual(p21);              //Botón Manual
+DigitalIn entrada(p5);              //Botón Entrada
+DigitalIn salida(p6);               //Botón Salida
+DigitalIn izquierda(p7);            //Botón Izquierda
+DigitalIn derecha(p8);              //Botón Derecha
+DigitalIn masMax(p22);              //Botón Sumar Peso Max
+DigitalIn menosMax(p23);            //Botón Restar Peso Max
+DigitalIn masMin(p24);              //Botón Sumar Peso Min
+DigitalIn menosMin(p25);            //Botón Restar Peso Min
+
+DigitalIn sensorPiston(p26);        //Sensor Piston
+DigitalIn presenciaEntrada(p11);    //Sensor Entrada
+DigitalIn presenciaSalida(p12);     //Sensor Salida
+
+//Escribimos en el USB
+void escribirUSB(int peso)
+{
+    FILE *fp = fopen( "/" FSNAME "/basculapesos.txt", "a");
+    fprintf(fp, "%d \r\n", peso);
+    fclose(fp); 
+    }
+
+//Iniciamos los led auxiliares.
+void iniciaAux()
+{
+    ledAux1 = 0;
+    ledAux2 = 0;
+    ledAux3 = 0;
+    }
+//leemos de memoria flash la variable del peso minimo de clasificacion.
+int leeMinMem()
+{
+    LocalFileSystem local("local");       // Create the local filesystem under the name "local"
+    FILE *fp = fopen("/local/MIN", "r");  // Open "out.txt" on the local file system for writing
+    char buffer [10];
+    int minim;
+    fgets(buffer,10,fp);
+    fclose(fp);
+    minim=atoi(buffer);
+    return minim;
+    }
+
+//leemos de memoria flash la variable del peso maximo de clasificacion.
+int leeMaxMem()
+{
+    LocalFileSystem local("local");       // Create the local filesystem under the name "local"
+    FILE *fp1 = fopen("/local/MAX", "r");  // Open "out.txt" on the local file system for writing
+    char buffer1 [10];
+    int max;
+    fgets(buffer1,10,fp1);
+    fclose(fp1);
+    max=atoi(buffer1);
+    return max;
+    }
+
+//Iniciamos pesos Max y Min
+int pesoMax = leeMaxMem();
+int pesoMin = leeMinMem();
+
+
+//Iniciamos I2C Communication
+I2C i2c_lcd(p28,p27); // SDA, SCL
+TextLCD_I2C lcd(&i2c_lcd, 0x4E, TextLCD::LCD16x2, TextLCD::HD44780); // I2C bus, PCF8574 Slaveaddress, LCD Type, Device Type
 
 //Iniciamos el LCD.
-void iniciaLCD(){
+void iniciaLCD()
+{
     lcd.setMode(TextLCD::DispOn); //DispOff, DispOn
     lcd.setBacklight(TextLCD::LightOff);//LightOff, LightOn
     lcd.setCursor(TextLCD::CurOff_BlkOff);//CurOff_BlkOff, CurOn_BlkOff, CurOff_BlkOn, CurOn_BlkOn
+}
+
+//Pintamos en el LCD linea 1.
+void pintaLCD1(bool manual){
+    if (manual){
+        lcd.locate(0,0);
+        lcd.printf("     MANUAL     ");
+        }
+        else{
+            lcd.locate(0,0);
+            lcd.printf("Salida1  Salida2");
+            }
     }
+    
+//Pintamos en el LCD linea 2.
+void pintaLCD2(){
+    lcd.locate(0,1);
+    lcd.printf("<%dKg. ", pesoMin);
+    lcd.locate(7,1);
+    lcd.printf("  >%dKg.", pesoMax);
+}
 
 int leerPeso(){
-    char buffer1[100];
-    string pesoss;
-    int ipesoss;
-    serialBascula.printf("2005002D:<CR><LF>\n");   //\r\n
-        if (serialBascula.readable()==true){
-            //serialBascula.gets(buffer1,20);        
-            pesoss = serialBascula.gets(buffer1,40);
-            pesoss = pesoss.substr(10,4);
-            strcpy(buffer1, pesoss.c_str());
-            ipesoss = atoi(buffer1);
-        }
-        return ipesoss;
+    char buffer1[30];
+    string pesoss ="";
+    int ipesoss =0;
+    serialBascula.printf("2005002D:<CR><LF>\n");   //\r\n   2005002D:<CR><LF>\n
+        
+    pesoss = serialBascula.gets(buffer1,30);
+    if (buffer1[0]=='9'){
+        pesoss = pesoss.substr(11,3);
+        ipesoss = atoi(pesoss.c_str());
+    }   
+             
+    return ipesoss; 
+}
+
+void escribeMaxMem(int i)
+{
+    LocalFileSystem local("local");       // Create the local filesystem under the name "local"
+    FILE *fp = fopen("/local/max", "w");  // Open "out.txt" on the local file system for writing
+    char buffer [10];
+    sprintf (buffer, "%d", i);
+    fprintf(fp, buffer);
+    fclose(fp);
     }
     
+void escribeMinMem(int i)
+{
+    LocalFileSystem local("local");       // Create the local filesystem under the name "local"
+    FILE *fp = fopen("/local/min", "w");  // Open "out.txt" on the local file system for writing
+    char buffer [10];
+    sprintf (buffer, "%d", i);
+    fprintf(fp, buffer);
+    fclose(fp);
+    }
+
+void cambioManual()
+{
+    if (ledManual == 1){
+        //reescribimos el dato en MAX y MIN al volver de manual por si se ha cambiado
+        escribeMaxMem(pesoMax);
+        escribeMinMem(pesoMin);
+        ledManual = 0;
+        pintaLCD1(0);
+        wait(0.50);
+    }
+    else{
+        ledManual = 1;
+        pintaLCD1(1);
+        wait(0.50);
+    }
+}
+
+    
 //Main, aqui ponemos todo el programa.
-int main(){
-    Serial pc(USBTX, USBRX);    
+int main()
+{
+    Serial pc(USBTX, USBRX);
     iniciaLCD(); //Iniciamos el LCD
+    pintaLCD1(0);
+    pintaLCD2();
     int pesoreal;
+    //int estaPesado; //si esta pesado 1, si no esta pesado 0 
 
-    while(1){
-        pesoreal = leerPeso();
-            lcd.locate(5,1);
-            lcd.printf("%d", pesoreal);
-        wait(1);
+    while(1) {
+        //Modo manual: se pueden cambiar pesos y mover las puertas
+        while(ledManual == 1)
+        {
+            if (manual == 1)
+            {
+                cambioManual();}
+            if (entrada == 1)
+            {
+                if(ledEntrada == 1)
+                    {
+                        ledEntrada = 0;
+                        wait(0.50);
+                        }
+                    else
+                    {
+                        ledEntrada = 1;
+                        wait(0.50);
+                        }
+                }
+            if (salida == 1)
+            {
+                if(ledSalida == 1)
+                    {
+                        ledSalida = 0;
+                        wait(0.50);
+                        }
+                    else
+                    {
+                        ledSalida = 1;
+                        wait(0.50);
+                        }
+                }
+            if (izquierda == 1)
+            {
+                ledIzquierda = 1;
+                wait(0.50);
+                ledIzquierda = 0;
+                }
+            if (derecha == 1)
+            {
+                if(ledDerecha == 1)
+                    {
+                        ledDerecha = 0;
+                        wait(0.50);
+                        }
+                    else
+                    {
+                        ledDerecha = 1;
+                        wait(0.50);
+                        }
+                }
+            if (masMax == 1)
+            {
+                if (pesoMax < 2000)
+                    {
+                        pesoMax += 1;
+                        wait(0.10);
+                        pintaLCD2();
+                        }
+                }
+            if (menosMax == 1)
+            {
+                    if (pesoMax > (pesoMin + 1))
+                        {
+                            pesoMax -= 1;
+                            wait(0.10);
+                            pintaLCD2();
+                            }
+                }
+            if (masMin == 1)
+            {   
+                if(pesoMin < (pesoMax - 1))
+                    {
+                        pesoMin += 1;
+                        wait(0.10);
+                        pintaLCD2();
+                        }
+                }
+            if (menosMin == 1)
+                {if(pesoMin > 10)
+                    {
+                        pesoMin -= 1;
+                        wait(0.10);
+                        pintaLCD2();
+                        }
+                }
         }
-    //rfid.printf("20050025:<CR><LF>");
-    //pc.printf("%s",rfid.getc());
-    //el problema viene cuando se intenta llamar a la funcion que devuelve el peso. a veces da error porque el peso no se puede cast-ear a int. No se poque ocurre este error ni como solventarlo.
-    //voy a mirar el tema en C++
-    }
\ No newline at end of file
+        //empezamos el programa
+        ledEntrada = 1;
+        ledSalida = 1;
+        ledDerecha = 0;
+        ledIzquierda = 0;
+        pesoreal = 0;
+        saleBicho = 0;
+        if (manual == 1){
+            cambioManual();
+        }
+        
+        //Bucle de entrada a la báscula y funcionamiento real
+        wait(0.2);
+        int tiempoSinSensorPiston = 0;
+        while(presenciaEntrada == 1 && ledManual == 0){
+            ledEntrada = 0;
+            //Se Comprueba que el bicho no ha salido para no mover la puerta de salida
+            if (saleBicho == 0){
+                ledSalida = 0;
+            }
+            //Se comprueba que no se cambia a manual
+            if (manual == 1){cambioManual();}
+            wait(1);
+            if(sensorPiston == 1){
+                //Tiempo a esperar para que la bascula calcule el liveWeitgh
+                int tiempoLectura = 0;
+                //Bucle de espera para obtener el peso (3,5 s)
+                while(tiempoLectura < 40 && ledManual == 0 && presenciaEntrada == 1){
+                    wait(0.1);
+                    if (manual == 1){cambioManual();}
+                        tiempoLectura++;
+                }
+                if (saleBicho == 0){
+                    pesoreal = leerPeso();
+                    //estaPesado = 1;
+                    wait(0.8);
+                }
+                //Comprobamos el pero obtenido para clasificar o salir
+                if (pesoreal < 50000 && ledManual == 0 && presenciaEntrada == 1){
+                    if (pesoreal > pesoMin && saleBicho == 0){
+                        ledDerecha = 1;
+                        //escribimos el peso real en el USB
+                        //escribirUSB(pesoreal);
+                        if (pesoreal < pesoMax){
+                            ledIzquierda = 1;
+                            wait(0.5);
+                            ledIzquierda = 0;
+                        }
+                        wait(0.50);
+                    }
+                    wait(0.1);
+                    if(ledManual == 0){
+                        ledSalida = 1;
+                    }
+                    saleBicho = 1;
+                }
+            }
+            //Else del if del sensor del piston
+            else{
+                tiempoSinSensorPiston = tiempoSinSensorPiston +1;
+                wait(0.5);
+                if (tiempoSinSensorPiston > 10){
+                    ledEntrada = 1;
+                    wait(2);
+                }
+            }
+        }  
+    }
+}
\ No newline at end of file