exercicio 4.10
2 participantes
- gustavocruz
- Mensagens : 256
Data de inscrição : 12/05/2019
Idade : 16
exercicio 4.10
Qua Ago 24, 2022 3:28 pm
/*
* CURSO DE ROBOTICA 2021
*
* Exercicio: 4.10
* Tema: Calculadora Simples usando atoi()
* Atividade: Receber do terminal os caracteres, armazenar em string, converter para int e apresentar vezes 2 (dobro) e dividido por 2 (metade)
* Descrição: Receber o caractere pela serial, checar se é um número, oconverter o numero recebido usando a função atoi(), calcular e apresentar o resultado no terminal.
* Hardware: porta serial, pinos digitais para os LEDS
* Comandos: Serial.begin(9600); Serial.available(); Serial.read(), atoi()
* 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: Checar se os valores recebidos são numeros, se não forem enviar mensagem de erro e acender led vermelho, se der certo acende led verde
* Dica5: a função inteiro = atoi(string) Converte uma string com caracteres numericos em um numero inteiro
* Dica6: Após converter a string em inteiro, calcular o dobro e metade, enviar o valor para o terminal
* * Abaixo Funções de testes de caracteres, retorna 0 se a extressão for falsa; outro valor maior que 0 (zero) se for verdadeiro
* isalnum(char) Verifica se o caractere é alfanumérico (letra e número)
* isalpha(char) Verifica se o caractere é uma letra
* iscntrl(char) Verifica se o caractere é um caractere de controle https://pt.wikipedia.org/wiki/ASCII
* isdigit(char) Verifica se o caractere é um a letra
* isgraph(char) Verifica se o caractere é um caractere gráfico
* islower(char) Verifica se o caracteres é uma letra minúscula
* isprint(char) Verifica se o caractere é imprimível
* isalnum(char) Verifica se o caractere é alfanumérico
* ispunct(char) Verifica se o caractere é um caractere de pontuação
* isspace(char) Verifica se o caractere é um espaço em branco
* isupper(char) Verifica se o caractere é uma letra maiúscula
* isdigit(char) Verifica se o caractere é um caractere decimal (0-9)
* isxdigit(char) Verifica se o caractere é um caractere hexadecimal (0-9 ou A-F)
* ispunct(char) Verifica se o caractere é um caractere de pontuação
* * Abaixo Funções para manipular caracteres
* tolower(char) Converte o caractere para letra minúscula
* toupper(char) Converte o caractere para letra maiúscula
* atoi(string) Converte uma string com caracteres numericos em um numero inteiro se retornar zero pode ter havido erro
* atof(string) Converte uma string em um double se retornar zero pode ter havido erro
* atol(string Converte uma string em um long se retornar zero pode ter havido erro
*/
//DEFINICOES INICIAIS
#define ledVerm 9 //led vermelho ligado no pino 9
#define ledVerde 10 //led verde ligado no pino 10
//DECLARAcAO DE VARIAVEIS GLOBAIS
char dadosRecebidos[6];
char item[2];
bool recebido = 0;
int fim;
//INICIALIZAÇÃO DO HARDWARE
void setup() {
Serial.begin(9600); //Inicializa a porta serial com velocidade de 9600
pinMode(ledVerm, OUTPUT);
pinMode(ledVerde, OUTPUT);
Serial.println ("Digite um número inteiro");
}
//FUNÇÕES COMPLEMENTARES
//PROGRAMA PRINCIPAL
void loop() {
if(Serial.available() || strlen(dadosRecebidos) >= 5){
item[0] = Serial.read();
if(item[0] = '\r') {
recebido = 1;
}else if(!isdigit(item[0])){
digitalWrite(ledVerm, HIGH);
Serial.print("\n");
Serial.println("Numero invalido");
dadosRecebidos[0] = '\0';
item[0] = '\0';
while(Serial.available()){
Serial.flush();
}
}else {
digitalWrite(ledVerde, HIGH);
digitalWrite(ledVerm, LOW);
strcat(dadosRecebidos, item);
}
if(recebido == 1){
digitalWrite(ledVerde, HIGH);
digitalWrite(ledVerm, LOW);
fim = atoi(dadosReccebidos);
Serial.print("O número recebido foi = ");
Serial.println(fim);
Serial.print("o dobro desse número é = ");
Serial.println(fim * 2);
Serial.print ("A metade desse número é = ");
Serial.println (fim / 2);
recebido = 0;
dadosRecebidos[0] = '\0';
item[0] = '\0';
Serial.println ("Digite um número inteiro");
}
}
}
* CURSO DE ROBOTICA 2021
*
* Exercicio: 4.10
* Tema: Calculadora Simples usando atoi()
* Atividade: Receber do terminal os caracteres, armazenar em string, converter para int e apresentar vezes 2 (dobro) e dividido por 2 (metade)
* Descrição: Receber o caractere pela serial, checar se é um número, oconverter o numero recebido usando a função atoi(), calcular e apresentar o resultado no terminal.
* Hardware: porta serial, pinos digitais para os LEDS
* Comandos: Serial.begin(9600); Serial.available(); Serial.read(), atoi()
* 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: Checar se os valores recebidos são numeros, se não forem enviar mensagem de erro e acender led vermelho, se der certo acende led verde
* Dica5: a função inteiro = atoi(string) Converte uma string com caracteres numericos em um numero inteiro
* Dica6: Após converter a string em inteiro, calcular o dobro e metade, enviar o valor para o terminal
* * Abaixo Funções de testes de caracteres, retorna 0 se a extressão for falsa; outro valor maior que 0 (zero) se for verdadeiro
* isalnum(char) Verifica se o caractere é alfanumérico (letra e número)
* isalpha(char) Verifica se o caractere é uma letra
* iscntrl(char) Verifica se o caractere é um caractere de controle https://pt.wikipedia.org/wiki/ASCII
* isdigit(char) Verifica se o caractere é um a letra
* isgraph(char) Verifica se o caractere é um caractere gráfico
* islower(char) Verifica se o caracteres é uma letra minúscula
* isprint(char) Verifica se o caractere é imprimível
* isalnum(char) Verifica se o caractere é alfanumérico
* ispunct(char) Verifica se o caractere é um caractere de pontuação
* isspace(char) Verifica se o caractere é um espaço em branco
* isupper(char) Verifica se o caractere é uma letra maiúscula
* isdigit(char) Verifica se o caractere é um caractere decimal (0-9)
* isxdigit(char) Verifica se o caractere é um caractere hexadecimal (0-9 ou A-F)
* ispunct(char) Verifica se o caractere é um caractere de pontuação
* * Abaixo Funções para manipular caracteres
* tolower(char) Converte o caractere para letra minúscula
* toupper(char) Converte o caractere para letra maiúscula
* atoi(string) Converte uma string com caracteres numericos em um numero inteiro se retornar zero pode ter havido erro
* atof(string) Converte uma string em um double se retornar zero pode ter havido erro
* atol(string Converte uma string em um long se retornar zero pode ter havido erro
*/
//DEFINICOES INICIAIS
#define ledVerm 9 //led vermelho ligado no pino 9
#define ledVerde 10 //led verde ligado no pino 10
//DECLARAcAO DE VARIAVEIS GLOBAIS
char dadosRecebidos[6];
char item[2];
bool recebido = 0;
int fim;
//INICIALIZAÇÃO DO HARDWARE
void setup() {
Serial.begin(9600); //Inicializa a porta serial com velocidade de 9600
pinMode(ledVerm, OUTPUT);
pinMode(ledVerde, OUTPUT);
Serial.println ("Digite um número inteiro");
}
//FUNÇÕES COMPLEMENTARES
//PROGRAMA PRINCIPAL
void loop() {
if(Serial.available() || strlen(dadosRecebidos) >= 5){
item[0] = Serial.read();
if(item[0] = '\r') {
recebido = 1;
}else if(!isdigit(item[0])){
digitalWrite(ledVerm, HIGH);
Serial.print("\n");
Serial.println("Numero invalido");
dadosRecebidos[0] = '\0';
item[0] = '\0';
while(Serial.available()){
Serial.flush();
}
}else {
digitalWrite(ledVerde, HIGH);
digitalWrite(ledVerm, LOW);
strcat(dadosRecebidos, item);
}
if(recebido == 1){
digitalWrite(ledVerde, HIGH);
digitalWrite(ledVerm, LOW);
fim = atoi(dadosReccebidos);
Serial.print("O número recebido foi = ");
Serial.println(fim);
Serial.print("o dobro desse número é = ");
Serial.println(fim * 2);
Serial.print ("A metade desse número é = ");
Serial.println (fim / 2);
recebido = 0;
dadosRecebidos[0] = '\0';
item[0] = '\0';
Serial.println ("Digite um número inteiro");
}
}
}
Re: exercicio 4.10
Ter Ago 30, 2022 9:40 pm
Oi Gustavo, tem uma serie de correções a fazer, veja abaixo
if(item[0] = 'r'){ //aqui deveria ser \r , caractere de retorno de carro que deve ser enviado pela serial
for(i = 0; i - 1 != Serial.available(); i++){ //esse for não faz sentido aqui, esta fazendo concatenação de strings, não usa for
strcat(item, dadosRecebidos); // aqui tem que colocar o ítem nos dados recebidos e não os dados no ítem
fim = atoi(item); //aqui também a conversão deve ser nos dadosRecebidos e não no ítem
Veja que recebe o caractere na string ítem , dai passa essas para os dadosRecebidos e deve usar essa string para converter para inteiro.
Faltam os comentários também
if(item[0] = 'r'){ //aqui deveria ser \r , caractere de retorno de carro que deve ser enviado pela serial
for(i = 0; i - 1 != Serial.available(); i++){ //esse for não faz sentido aqui, esta fazendo concatenação de strings, não usa for
strcat(item, dadosRecebidos); // aqui tem que colocar o ítem nos dados recebidos e não os dados no ítem
fim = atoi(item); //aqui também a conversão deve ser nos dadosRecebidos e não no ítem
Veja que recebe o caractere na string ítem , dai passa essas para os dadosRecebidos e deve usar essa string para converter para inteiro.
Faltam os comentários também
- gustavocruz
- Mensagens : 256
Data de inscrição : 12/05/2019
Idade : 16
Re: exercicio 4.10
Sáb Jun 24, 2023 11:05 am
/*
* CURSO DE ROBOTICA 2021
*
* Exercicio: 4.10
* Tema: Calculadora Simples usando atoi()
* Atividade: Receber do terminal os caracteres, armazenar em string, converter para int e apresentar vezes 2 (dobro) e dividido por 2 (metade)
* Descrição: Receber o caractere pela serial, checar se é um número, oconverter o numero recebido usando a função atoi(), calcular e apresentar o resultado no terminal.
* Hardware: porta serial, pinos digitais para os LEDS
* Comandos: Serial.begin(9600); Serial.available(); Serial.read(), atoi()
* 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: Checar se os valores recebidos são numeros, se não forem enviar mensagem de erro e acender led vermelho, se der certo acende led verde
* Dica5: a função inteiro = atoi(string) Converte uma string com caracteres numericos em um numero inteiro
* Dica6: Após converter a string em inteiro, calcular o dobro e metade, enviar o valor para o terminal
* * Abaixo Funções de testes de caracteres, retorna 0 se a extressão for falsa; outro valor maior que 0 (zero) se for verdadeiro
* isalnum(char) Verifica se o caractere é alfanumérico (letra e número)
* isalpha(char) Verifica se o caractere é uma letra
* iscntrl(char) Verifica se o caractere é um caractere de controle https://pt.wikipedia.org/wiki/ASCII
* isdigit(char) Verifica se o caractere é um a letra
* isgraph(char) Verifica se o caractere é um caractere gráfico
* islower(char) Verifica se o caracteres é uma letra minúscula
* isprint(char) Verifica se o caractere é imprimível
* isalnum(char) Verifica se o caractere é alfanumérico
* ispunct(char) Verifica se o caractere é um caractere de pontuação
* isspace(char) Verifica se o caractere é um espaço em branco
* isupper(char) Verifica se o caractere é uma letra maiúscula
* isdigit(char) Verifica se o caractere é um caractere decimal (0-9)
* isxdigit(char) Verifica se o caractere é um caractere hexadecimal (0-9 ou A-F)
* ispunct(char) Verifica se o caractere é um caractere de pontuação
* * Abaixo Funções para manipular caracteres
* tolower(char) Converte o caractere para letra minúscula
* toupper(char) Converte o caractere para letra maiúscula
* atoi(string) Converte uma string com caracteres numericos em um numero inteiro se retornar zero pode ter havido erro
* atof(string) Converte uma string em um double se retornar zero pode ter havido erro
* atol(string Converte uma string em um long se retornar zero pode ter havido erro
*/
//DEFINICOES INICIAIS
#define ledVerm 9 //led vermelho ligado no pino 9
#define ledVerde 10 //led verde ligado no pino 10
//DECLARAcAO DE VARIAVEIS GLOBAIS
char dadosRecebidos[6];
bool recebido = 0;
int fim;
//INICIALIZAÇÃO DO HARDWARE
void setup() {
Serial.begin(9600); //Inicializa a porta serial com velocidade de 9600
pinMode(ledVerm, OUTPUT);
pinMode(ledVerde, OUTPUT);
Serial.println ("Digite um numero inteiro");
}
//FUNÇÕES COMPLEMENTARES
//PROGRAMA PRINCIPAL
void loop() {
if(Serial.available()){
delay(1);
for(byte i = 0; i < 5; i++){
dadosRecebidos[i] = Serial.read();
delay(5);
}
if(Serial.available() == 0) {
recebido = 1;
}else {
digitalWrite(ledVerde, LOW);
digitalWrite(ledVerm, HIGH);
dadosRecebidos[0] = '\0';
recebido = 0;
Serial.println("Numeros invalidos");
while(Serial.available()){
Serial.read();
}
}
if(!isdigit(dadosRecebidos[0]) && recebido == 1){
digitalWrite(ledVerm, HIGH);
digitalWrite(ledVerde, LOW);
Serial.print("\n");
Serial.println("Nao e numero");
dadosRecebidos[0] = '\0';
recebido = 0;
}
if(recebido == 1){
digitalWrite(ledVerde, HIGH);
digitalWrite(ledVerm, LOW);
fim = atoi(dadosRecebidos);
Serial.print("O numero recebido foi = ");
Serial.println(fim);
Serial.print("o dobro desse numero = ");
Serial.println(fim * 2);
Serial.print ("A metade desse numero = ");
Serial.println (fim / 2);
recebido = 0;
dadosRecebidos[0] = '\0';
Serial.println(" ");
Serial.println ("Digite um numero inteiro");
}
}
}
* CURSO DE ROBOTICA 2021
*
* Exercicio: 4.10
* Tema: Calculadora Simples usando atoi()
* Atividade: Receber do terminal os caracteres, armazenar em string, converter para int e apresentar vezes 2 (dobro) e dividido por 2 (metade)
* Descrição: Receber o caractere pela serial, checar se é um número, oconverter o numero recebido usando a função atoi(), calcular e apresentar o resultado no terminal.
* Hardware: porta serial, pinos digitais para os LEDS
* Comandos: Serial.begin(9600); Serial.available(); Serial.read(), atoi()
* 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: Checar se os valores recebidos são numeros, se não forem enviar mensagem de erro e acender led vermelho, se der certo acende led verde
* Dica5: a função inteiro = atoi(string) Converte uma string com caracteres numericos em um numero inteiro
* Dica6: Após converter a string em inteiro, calcular o dobro e metade, enviar o valor para o terminal
* * Abaixo Funções de testes de caracteres, retorna 0 se a extressão for falsa; outro valor maior que 0 (zero) se for verdadeiro
* isalnum(char) Verifica se o caractere é alfanumérico (letra e número)
* isalpha(char) Verifica se o caractere é uma letra
* iscntrl(char) Verifica se o caractere é um caractere de controle https://pt.wikipedia.org/wiki/ASCII
* isdigit(char) Verifica se o caractere é um a letra
* isgraph(char) Verifica se o caractere é um caractere gráfico
* islower(char) Verifica se o caracteres é uma letra minúscula
* isprint(char) Verifica se o caractere é imprimível
* isalnum(char) Verifica se o caractere é alfanumérico
* ispunct(char) Verifica se o caractere é um caractere de pontuação
* isspace(char) Verifica se o caractere é um espaço em branco
* isupper(char) Verifica se o caractere é uma letra maiúscula
* isdigit(char) Verifica se o caractere é um caractere decimal (0-9)
* isxdigit(char) Verifica se o caractere é um caractere hexadecimal (0-9 ou A-F)
* ispunct(char) Verifica se o caractere é um caractere de pontuação
* * Abaixo Funções para manipular caracteres
* tolower(char) Converte o caractere para letra minúscula
* toupper(char) Converte o caractere para letra maiúscula
* atoi(string) Converte uma string com caracteres numericos em um numero inteiro se retornar zero pode ter havido erro
* atof(string) Converte uma string em um double se retornar zero pode ter havido erro
* atol(string Converte uma string em um long se retornar zero pode ter havido erro
*/
//DEFINICOES INICIAIS
#define ledVerm 9 //led vermelho ligado no pino 9
#define ledVerde 10 //led verde ligado no pino 10
//DECLARAcAO DE VARIAVEIS GLOBAIS
char dadosRecebidos[6];
bool recebido = 0;
int fim;
//INICIALIZAÇÃO DO HARDWARE
void setup() {
Serial.begin(9600); //Inicializa a porta serial com velocidade de 9600
pinMode(ledVerm, OUTPUT);
pinMode(ledVerde, OUTPUT);
Serial.println ("Digite um numero inteiro");
}
//FUNÇÕES COMPLEMENTARES
//PROGRAMA PRINCIPAL
void loop() {
if(Serial.available()){
delay(1);
for(byte i = 0; i < 5; i++){
dadosRecebidos[i] = Serial.read();
delay(5);
}
if(Serial.available() == 0) {
recebido = 1;
}else {
digitalWrite(ledVerde, LOW);
digitalWrite(ledVerm, HIGH);
dadosRecebidos[0] = '\0';
recebido = 0;
Serial.println("Numeros invalidos");
while(Serial.available()){
Serial.read();
}
}
if(!isdigit(dadosRecebidos[0]) && recebido == 1){
digitalWrite(ledVerm, HIGH);
digitalWrite(ledVerde, LOW);
Serial.print("\n");
Serial.println("Nao e numero");
dadosRecebidos[0] = '\0';
recebido = 0;
}
if(recebido == 1){
digitalWrite(ledVerde, HIGH);
digitalWrite(ledVerm, LOW);
fim = atoi(dadosRecebidos);
Serial.print("O numero recebido foi = ");
Serial.println(fim);
Serial.print("o dobro desse numero = ");
Serial.println(fim * 2);
Serial.print ("A metade desse numero = ");
Serial.println (fim / 2);
recebido = 0;
dadosRecebidos[0] = '\0';
Serial.println(" ");
Serial.println ("Digite um numero inteiro");
}
}
}
Re: exercicio 4.10
Qui Jun 29, 2023 11:18 pm
Muito bom Gustavo, está funcionando, só falta os comentários. Nota 6.0
- gustavocruz
- Mensagens : 256
Data de inscrição : 12/05/2019
Idade : 16
Re: exercicio 4.10
Sáb Jul 29, 2023 9:04 am
/*
* CURSO DE ROBOTICA 2021
*
* Exercicio: 4.10
* Tema: Calculadora Simples usando atoi()
* Atividade: Receber do terminal os caracteres, armazenar em string, converter para int e apresentar vezes 2 (dobro) e dividido por 2 (metade)
* Descrição: Receber o caractere pela serial, checar se é um número, oconverter o numero recebido usando a função atoi(), calcular e apresentar o resultado no terminal.
* Hardware: porta serial, pinos digitais para os LEDS
* Comandos: Serial.begin(9600); Serial.available(); Serial.read(), atoi()
* 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: Checar se os valores recebidos são numeros, se não forem enviar mensagem de erro e acender led vermelho, se der certo acende led verde
* Dica5: a função inteiro = atoi(string) Converte uma string com caracteres numericos em um numero inteiro
* Dica6: Após converter a string em inteiro, calcular o dobro e metade, enviar o valor para o terminal
* * Abaixo Funções de testes de caracteres, retorna 0 se a extressão for falsa; outro valor maior que 0 (zero) se for verdadeiro
* isalnum(char) Verifica se o caractere é alfanumérico (letra e número)
* isalpha(char) Verifica se o caractere é uma letra
* iscntrl(char) Verifica se o caractere é um caractere de controle https://pt.wikipedia.org/wiki/ASCII
* isdigit(char) Verifica se o caractere é um a letra
* isgraph(char) Verifica se o caractere é um caractere gráfico
* islower(char) Verifica se o caracteres é uma letra minúscula
* isprint(char) Verifica se o caractere é imprimível
* isalnum(char) Verifica se o caractere é alfanumérico
* ispunct(char) Verifica se o caractere é um caractere de pontuação
* isspace(char) Verifica se o caractere é um espaço em branco
* isupper(char) Verifica se o caractere é uma letra maiúscula
* isdigit(char) Verifica se o caractere é um caractere decimal (0-9)
* isxdigit(char) Verifica se o caractere é um caractere hexadecimal (0-9 ou A-F)
* ispunct(char) Verifica se o caractere é um caractere de pontuação
* * Abaixo Funções para manipular caracteres
* tolower(char) Converte o caractere para letra minúscula
* toupper(char) Converte o caractere para letra maiúscula
* atoi(string) Converte uma string com caracteres numericos em um numero inteiro se retornar zero pode ter havido erro
* atof(string) Converte uma string em um double se retornar zero pode ter havido erro
* atol(string Converte uma string em um long se retornar zero pode ter havido erro
*/
//DEFINICOES INICIAIS
#define ledVerm 9 //led vermelho ligado no pino 9
#define ledVerde 10 //led verde ligado no pino 10
//DECLARAcAO DE VARIAVEIS GLOBAIS
char dadosRecebidos[6]; //vetor que sera usado para guarda os dados recebidos
bool recebido = 0; //variavel de controle
int fim; // variavel que sera usada para o calculo de media
//INICIALIZAÇÃO DO HARDWARE
void setup() {
Serial.begin(9600); //Inicializa a porta serial com velocidade de 9600
pinMode(ledVerm, OUTPUT); //ledVerm configurado como saida
pinMode(ledVerde, OUTPUT);//ledVerde configurado como saida
Serial.println ("Digite um numero inteiro");//mensagem inicial na porta seria
}
//FUNÇÕES COMPLEMENTARES
//PROGRAMA PRINCIPAL
void loop() {
if(Serial.available()){ //se for escrito algo na porta serial
delay(1); //pequeno delay para impedir do programa fique rapido demais
for(byte i = 0; i < 5; i++){//cria um for para pegar os valores da porta
dadosRecebidos[i] = Serial.read();//retira os valores da porta e coloca dentro do vetor
delay(5);//pequeno delay
}
if(Serial.available() == 0) { //se no tiver nada na porta serial
recebido = 1;//recebido vai sert igual a 1
}else {// se nao significa que o numero muito grande
digitalWrite(ledVerde, LOW);//apaga o led verde
digitalWrite(ledVerm, HIGH);//acende o led vermelho
dadosRecebidos[0] = '\0';//limpa o vetor
recebido = 0;//recebido vai ser igual a zero
Serial.println("Numeros invalidos");//mensagem no monitor serial
while(Serial.available()){//while para limpar a porta
Serial.read();
}
}
if(!isdigit(dadosRecebidos[0]) && recebido == 1){//teste para verificar se e numero, se nao fo
digitalWrite(ledVerm, HIGH);//acende o led vermelho
digitalWrite(ledVerde, LOW);//apaga o led verde
Serial.print("\n");//pula uma linha
Serial.println("Nao e numero");//mensagem de erro
dadosRecebidos[0] = '\0';//limpa o vetor
recebido = 0;//recebido igual a zero
}
if(recebido == 1){//se recebido for igual a 1
digitalWrite(ledVerde, HIGH);//acende o led verde
digitalWrite(ledVerm, LOW);//apaga o led vermelho
fim = atoi(dadosRecebidos);//fim vai ser igual ao numero inteiro guardado no vetor
Serial.print("O numero recebido foi = ");//mensagem
Serial.println(fim);//escreve o valor de fim
Serial.print("o dobro desse numero = ");//mensagem
Serial.println(fim * 2);//escreve o dobro de fim
Serial.print ("A metade desse numero = ");//mensagem
Serial.println (fim / 2);//escreve a metade de fim
recebido = 0;//zera o recebido
dadosRecebidos[0] = '\0';//limpa o vetor
Serial.println(" ");//escreve um espaço
Serial.println ("Digite um numero inteiro");//mensagem
}
}
}
* CURSO DE ROBOTICA 2021
*
* Exercicio: 4.10
* Tema: Calculadora Simples usando atoi()
* Atividade: Receber do terminal os caracteres, armazenar em string, converter para int e apresentar vezes 2 (dobro) e dividido por 2 (metade)
* Descrição: Receber o caractere pela serial, checar se é um número, oconverter o numero recebido usando a função atoi(), calcular e apresentar o resultado no terminal.
* Hardware: porta serial, pinos digitais para os LEDS
* Comandos: Serial.begin(9600); Serial.available(); Serial.read(), atoi()
* 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: Checar se os valores recebidos são numeros, se não forem enviar mensagem de erro e acender led vermelho, se der certo acende led verde
* Dica5: a função inteiro = atoi(string) Converte uma string com caracteres numericos em um numero inteiro
* Dica6: Após converter a string em inteiro, calcular o dobro e metade, enviar o valor para o terminal
* * Abaixo Funções de testes de caracteres, retorna 0 se a extressão for falsa; outro valor maior que 0 (zero) se for verdadeiro
* isalnum(char) Verifica se o caractere é alfanumérico (letra e número)
* isalpha(char) Verifica se o caractere é uma letra
* iscntrl(char) Verifica se o caractere é um caractere de controle https://pt.wikipedia.org/wiki/ASCII
* isdigit(char) Verifica se o caractere é um a letra
* isgraph(char) Verifica se o caractere é um caractere gráfico
* islower(char) Verifica se o caracteres é uma letra minúscula
* isprint(char) Verifica se o caractere é imprimível
* isalnum(char) Verifica se o caractere é alfanumérico
* ispunct(char) Verifica se o caractere é um caractere de pontuação
* isspace(char) Verifica se o caractere é um espaço em branco
* isupper(char) Verifica se o caractere é uma letra maiúscula
* isdigit(char) Verifica se o caractere é um caractere decimal (0-9)
* isxdigit(char) Verifica se o caractere é um caractere hexadecimal (0-9 ou A-F)
* ispunct(char) Verifica se o caractere é um caractere de pontuação
* * Abaixo Funções para manipular caracteres
* tolower(char) Converte o caractere para letra minúscula
* toupper(char) Converte o caractere para letra maiúscula
* atoi(string) Converte uma string com caracteres numericos em um numero inteiro se retornar zero pode ter havido erro
* atof(string) Converte uma string em um double se retornar zero pode ter havido erro
* atol(string Converte uma string em um long se retornar zero pode ter havido erro
*/
//DEFINICOES INICIAIS
#define ledVerm 9 //led vermelho ligado no pino 9
#define ledVerde 10 //led verde ligado no pino 10
//DECLARAcAO DE VARIAVEIS GLOBAIS
char dadosRecebidos[6]; //vetor que sera usado para guarda os dados recebidos
bool recebido = 0; //variavel de controle
int fim; // variavel que sera usada para o calculo de media
//INICIALIZAÇÃO DO HARDWARE
void setup() {
Serial.begin(9600); //Inicializa a porta serial com velocidade de 9600
pinMode(ledVerm, OUTPUT); //ledVerm configurado como saida
pinMode(ledVerde, OUTPUT);//ledVerde configurado como saida
Serial.println ("Digite um numero inteiro");//mensagem inicial na porta seria
}
//FUNÇÕES COMPLEMENTARES
//PROGRAMA PRINCIPAL
void loop() {
if(Serial.available()){ //se for escrito algo na porta serial
delay(1); //pequeno delay para impedir do programa fique rapido demais
for(byte i = 0; i < 5; i++){//cria um for para pegar os valores da porta
dadosRecebidos[i] = Serial.read();//retira os valores da porta e coloca dentro do vetor
delay(5);//pequeno delay
}
if(Serial.available() == 0) { //se no tiver nada na porta serial
recebido = 1;//recebido vai sert igual a 1
}else {// se nao significa que o numero muito grande
digitalWrite(ledVerde, LOW);//apaga o led verde
digitalWrite(ledVerm, HIGH);//acende o led vermelho
dadosRecebidos[0] = '\0';//limpa o vetor
recebido = 0;//recebido vai ser igual a zero
Serial.println("Numeros invalidos");//mensagem no monitor serial
while(Serial.available()){//while para limpar a porta
Serial.read();
}
}
if(!isdigit(dadosRecebidos[0]) && recebido == 1){//teste para verificar se e numero, se nao fo
digitalWrite(ledVerm, HIGH);//acende o led vermelho
digitalWrite(ledVerde, LOW);//apaga o led verde
Serial.print("\n");//pula uma linha
Serial.println("Nao e numero");//mensagem de erro
dadosRecebidos[0] = '\0';//limpa o vetor
recebido = 0;//recebido igual a zero
}
if(recebido == 1){//se recebido for igual a 1
digitalWrite(ledVerde, HIGH);//acende o led verde
digitalWrite(ledVerm, LOW);//apaga o led vermelho
fim = atoi(dadosRecebidos);//fim vai ser igual ao numero inteiro guardado no vetor
Serial.print("O numero recebido foi = ");//mensagem
Serial.println(fim);//escreve o valor de fim
Serial.print("o dobro desse numero = ");//mensagem
Serial.println(fim * 2);//escreve o dobro de fim
Serial.print ("A metade desse numero = ");//mensagem
Serial.println (fim / 2);//escreve a metade de fim
recebido = 0;//zera o recebido
dadosRecebidos[0] = '\0';//limpa o vetor
Serial.println(" ");//escreve um espaço
Serial.println ("Digite um numero inteiro");//mensagem
}
}
}
Permissões neste sub-fórum
Não podes responder a tópicos