Hugo's Programs / Mbed 2 deprecated MARCELO_PROJETC_VIDRO_TIMER

Dependencies:   mbed

Revision:
2:f1db1a25bf0f
Parent:
0:b5a9e0614efd
Child:
4:2aa867a57a02
diff -r b66c5cfa5d8f -r f1db1a25bf0f main.cpp
--- a/main.cpp	Thu Feb 21 17:06:56 2013 +0000
+++ b/main.cpp	Thu Feb 28 11:32:57 2019 +0000
@@ -1,12 +1,168 @@
 #include "mbed.h"
 
-DigitalOut myled(LED1);
+#define filtro 10  
+
+
+//-----------Pinos de saida (output)---------------
+DigitalOut  controlLED(LED2); 
+DigitalOut  IN1A(D10);
+DigitalOut  IN2A(D8);
+DigitalOut  EN_A(D9);
+
+//----------Pinos de entrada analogica (ADC)------
+AnalogIn    SHUNT(A5);
+
+//----------Pinos de interrupção externa----------
+InterruptIn UP(D7);
+InterruptIn DOWN(D2);
+
+//---------Declaração de timers-------------------
+Timer timer;
+
+//---------Declaração de comunicação serial-------
+Serial pc(USBTX, USBRX);
+
+//---------Declaração de variaveis----------------
+bool flag = 0;
+float CURRENT[filtro];
+float media = 0;
+int i = 0;
+
+//---------Rotina para dar inicio ao processo de debounce-------------
+void bounce()
+{
+    timer.start();
+}
+
+//---------Rotina para dar fim ao processo de debounce----------------
+void stop_timer()
+{
+    timer.stop();
+    timer.reset();
+}
+
+//-------Rotina para setar os pinos na direção de fechar o vidro-------
+void close()
+{
+    IN1A = 0;
+    IN2A = 1;
+    EN_A = 1;
+}
+
+//-------Rotina para setar os pinos na direção de abrir o vidro--------
+void open()
+{
+    IN1A = 1;
+    IN2A = 0;
+    EN_A = 1;
+}
+
+//-------Rotina para setar os pinos para parar o vidro--------
+void stop()
+{
+    IN1A = 0;
+    IN2A = 0;
+    EN_A = 0;
+}
 
-int main() {
-    while(1) {
-        myled = 1;
-        wait(0.2);
-        myled = 0;
-        wait(0.2);
+int main() 
+{
+    //----Especificando as bordas das interrupções, e o endereço das rotinas que serão chamadas---
+    UP.fall(&bounce); 
+    DOWN.fall(&bounce); 
+    UP.rise(&stop_timer); 
+    DOWN.rise(&stop_timer); 
+    
+    //------------debug para saber se o uC iniciou/travou-------------
+    pc.printf("\n\riniciando");
+    controlLED = 1;
+    wait(0.5);
+    controlLED = 0;
+    stop();
+    
+    while(1) 
+    {
+        //-----bloqueio da variavel i, para que não tenha mais de 10 iterações----
+        if(i > filtro - 1)
+        {
+            i = 0;
+        }
+        
+        //----Leitura da corrente e amarzenamento do valor no buffer--------------
+        CURRENT[i] = SHUNT.read();
+        i++;
+        
+        //----Integração dos valores de corrente, para fazer filtro do tipo "media movel"
+        for(int j=0; j<filtro; j++)
+        {
+            media += CURRENT[j];
+        }
+        
+        //------Calculando a media-----------------------------------------------
+        media = media / filtro;
+        
+        //------Conversão do valor para a unidade de ampere--------------------
+        media = media * 3.0f;
+        
+        //------Multiplicador do valor por conta do shunt de 0R1--------------------
+        //media = media * 10;
+
+        //-----Condição que tenha apertado o botão rapidamente----------------
+        //clique rapido, para subir/descer o vidro por uma curta distancia
+        if((timer.read() > 0.1f) && (timer.read() < 0.6f))
+        {
+                if(DOWN == 0)
+                {
+                    pc.printf("\n\rdown rapido");
+                    open();
+                    wait(0.6f);
+                    if(DOWN == 1)//se soltou o botão, comanda a parada
+                    {
+                        stop();
+                    }
+                    
+                }
+                
+                if(UP == 0)
+                {
+                    pc.printf("\n\rup rapido");
+                    close();
+                    wait(0.6f);
+                    if(UP == 1)//se soltou o botão, comanda a parada
+                    {
+                        stop();
+                    }
+                    
+                }
+        }
+        
+        //-----Condição que tenha apertado o botão por mais de um segundo----------------
+        //clique lento, para subir/descer o vidro por todo o trajeto
+        if(timer.read() > 1.0f)
+        {
+                if(DOWN == 0)
+                {
+                    pc.printf("\n\rdown lento");
+                    open();
+                }
+                
+                if(UP == 0)
+                {
+                    pc.printf("\n\rup lento");
+                    close();
+                }
+        }
+        //wait(0.1);
+        //pc.printf("\n\rCorrente de %f Amperes", media);
+        //----Rotina para parar o vidro caso a corrente suba, é a rotina que será fim-de-curso e sistema anti-esmagamento------
+        if(media > 1.0f)
+        {  
+            wait(0.3);
+            if(media > 1.0f)
+            {              
+                stop();
+                pc.printf("\n\rCORTE");
+            }
+        }        
     }
 }