#include "main.h"
#include "pulso.h"
#define DEBUG false // Modo de depuração
#define NUM_PULSOS 100 // Define o tempo de execução do sinal
#define CONTAGEM_GERADOR 20 // Contador de inicio do gerador (20 * 500 ms = 10 segundos)
#define TEMPO_HIGH 2 // Define o tempo do sinal ALTO
#define TEMPO_LOW 36 // Define o tempo do sinal BAIXO
#define PINO_PWM_1 PA11 // Define o pino de saída do PWM
#define PINO_START PA12 // Define o pino de acionamento
#define PINO_LED PA15 // Define o pino de saída do LED
// Define a quantidade de pinos com saida PWM
const uint8_t NR_PINOS = 1;
int novoTempo = 0;
int contadorIniciaGerador = 0;
bool iniciaGerador = false;
bool verificaNovoTempo = false;
bool setaNovoTempo = false;
bool pulsoInicioGerador = false;
bool inverteSinalizador = false;
String tempoRecebido = "";
// Cria matriz de pulsos ------------------------------------------------------
// Pulso(pino, tTIME_HIGH, tTIME_LOW)
Pulso pulsos[NR_PINOS] {
Pulso(PINO_PWM_1, TEMPO_HIGH, TEMPO_LOW),
};
void setup()
{
#if DEBUG
Serial.begin(115200);
Serial.println(" COMANDOS GERADOR DE PULSOS ");
Serial.println("**********************************************");
Serial.println("start - Inicia o gerador de pulsos ");
Serial.println("time - Muda o tempo do sinal ");
Serial.println("**********************************************");
#endif
// Configura porta de inicialização
pinMode(PINO_START, INPUT_PULLDOWN);
// Configura porta de sinalização
pinMode(PINO_LED, OUTPUT);
digitalWrite(PINO_LED, LOW);
}
void loop()
{
#if DEBUG
iniciaSerial();
#endif
verificaPulsoInicio();
processaGerador();
}
void verificaPulsoInicio()
{
// Verifica pulso de inicialização
if ((!pulsoInicioGerador) && (!iniciaGerador) &&
(digitalRead(PINO_START) == HIGH)) {
pulsoInicioGerador = true;
}
// Verifica tempo para iniciar o gerador
if (pulsoInicioGerador) {
// Incrementa contador de inicio do gerador
contadorIniciaGerador++;
// Verifica contagem de inicio do gerador
if (contadorIniciaGerador >= CONTAGEM_GERADOR) {
// Desativa flag usada para aguardar o inicio do gerador
pulsoInicioGerador = false;
// Reseta o contador
contadorIniciaGerador = 0;
// Seta flag para iniciar o gerador
iniciaGerador = true;
}
}
}
void iniciaSerial()
{
if (!iniciaGerador) {
verificaSerial();
configuraNovoTempo(setaNovoTempo);
}
}
void processaGerador()
{
// Verifica flag de inicio
if (iniciaGerador) {
// Processa o controle do pulso
pulsos[0].processar();
// Inverte estado do sinalizador
inverteSinalizador = !inverteSinalizador;
// Estado do sinalizador de contagem
digitalWrite(PINO_LED, inverteSinalizador);
// Verifica número de pulsos
if (pulsos[0].contador() >= NUM_PULSOS) {
// Desativa o gerador de pulsos
iniciaGerador = false;
delay(3);
// Coloca em nível baixo
pulsos->setaParaLow();
// Coloca o sinalizador em nível baixo (desligado)
digitalWrite(PINO_LED, LOW);
#if DEBUG
Serial.println("Termino do Sinal Gerado");
Serial.println();
#endif
}
}
}
void verificaSerial()
{
// Lê toda string recebida
String buffer = leituraSerial();
if (buffer.compareTo("start")) {
iniciaGerador = true;
#if DEBUG
Serial.println("Gerando sinal...");
Serial.println();
#endif
}
if (buffer.compareTo("time")) {
// Seta flag de verificação
verificaNovoTempo = true;
#if DEBUG
Serial.println("Qual o novo tempo? (em milisegundos)");
Serial.println();
#endif
// Desativa as flags
iniciaGerador = false;
// Aguarda enquanto a flag for verdadeira
while (verificaNovoTempo) {
// Retorna o tempo recebido da serial
tempoRecebido = leituraSerial();
novoTempo = tempoRecebido.toInt();
// Valida se é maior que zero
if (novoTempo > 0) {
verificaNovoTempo = false;
setaNovoTempo = true;
}
}
}
}
void configuraNovoTempo(bool tempo)
{
if (tempo) {
pulsos->modifica(novoTempo);
setaNovoTempo = false;
#if DEBUG
Serial.println("Novo tempo configurado");
Serial.println();
#endif
}
}
String leituraSerial()
{
String buffer = "";
#if DEBUG
char caractere;
// Enquanto receber algo pela serial
while (Serial.available() > 0) {
// Lê byte da serial
caractere = Serial.read();
// Ignora caractere de quebra de linha
if (caractere != '\n') {
// Concatena valores
buffer.concat(caractere);
}
// Aguarda buffer serial ler próximo caractere
delay(1);
}
#endif
return buffer;
}
Loading
stm32-bluepill
stm32-bluepill