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:
- lucasfontenla
- Date:
- 2019-05-06
- Revision:
- 1:a88dcc6beb9d
- Parent:
- 0:7e80907da2dc
File content as of revision 1:a88dcc6beb9d:
#include "mbed.h"
// estabelece a comunicação serial com o PC para debug
Serial pc(USBTX, USBRX);
// inicializa os botões como interrupções
InterruptIn botao_SW1(D2);
InterruptIn botao_SW2(D7);
// foram usados timers para fazer o debounce no click dos botões
Timer debounceSW1Fall;
Timer debounceSW2Fall;
Timer debounceSW1Rise;
Timer debounceSW2Rise;
// o timer de avanço serve para a função de acionamento automático do vidro
Timer avanco;
// leitura do shunt de corrente para identificar o esmagamento
AnalogIn Shunt(A5);
float Corrente;
// as saídas servem para acionar o motor do vidro na direção especificada
DigitalOut saida_IN1(D10);
DigitalOut saida_IN2(D8);
DigitalOut saida_EN(D9);
bool SW1 = 1;
bool SW2 = 1;
bool IN1 = 0;
bool IN2 = 0;
// as funções abaixo estabelecem o comportamento do programa ao serem identificadas as interrupções.
// em linhas gerais, é feito o debounce através delas, e alterados os valores de variáveis que
// identificam a ação do usuário.
void DSW1Fall(){
if (debounceSW1Fall.read_ms() > 200) {
SW1 = 0;
debounceSW1Fall.reset();
pc.printf("DSW1Fall \n\r");
avanco.start();
}
}
void DSW2Fall(){
if (debounceSW2Fall.read_ms() > 200) {
SW2 = 0;
debounceSW2Fall.reset();
pc.printf("DSW2Fall \n\r");
}
}
void DSW1Rise(){
if (debounceSW1Rise.read_ms() > 200) {
if(avanco.read_ms() >= 500) {
avanco.stop();
avanco.reset();
}
// a função avanço mantém a variável verdadeira sem a necessidade do click no botão
else if(avanco.read_ms() < 500){
SW1 = 1;
}
debounceSW1Rise.reset();
pc.printf("DSW1Rise \n\r");
}
}
void DSW2Rise(){
if (debounceSW2Rise.read_ms() > 200) {
SW2 = 1;
debounceSW2Rise.reset();
pc.printf("DSW2Rise \n\r");
}
}
int main() {
// attach das funções de debounce
debounceSW1Fall.start();
debounceSW2Fall.start();
debounceSW1Rise.start();
debounceSW2Rise.start();
botao_SW1.rise(&DSW1Rise);
botao_SW1.fall(&DSW1Fall);
botao_SW2.rise(&DSW2Rise);
botao_SW2.fall(&DSW2Fall);
while(1){
// aquisita o valor de corrente do motor
Corrente = 3.3f*Shunt;
// se a corrente observada for maior que o limite estabelecido,
// recua por 200ms, suficiente para evitar o esmagamento
if (Corrente > 0.7f){
if (IN1 && !IN2){
saida_IN1 = IN2;
saida_IN2 = IN1;
wait_ms(250);
}
else if (IN2 && !IN1){
saida_IN1 = IN2;
saida_IN2 = IN1;
wait_ms(250);
}
saida_IN1 = 0;
saida_IN2 = 0;
SW1 = 1;
SW2 = 1;
wait_ms(1000);
}
// se a chave 1 for idntificada, o motor recua
if (SW1 == 0){
IN1 = 1; IN2 = 0;
saida_EN = 1;
saida_IN1 = IN1;
saida_IN2 = IN2;
wait(0.01);
}
// se a chave 2 for identificada, o motor avança
else if (SW2 == 0){
IN1 = 0; IN2 = 1;
saida_EN = 1;
saida_IN1 = IN1;
saida_IN2 = IN2;
wait(0.01);
}
// caso nenhuma ação seja tomada, nada é movimentado
else {
IN1 = 0; IN2 = 0;
saida_EN = 0;
saida_IN1 = IN1;
saida_IN2 = IN2;
wait(0.01);
}
wait(0.01);
}
}