Voltimetro lcd 16x2

Fórum sobre plataforma Arduino

Moderadores: andre_luis, 51, guest2003, Renie

Voltimetro lcd 16x2

Mensagempor nivel » 21 Abr 2018 16:47

Ola pessoal
Estou iniciando no mundo da programação Arduino.
Estou desenvolvendo programinha PWM encoder com voltímetro.
Conforme giro encoder varia PWM pino 6, que está ligado pino entrada A0 para indicar voltagem no display.

PWM encoder display esta tudo certo.
Quando implemento canal analógico programa fica louco

Rotinas estão funcionando
cpp code
///***************************************************************************************
#include <LiquidCrystal.h>
#include "Wire.h"
const int rs = 11, en = 9, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
int brightness = 100; // brilho LED, começa com metade do brilho
int fadeAmount = 10; // quantos pontos para desvanecer o LED por
unsigned long currentTime;
unsigned long loopTime;
const int pin_A = 13; // pin 13
const int pin_B = 12; // pin 12
unsigned char encoder_A;
unsigned char encoder_B;
unsigned char encoder_A_prev=0;
//******************************************************************************************
void setup() {

// declara o pino 6 como uma saída:
pinMode(6, OUTPUT);
pinMode(pin_A, INPUT);
pinMode(pin_B, INPUT);
currentTime = millis();
loopTime = currentTime;
{
}
lcd.begin(16, 2);
lcd.print("voltimetro");
lcd.setCursor(0, 1);
lcd.print("V");
lcd.setCursor(8, 1);
lcd.print(".");
}
//****************************************************************************************
void loop() {


currentTime = millis(); // obter o tempo decorrido atual
if(currentTime >= (loopTime + 5)){ // 5 ms desde a última verificação do codificador = 200Hz
encoder_A = digitalRead(pin_A); // Leia os pinos do codificador
encoder_B = digitalRead(pin_B);
if((!encoder_A) && (encoder_A_prev)){
if(encoder_B) { // A passou de alta para baixa
// B é alto, então no sentido horário
// aumentar o brilho, não ultrapasse 255
if(brightness + fadeAmount <= 255) brightness += fadeAmount;
}
else {
if(brightness - fadeAmount >= 0) brightness -= fadeAmount; // B é baixo, portanto, no sentido anti-horário
// diminuir o brilho, não vá abaixo de 0
}


}
encoder_A_prev = encoder_A; // Armazena o valor de A para a próxima vez

analogWrite(6, brightness); // defina o brilho do pino 6:

loopTime = currentTime; // Atualizações loopTime
}
// Outro processamento pode ser feito aqui

}


Problema quando implemento esta parte no void loop principal

cpp code
volt = analogRead(analogInput1);

lcd.setCursor(2,1); //VOLTIMETRO (POSICIONA DISPLAY)
lcd.print(volt);


Fiz desta maneira,mas ai tranca display,mas pwm funciona
cpp code
///************************************************************************************************************************* 
#include <LiquidCrystal.h>
#include "Wire.h"
const int rs = 11, en = 9, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
int brightness = 100; // brilho LED, começa com metade do brilho
int fadeAmount = 10; // quantos pontos para desvanecer o LED por
unsigned long currentTime;
unsigned long loopTime;
const int pin_A = 13; // pin 13
const int pin_B = 12; // pin 12
unsigned char encoder_A;
unsigned char encoder_B;
unsigned char encoder_A_prev=0;

int analogInput1 = A0;
int volt;

//******************************************************************************************
void setup() {
// declara o pino 6 como uma saída:
pinMode(6, OUTPUT);
pinMode(pin_A, INPUT);
pinMode(pin_B, INPUT);
currentTime = millis();
loopTime = currentTime;
{
}
lcd.begin(16, 2);
lcd.setCursor(0,0);
lcd.print("APLICADOR RHODIUM");
lcd.setCursor(0,1);
lcd.print("V");
}
//****************************************************************************************
void loop() {
volt = analogRead(analogInput1);
lcd.setCursor(2,1); //VOLTIMETRO (POSICIONA DISPLAY)
lcd.print(volt);

currentTime = millis(); // obter o tempo decorrido atual
if(currentTime >= (loopTime + 5)){ // 5 ms desde a última verificação do codificador = 200Hz
encoder_A = digitalRead(pin_A); // Leia os pinos do codificador
encoder_B = digitalRead(pin_B);
if((!encoder_A) && (encoder_A_prev)){
if(encoder_B) { // A passou de alta para baixa
// B é alto, então no sentido horário
// aumentar o brilho, não ultrapasse 255
if(brightness + fadeAmount <= 255) brightness += fadeAmount;
}
else {
if(brightness - fadeAmount >= 0) brightness -= fadeAmount; // B é baixo, portanto, no sentido anti-horário
// diminuir o brilho, não vá abaixo de 0
}


}
encoder_A_prev = encoder_A; // Armazena o valor de A para a próxima vez

// defina o brilho do pino 6:
analogWrite(6, brightness);

loopTime = currentTime; // Atualizações loopTime
}
// Outro processamento pode ser feito aqui

}
nivel
Nibble
 
