Ir ao conteúdo
  • Cadastre-se

Arduino Esta certo essa programação?


Posts recomendados

Alguém poderia corrigir urgentemente essa questão ? :tw_astonished:

 

Essa programação de arduino está correta? Seria um bafômetro que mostra o valor serial constantemente.

#include <LiquidCrystal.h>

#define sensor  9  // Connnect MQ-3 Sensor to pin-9
#define buzzer  8  // Connnect Buzzer to pin-8 
int valor_sensor = 0;
LiquidCrystal lcd(2, 3,4,5, 6,7);
// LCD PIN   -    ARDUINO PIN
// RS        -    2 
// RW        -   GND   
//  E        -    3
// D4        -    4  
// D5        -    5
// D6        -    6
// D7        -    7
void setup() {
  valor_sensor = analogRead(A0);
  lcd.begin(16, 2);
  pinMode(sensor, INPUT);
  pinMode(buzzer, OUTPUT);
  lcd.clear();
  lcd.print(" Bafometro ");
  lcd.setCursor(0,1);
  lcd.print("     Carregando... 10%   ");
  delay(1800);
  lcd.clear();
  lcd.print(" Bafometro ");
  lcd.setCursor(0,1);
  lcd.print("     Carregando... 20%   ");
  delay(1800);
  lcd.clear();
  lcd.print(" Bafometro ");
  lcd.setCursor(0,1);
  lcd.print("     Carregando...30%    ");
  delay(1800);
  lcd.clear();
  lcd.print(" Bafometro ");
  lcd.setCursor(0,1);
  lcd.print("     Carregando...40%    ");
  delay(1800);
  lcd.clear();
  lcd.print(" Bafometro ");
  lcd.setCursor(0,1);
  lcd.print("     Carregando...50%    ");
  delay(1800);
  lcd.clear();
  lcd.print(" Bafometro ");
  lcd.setCursor(0,1);
  lcd.print("     Carregando...60%    ");
  delay(1800);
  lcd.clear();
  lcd.print(" Bafometro ");
  lcd.setCursor(0,1);
  lcd.print("     Carregando...70%    ");
  delay(1800);
  lcd.clear();
  lcd.print(" Bafometro ");
  lcd.setCursor(0,1);
  lcd.print("     Carregando...80%    ");
  delay(1800);
  lcd.clear();
  lcd.print(" Bafometro ");
  lcd.setCursor(0,1);
  lcd.print("     Carregando...90%    ");
  delay(1800);
  }
void sens(){
  int i=1;
  lcd.clear();
  lcd.print("Alcool Detectado");
  digitalWrite(buzzer, HIGH);
  lcd.setCursor(0,1);
  lcd.print(valor_sensor);
  }
  
void scn(){
  lcd.clear();
  lcd.print(" Analizando... ");
  digitalWrite(buzzer, LOW);
  lcd.setCursor(0,1);
  lcd.print(valor_sensor);
}
void loop() 
{
     if(digitalRead(sensor)==0)
  sens();
   
 else
    scn();
   
}

 

 

Foi baseado nesse guia:

 

http://www.davindermahi.com/2017/07/12/arduino-interface-for-alcohol-mq-3-sensor/

 

Nesse caso eu liguei a saída DO em AO. Certo?

 

Deixei 3 minutos para aquecimento do sensor.

Link para o comentário
Compartilhar em outros sites

Estranho, o sensor é analógico e no tutorial ele está ligado a um pino digital... já tem coisa estranha ai.

 

Então como ele está no pino digital ele só vai para o high a um certa concentração de álcool e low quando estiver dentro da tensão de low do arduino... ai pode ter momentos de flutuação que pode ficar ligando e desligando o a porta... Sem medições de valores a cada momento, só se ultrapassou ou não tal valor.

 

Como os delays o o valor do sensor não será atualizado todo o tempo, o programa para com o uso do delay, mas como você usa só no início que é setup e será executado só uma vez "tudo bem". A alternativa seria usar millis.

 

Não entendi o porque dos delays já que o sensor tem alta sensibilidade e rápido tempo de resposta.

 

adicionado 3 minutos depois

Você está falando que teria escrita no serial, mas não vi nenhum comando serialWrite no código... ou algo que verifique a comunicação serial. Talvez erro ao se expressar...

Link para o comentário
Compartilhar em outros sites

Você desconsidera então o tempo de aquecimento? Ouvi em algum lugar que era nerscessário, mas isso é o de menos :tw_grimace:

Sou bem leigo em programação mesmo, eu queria basicamente que o display mostrasse o nível de alcool lido pelo sensor  constatemente( que eu imagino que seria pela porta Analogica, certo?) e caso atingisse  um determinado valor, printasse uma mensgem e tocasse o buzzer :tw_grimace:

 

