Robótica Livre
Gostaria de reagir a esta mensagem? Crie uma conta em poucos cliques ou inicie sessão para continuar.

Ir para baixo
Paulo Augusto Batista
Paulo Augusto Batista
Admin
Mensagens : 5039
Data de inscrição : 11/02/2019
Idade : 52
Escola : Colegio Lindaura
https://roboticalivre.forumeiros.com

Resolução do Exercício 3.18 Empty Resolução do Exercício 3.18

Sáb Nov 30, 2019 4:11 pm
Este exercício foi sendo desenvolvido após o intervalo e o tempo não foi hábil para concluí-lo.
Fizemos todo o raciocínio, fomos desenvolvendo a lógica, resolvendo as situações. Mas no final o programa ainda não funcionou plenamente.
Então como era para voces desenvolverem e acabamos iniciando o programa, esse vai servir de inspiração para que façam o de voces, ou corrijam esse apresentado.
Segue abaixo o código até agora.

Código:

/*
* CURSO DE ROBOTICA 2019
*
* Exercicio: 3.18
* Tema: Brilho do Led pelo terminal
* Atividade: Usar os numeros recebidos pelo terminal para comandar os leds e informa o status no display
* Descrição: Receber os caracteres pela serial, converter os dados recebidos como caractere em seu valor numerico. Exemplo recebe o ASCII - 49 e converte para valor 1
* Hardware: Display ligado RS=>pino D12; EN=>pino D13; D4=>pino D4; D5=>pino D5; D6=>pino D6; D7=>pino D7, o terminal usa a porta USB do arduino, o LED deve estar numa saida PWM
* Comandos: Serial.begin(9600); lcd.print(); Serial.available(); Serial.print();
* Dica1: A configuração da serial usa velocidade padrão de 9600, poderia ser alterado caso necessite maior performance
* Dica2: Na interface do arduino abrir o terminal em ferramentas - Monitor serial ou ctr+shift+M
* Dica3: Enviar para o terminal \n para nova linha ou \r para retorno de carro
* Dica4: na tabela ASCII os numeros são assim: 0=48;1=49;2=50;3=51;4=52;5=53;6=54;7=55;8=56;9=57
* Dica5: Uma forma simples de chegar ao valor numerico é subtrair o valor recebido de 48, o resultado é igual ao numero recebido
* Dica6: A função Serial.available(); retorna a quantidade de bytes no buffer, carregar uma rotina for() e recuperar os dados
* Dica7: Para recuperar o numero pode usar exponenciação base 10, pois na primeira volta 10exp0=1, 10exp1=10, 10exp2=100 , vezes o numero recebido. A soma desses valores é o numero digitado
* Dica8: Para controlar o brilho do LED o valor recebido deve estar entre 0 e 255
* Dica9: Checar se o valor enviado está correto e enviar mensagem de erro se os valores não forem numeros
*/

//DEFINICOES INICIAIS
#include <LiquidCrystal.h>
#define led 9 //led no pino 9 PWM

//DECLARAcAO DE VARIAVEIS GLOBAIS
int char1; //primeiro caractere recebido , centena
int char2; //dezena
int char3; //unidade
byte brilho;
byte erro = 0; //deu erro se igual a 1
byte brilhoAnt; //backup do brilho
lcd LiquidCrystal(7,6,5,4,3,2);

//INICIALIZAÇÃO DO HARDWARE
void setup() {
pinMode(led, OUTPUT);
Serial.begin(9600);
lcd.begin(16,2);
}

//FUNÇÕES COMPLEMENTARES
void trataErro(){
  Serial.println("Número inválido, digite novamente!");
  Serial.print("precisa ser 3 caracteres numéricos entre 0 e 255");
  Serial.flush(); //esvazia o buffer
  char1 = char2 = char3 = 0; //reinicia as variaveis porque deu erro
  erro = 1; //informa ao programa que houve um erro
 
}

//PROGRAMA PRINCIPAL
void loop() {
if(Serial.available()>3)trataErro();
if(Serial.available()=3){
  char1=Serial.read()-48;
  if(char1<0||char1>2)trataErro();
  char1 *= 100;
  char2=Serial.read()-48;
  if(char2<0||char2>9)trataErro();
  if(char1==2&&char2>5)trataErro();
  char2*=10; //recupera a dezena
  char3=Serial.read()-48;
  if(char3<0||char3>9)trataErro();
  if(char1==2&&char2==5&&char3>5)trataErro();
  brilho = char1 + char2 + char3;
  if(erro){
    brilho == brilhoAnt;
    erro = 0;
}
brilhoAnt = brilho;
analogWrite(led, brilhoAnt);
lcd.clear();
lcd.print(brilhoAnt);
setCursor(0,1);
lcd.print(brilho);
delay(300);
}
}
Ir para o topo
Permissões neste sub-fórum
Não podes responder a tópicos