Mensagens: 75
Registrado em: 12 Jan 2017 15:16

Re: Voltimetro lcd 16x2

Mensagempor andre_luis » 21 Abr 2018 19:26

Qualquer função que voce coloque seja no loop() do Arduino, ou no While(1) do C, vai consumir todo o processamento disponivel. No caso do Arduino, mesmo um Serial.print() no loop() já é suficiente pra fazer travar a IDE. O que voce deve fazer é preferencialmente habilitar uma interrupção de Timer para contar um tempo suficientemente largo (ex. 1 segundo ou 1/2 segundo) para atualização dos valores no LCD.
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Re: Voltimetro lcd 16x2

Mensagempor nivel » 24 Abr 2018 08:42

não deve ser isso.
Se deixar somente exibição voltagem nada acontece.

funciona
cpp code
//***********************************************************************************
void setup(){
lcd.begin(16, 2); // CONFIGURA DISPLAY LCD 16 COLUNAS 2 LINHAS
//lcd.print("VOLTIMETRO"); // IMPRIME MENSAGEM VOLTIMETRP
lcd.setCursor(5, 1); // POSICIONA DISPLAY POSIÇÃO EXIBIÇÃO:
lcd.print("V");
//************************************************************************************


Não funciona
cpp code
//***********************************************************************************
void setup(){
lcd.begin(16, 2); // CONFIGURA DISPLAY LCD 16 COLUNAS 2 LINHAS
lcd.print("VOLTIMETRO"); // IMPRIME MENSAGEM VOLTIMETRP
lcd.setCursor(5, 1); // POSICIONA DISPLAY POSIÇÃO EXIBIÇÃO:
lcd.print("V");
//************************************************************************************
nivel
Nibble
 
Mensagens: 75
Registrado em: 12 Jan 2017 15:16

Re: Voltimetro lcd 16x2

Mensagempor andre_luis » 24 Abr 2018 10:15

Experimenta enviar uma letra do texto á cada passada, e vai confirmar o que suspeitei:

cpp code
setup()
{
const int8 text[] = {'V','O','L','T','I','M','E','T','R','O'} ;
int8 indice = 0;
}

cpp code
loop()
{
...
if ( indice++ < sizeof (text) )
lcd.print(String(text[indice]));
}
else
indice = 0;
...


Pode dar erro de compilação, nao testei...
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Re: Voltimetro lcd 16x2

Mensagempor nivel » 24 Abr 2018 10:49

Ola só que estranho.

Assim funciona:

cpp code
//***********************************************************************************
void setup(){
lcd.begin(16, 2); // CONFIGURA DISPLAY LCD 16 COLUNAS 2 LINHAS
lcd.print("VOLTIM"); // IMPRIME MENSAGEM VOLTIMETRO
lcd.setCursor(6, 1); // POSICIONA DISPLAY POSIÇÃO EXIBIÇÃO:
lcd.print("V");
lcd.setCursor(15, 1);
lcd.print("A");
//***********************************************************************************


Assim não funciona:


cpp code
//***********************************************************************************
void setup(){
lcd.begin(16, 2); // CONFIGURA DISPLAY LCD 16 COLUNAS 2 LINHAS
lcd.print("VOLTIMETRO"); // IMPRIME MENSAGEM VOLTIMETRO
lcd.setCursor(6, 1); // POSICIONA DISPLAY POSIÇÃO EXIBIÇÃO:
lcd.print("V");
lcd.setCursor(15, 1);
lcd.print("A");

//***********************************************************************************

Se for mais que que 6 caracteres embaraça display.
cpp code
lcd.print("VOLTIMETRO");  // ou lcd.print("ARDUINO");
nivel
Nibble
 
Mensagens: 75
Registrado em: 12 Jan 2017 15:16

Re: Voltimetro lcd 16x2

Mensagempor edsont » 24 Abr 2018 15:51

nivel escreveu:Se for mais que que 6 caracteres embaraça display.
cpp code
lcd.print("VOLTIMETRO");  // ou lcd.print("ARDUINO");


Já tentou colocar setCursor antes?

Código: Selecionar todos
lcd.setCursor(0, 0);
lcd.print("VOLTIMETRO");  // ou lcd.print("ARDUINO");
Avatar do usuário
edsont
Word
 
Mensagens: 555
Registrado em: 22 Mai 2007 17:19
Localização: Araraquara-SP Brasil - Terra - Sistema Solar - Via Láctea

Re: Voltimetro lcd 16x2

Mensagempor nivel » 24 Abr 2018 16:42

Mesmo problema
//***********************************************************************************
void setup(){
lcd.begin(16, 2);
lcd.setCursor(0, 0);
lcd.print("VOLTIMETRO");

//***********************************************************************************
nivel
Nibble
 
Mensagens: 75
Registrado em: 12 Jan 2017 15:16

Re: Voltimetro lcd 16x2

Mensagempor edsont » 24 Abr 2018 16:55

Muito estranho.

Não tem outro LCD para testar? Vai que é defeito.
Avatar do usuário
edsont
Word
 
Mensagens: 555
Registrado em: 22 Mai 2007 17:19
Localização: Araraquara-SP Brasil - Terra - Sistema Solar - Via Láctea

Re: Voltimetro lcd 16x2

Mensagempor nivel » 24 Abr 2018 16:58

edsont escreveu:
nivel escreveu:Se for mais que que 6 caracteres embaraça display.
cpp code
lcd.print("VOLTIMETRO");  // ou lcd.print("ARDUINO");


Já tentou colocar setCursor antes?

Código: Selecionar todos
lcd.setCursor(0, 0);
lcd.print("VOLTIMETRO");  // ou lcd.print("ARDUINO");


//*********************************************************************************************************************
Fiz uns testes rápidos solucionou.
Embaraça caracteres de todo display
VOLTIMETRO

Não embaraça caracteres de todo display
Voltimetro

Letra minúscula não.
Porque?
nivel
Nibble
 
Mensagens: 75
Registrado em: 12 Jan 2017 15:16

Re: Voltimetro lcd 16x2

Mensagempor edsont » 24 Abr 2018 19:25

Qual o Arduino (MCU) que está usando. O I/O ligado ao LCD são todos do mesmo tipo, não tem nenhum com saída invertida ou coletor aberto?
Avatar do usuário
edsont
Word
 
Mensagens: 555
Registrado em: 22 Mai 2007 17:19
Localização: Araraquara-SP Brasil - Terra - Sistema Solar - Via Láctea

Re: Voltimetro lcd 16x2

Mensagempor nivel » 25 Abr 2018 07:54

Engraçado:
Com letra minúscula "voltimetro" funciona.
Com letra maiúscula "VOLTIMETRO" não funciona.
Arduino uno com atmega328P DIP.

cpp code
//*****************************************************************************************
#include <LiquidCrystal.h>
#include "Wire.h"
const int rs = 11, en = 9, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

//********************************************************************************************
//ROTINAS ENCODER
int brightness;
unsigned long currentTime;
unsigned long loopTime;
const int pin_A = 13; // PINOS ENCODER
const int pin_B = 12; // PINOS ENCODER
int buttonPin = 8; //PINO BOTTON
//******************************************************************************************
const int pwmPin = 6;
unsigned char encoder_A;
unsigned char encoder_B;
unsigned char encoder_A_prev=0;
boolean lastButton = HIGH;
boolean currentButton = HIGH;
//*******************************************************************************************
int sensorValue = 0;
float tensao = A0;

//*******************************************************************************************
void setup(){
lcd.begin(16, 2); // CONFIGURA DISPLAY LCD 16 COLUNAS 2 LINHAS
lcd.print("voltimetro"); // IMPRIME MENSAGEM VOLTIMETRO
{

}
lcd.setCursor(6,1); // POSICIONA DISPLAY POSIÇÃO EXIBIÇÃO
lcd.print("V"); // IMPRIME MENSAGEM "V"
{
nivel
Nibble
 
Mensagens: 75
Registrado em: 12 Jan 2017 15:16

Re: Voltimetro lcd 16x2

Mensagempor nivel » 29 Abr 2018 15:05

Engraçado:
Com letra minúscula "voltimetro" funciona.
Com letra maiúscula "VOLTIMETRO" não funciona.
Arduino uno com atmega328P DIP.
nivel
Nibble
 
Mensagens: 75
Registrado em: 12 Jan 2017 15:16

Re: Voltimetro lcd 16x2

Mensagempor andre_luis » 29 Abr 2018 18:31

Já experimentou testar isso num ambiente de simulação ? Assim teria como ter uma noção se o problema é do modulo do Display que está usando, ou se é do programa (o que nao parece ser).
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Re: Voltimetro lcd 16x2

Mensagempor edsont » 30 Abr 2018 08:48

Concordo com o André.

Infelizmente o IDE do Arduino não tem simulador nem debugador.

A Autodesk tem um simulador online de Arduino (https://circuits.io/lab), mas nunca usei. Parece que não permite executar passo a passo, o que ajudaria muito a diagnosticar onde ocorre o problema.
Avatar do usuário
edsont
Word
 
Mensagens: 555
Registrado em: 22 Mai 2007 17:19
Localização: Araraquara-SP Brasil - Terra - Sistema Solar - Via Láctea


Voltar para ARDUINO

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 0 visitantes

x