Lehrer Busch / Mbed OS xxx_Garagentor

Dependencies:   LCD_i2c_GSOE

main.cpp

Committer:
jack1930
Date:
2021-07-01
Revision:
1:73315e249185
Parent:
0:763fd05f2a27
Child:
2:ce1e2d72919d

File content as of revision 1:73315e249185:

/* mbed Microcontroller Library
 * Copyright (c) 2019 ARM Limited
 * SPDX-License-Identifier: Apache-2.0
 */

#include "mbed.h"
#include "platform/mbed_thread.h"
#include "LCD.h"
#include <string>


// Blinking rate in milliseconds
#define BLINKING_RATE_MS                                                    500

#define Init 0
#define Geschlossen 1
#define Oeffnen 2
#define Offen 3
#define Schliessen 4
#define Gestoppt 5
lcd mylcd;
DigitalIn TorAuf(PA_1);
DigitalIn TorZu(PA_6);
InterruptIn Stop(PA_10);
DigitalIn EndschalterOffen(PB_0);
DigitalIn EndschalterZu(PB_3);
PwmOut CW(PC_6);
PwmOut CCW(PC_7);
AnalogIn Poti(PA_0);
DigitalOut Leuchte(PC_0);

int zustand=Init;
float tastgrad;
string meldung[]={"Tor-auf","Tor-zu","Tor-stop","Tor-faehrt"};

void blinkenEin()
{
    TIM6->CR1=1;
}

void blinkenAus()
{
    TIM6->CR1=0;
    Leuchte=0;
}

void isr_Timer()
{
    Leuchte=!Leuchte;  
    HAL_NVIC_ClearPendingIRQ(TIM6_IRQn); 
    TIM6->SR=0;
}

void Timer_init()
{
   RCC->APB1ENR |= 0b10000; //TIM6
   TIM6->PSC=31999; //1ms 
   TIM6->ARR=499;   //500ms
   TIM6->CNT=0;     //Counter startet bei 0
   TIM6->SR=0;      //UIF =0
   TIM6->DIER=1;    //Interrupt Freigabe
   NVIC_SetVector(TIM6_IRQn,(uint32_t)&isr_Timer);
   HAL_NVIC_EnableIRQ(TIM6_IRQn);
   __enable_irq();  
}

void torAufCW()
{
    CCW=0;
    CW=Poti;
}

void torZuCCW()
{
    CW=0;
    CCW=Poti;
}

void lcdOut(int nr)
{
  mylcd.clear();
  mylcd.cursorpos(0);
  mylcd.printf("%s",meldung[nr].c_str());   
}

void motorstop()
{
    CW=0;
    CCW=0; 
}

void normaleFrequenz()
{
  TIM6->ARR=499;   //500ms  
}

void doppelteFrequenz()
{
   TIM6->CNT=0;     //Counter startet bei 0  
   TIM6->ARR=249;   //250ms
  
}
void schnellstop()
{
    if (zustand==Schliessen || zustand==Oeffnen)
    {
       zustand=Gestoppt;
       lcdOut(2); 
       doppelteFrequenz();
    }
}

void init()
{
    TorAuf.mode(PullDown);
    TorZu.mode(PullDown);
    Stop.mode(PullDown);
    EndschalterOffen.mode(PullDown);
    EndschalterZu.mode(PullDown);
    Stop.fall(&schnellstop);
    Stop.enable_irq();
    CW.period_us(100);
    CCW.period_us(100);
    Timer_init();
    
}


int main()
{
    init();
    zustand=Geschlossen;
    motorstop();
    lcdOut(1);
    while (true) {
     switch(zustand)
        {
        case Geschlossen: if (TorAuf==1)
                {                 
                 zustand=Oeffnen;
                 blinkenEin();
                 lcdOut(3);
                }
                break;
        case Oeffnen: 
              torAufCW();
              if (EndschalterOffen==1)
              {
                  blinkenAus();
                  zustand=Offen;
                  motorstop();
                  lcdOut(0);
              }
              break;
        case Offen: if (TorZu==1)
                {
                zustand=Schliessen;
                blinkenEin();
                lcdOut(3);
                }
                break;
        case Schliessen: 
                torZuCCW();
                if (EndschalterZu==1) 
                {
                    zustand=Geschlossen;
                    lcdOut(1);
                    motorstop();
                    blinkenAus();
                }
                break;
        case Gestoppt:
            motorstop();
            if (TorAuf==1)
                {
                 lcdOut(3);
                 zustand=Oeffnen;
                 blinkenEin();
                 normaleFrequenz();
                }
            if (TorZu==1)
                {
                lcdOut(3);
                zustand=Schliessen;
                blinkenEin();
                normaleFrequenz();
                }
                break;
        }
        HAL_Delay(20);
    }
}