Alguma dica? Onde eu mudo?

Link para o comentário
Compartilhar em outros sites

tira todo esse código do setup  de mexer com o lcd e joga para o loop principal, procura por algum tutorial "arduino lcd" para você ver como exibe variáveis nele. Usa uma porta analógica para exibir os valores do sensor... pode ser necessário fazer alguma conversão com o número, talvez... ou seja, pega outro tutorial

 

tipo esse aqui

http://www.learningaboutelectronics.com/Articles/MQ-3-alcohol-sensor-circuit-with-arduino.php

 

sobre o buzzer mesma coisa tem tutorial "arduino buzzer" por ai que mostra as ligações e código. Ou seja, só colocar um if (analogRead > tal valor) {liga buzzer}.

 

Depois faça um teste em separado de cada um depois se ainda tiver ruim pode mostrar o código por aqui.

Quando tem muitas coisas para colocar no arduino não tem normalmente um tutorial para tudo que você quer em só um lugar*, você tem ir juntando.

 

 

adicionado 4 minutos depois

Quase tudo o que você quer...

https://openhomeautomation.net/arduino-breathalyzer

 

Enfim... só da uma pesquisada. Novamente se tiver dúvida posta ai...

Link para o comentário
Compartilhar em outros sites

Copia e cola os códigos básicos em cada lugar ... se no setup tem uma coisa... copia essa coisa para o setup do teu código principal, o que tiver no loop principal você copia para loop do seu programa... o que tiver fora do setup e do loop você coloca fora no ouro programa também... pronto você "juntou" programas. Para ter controle deles só usar "if" para criar condições do que você quer.

 

Faça testes ai...

adicionado 1 minuto depois

Sobre como usar esse menor... procura tutoriais "arduino lcd 16x2"

Link para o comentário
Compartilhar em outros sites

Seria isso:

Citação

 

#include <LiquidCrystal.h>

LiquidCrystal lcd(2, 3,4,5, 6,7);

int valor_sensor =0;

void setup ()
{
Serial.begin(9600);
pinMode(A1, INPUT);
pinMode(8, OUTPUT);
lcd.clear();
lcd.print(" Bafometro ");
lcd.setCursor(0,1);
lcd.print("     Sensor     ");
delay(2000);

}

void loop ()
{
valor_sensor = analogRead(A1);

if (valor_sensor >= 0 and valor_sensor <= 50)
  {
  lcd.print(" Baixo ou nulo  ");
  lcd.setCursor(0,1);
  lcd.print(valor_sensor);
  }
  else if (valor_sensor >= 51 and valor_sensor <= 200)
  {
    lcd.print(" Baixo ");
    lcd.setCursor(0,1);
    lcd.print(valor_sensor);
  }
  else if (valor_sensor >= 201 and valor_sensor <= 400)
  {
   lcd.print(" Alto ");
  lcd.setCursor(0,1);
  lcd.print(valor_sensor);
  digitalWrite(8, HIGH);
  }
  else if (valor_sensor >= 401 and valor_sensor <= 600)
  {
    lcd.print(" Altissimo ");
  lcd.setCursor(0,1);
  lcd.print(valor_sensor);
  digitalWrite(8, HIGH);
  }
  else if (valor_sensor >= 601)
  {
   lcd.print(" Chame o Taxi! ");
   lcd.setCursor(0,1);
   lcd.print(valor_sensor);
   digitalWrite(8, HIGH);
  }
  }

 

 

Link para o comentário
Compartilhar em outros sites

Isso, às vezes pode bugar algum intervalo. Mas é isso aí... os pinos não estão conflitando nem para o buzzer , lcd ou o sensor. O resto é código.

 

Faça um test/monte e veja se está de acordo. Se não tiver você pode ir comentando parte do teu código do void loop para ver onde está o erro.

adicionado 3 minutos depois

Só estou estranhando esse digitalWrite(8, HIGH);

em todos ... teria que ver a função disso ai se é para ligar um led... relé ou sei lá... se for um led seria bom ligar outra porta para distinguir que parte do teu código que foi que ligou o mesmo.

Link para o comentário
Compartilhar em outros sites

Beleza, valeu mesmo :atirador:

Assim que possível volto aqui relatar ( espero que para dizer que funcionou perfeitamente :rezando: )

adicionado 15 minutos depois
5 horas atrás, Bommu Perneta disse:

Isso, às vezes pode bugar algum intervalo. Mas é isso aí... os pinos não estão conflitando nem para o buzzer , lcd ou o sensor. O resto é código.

 

