Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
main.cpp
- Committer:
- itbusch
- Date:
- 2022-02-23
- Revision:
- 3:66c14c73bfdd
- Parent:
- 2:ce1e2d72919d
File content as of revision 3:66c14c73bfdd:
/* 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 TorOeffnen(PA_1);
DigitalIn TorSchliessen(PA_6);
InterruptIn Lichtschranke(PA_10);
DigitalIn EndschalterOffen(PB_0);
DigitalIn EndschalterZu(PB_3);
PwmOut heben(PC_6);
PwmOut senken(PC_7);
AnalogIn Poti(PA_0);
DigitalOut Leuchte(PC_0);
int zustand=Init;
float tastgrad;
string meldung[]={"Tor-offen","Tor-zu","Tor-gestoppt","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 initTimer()
{
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 oeffnen()
{
senken=0;
heben=Poti;
}
void schliessen()
{
heben=0;
senken=Poti;
}
void lcdOut(int nr)
{
mylcd.clear();
mylcd.cursorpos(0);
mylcd.printf("%s",meldung[nr].c_str());
}
void motorstop()
{
heben=0;
senken=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()
{
TorOeffnen.mode(PullDown);
TorSchliessen.mode(PullDown);
Lichtschranke.mode(PullDown);
EndschalterOffen.mode(PullDown);
EndschalterZu.mode(PullDown);
Lichtschranke.fall(&schnellstop);
Lichtschranke.enable_irq();
heben.period_us(100);
senken.period_us(100);
initTimer();
}
int main()
{
init();
zustand=Geschlossen;
motorstop();
lcdOut(1);
while (true) {
switch(zustand)
{
case Geschlossen: if (TorOeffnen==1)
{
zustand=Oeffnen;
blinkenEin();
lcdOut(3);
}
break;
case Oeffnen:
oeffnen();
if (EndschalterOffen==1)
{
blinkenAus();
zustand=Offen;
motorstop();
lcdOut(0);
}
break;
case Offen: if (TorSchliessen==1)
{
zustand=Schliessen;
blinkenEin();
lcdOut(3);
}
break;
case Schliessen:
schliessen();
if (EndschalterZu==1)
{
zustand=Geschlossen;
lcdOut(1);
motorstop();
blinkenAus();
}
break;
case Gestoppt:
motorstop();
if (TorOeffnen==1)
{
lcdOut(3);
zustand=Oeffnen;
blinkenEin();
normaleFrequenz();
}
if (TorSchliessen==1)
{
lcdOut(3);
zustand=Schliessen;
blinkenEin();
normaleFrequenz();
}
break;
}
HAL_Delay(20);
}
}