Faça um test/monte e veja se está de acordo. Se não tiver você pode ir comentando parte do teu código do void loop para ver onde está o erro.

adicionado 3 minutos depois

Só estou estranhando esse digitalWrite(8, HIGH);

em todos ... teria que ver a função disso ai se é para ligar um led... relé ou sei lá... se for um led seria bom ligar outra porta para distinguir que parte do teu código que foi que ligou o mesmo.

 

Acho que o correto deveria ser isso:

 

pinMode(8,HIGH);

 Não?

 

E acho que eu poderia fazer uma função para tocar o buzzer numa faixa de 200 a 600

Link para o comentário
Compartilhar em outros sites

pinMode é lá no setup ... mas você pode colocar no loop fazendo uma gambiarra... mas pinMode basicamente define se a porta 8 no caso é input ou output. Input para entrada de valores e output para saídas.

 

Já digitalWrite você escreve na porta o valor que você quer no caso HIGH ou LOW. Mas agora que você falou faltou você colocar um LOW para desligar o led + um delay para deligar a porta.

 

No caso do buzzer ele tem uma função própria para ser chamada para ele fazer o barulho que é o "tone"

 

/* Arduino tutorial - Buzzer / Piezo Speaker
   More info and circuit: http://www.ardumotive.com/how-to-use-a-buzzer-en.html
   Dev: Michalis Vasilakis // Date: 9/6/2015 // www.ardumotive.com */


const int buzzer = 9; //buzzer to arduino pin 9


void setup(){
 
  pinMode(buzzer, OUTPUT); // Set buzzer - pin 9 as an output

}

void loop(){
 
  tone(buzzer, 1000); // Send 1KHz sound signal...
  delay(1000);        // ...for 1 sec
  noTone(buzzer);     // Stop sound...
  delay(1000);        // ...for 1sec
  
}

 

http://www.instructables.com/id/How-to-use-a-Buzzer-Arduino-Tutorial/

adicionado 1 minuto depois

No caso do código acima você só tem que substituir o 9 por 8 para não tem problema no teu código

Link para o comentário
Compartilhar em outros sites

É mesmo '-' Era para usar as duas linhas... esqueci do lcd.begin(16, 2);

 

Citação

#include <LiquidCrystal.h>

LiquidCrystal lcd(2, 3,4,5, 6,7);

int valor_sensor =0;
const int buzzer = 8;

void setup ()
{
Serial.begin(115200);
pinMode(A1, INPUT);
pinMode(8, OUTPUT);
lcd.begin(16, 2);
lcd.print(" Bafometro ");
lcd.setCursor(0,1);
lcd.print("     Sensor     ");
delay(2000);

}

void loop ()
{
valor_sensor = analogRead(A1);

if (valor_sensor >= 0 and valor_sensor <= 50)
  {
  lcd.begin(16, 2);
  lcd.print(" Baixo ou nulo  ");
  lcd.setCursor(0,1);
  lcd.print(valor_sensor);
  }
  else if (valor_sensor >= 51 and valor_sensor <= 200)
  {
    lcd.begin(16, 2);
    lcd.print(" Baixo ");
    lcd.setCursor(0,1);
    lcd.print(valor_sensor);
  }
  else if (valor_sensor >= 201 and valor_sensor <= 400)
  {
  lcd.begin(16, 2);
  lcd.print(" Alto ");
  lcd.setCursor(0,1);
  lcd.print(valor_sensor);
  tone(8, 500);
  }
  else if (valor_sensor >= 401 and valor_sensor <= 600)
  {
  lcd.begin(16, 2);
  lcd.print(" Altissimo ");
  lcd.setCursor(0,1);
  lcd.print(valor_sensor);
  tone(8, 500);
  }
  else if (valor_sensor >= 601)
  {
   lcd.begin(16, 2);
   lcd.print(" Chame o Taxi! ");
   lcd.setCursor(0,1);
   lcd.print(valor_sensor);
   tone(8, 500);cv
  }
  }

 

 Esta certo agora, pessoal ?

adicionado 6 minutos depoi
Citação

 

 

Link para o comentário
Compartilhar em outros sites

@Lucas090 declare o LCD.begin dentro do void setup, somente.

 

Você está invertendo a ordem das linhas, primeiro você usa o setCursor , pra declarar a linha e a posição, depois você escreve com o print.

Limpa o display antes de setar e printar.

lcd.clear ();

lcd.setCursor (3,0); // a posição é um exemplo,

lcd.print ("Clube do Hardware"); //

lcd.setCursor (0,0); // 

lcd.print ("Pinhed");  //

delay (1000);  // conitnue a programação

 

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...