Página 1 de 1

Voltimetro lcd 16x2

MensagemEnviado: 21 Abr 2018 16:47
por nivel
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

}

Re: Voltimetro lcd 16x2

MensagemEnviado: 21 Abr 2018 19:26
por andre_luis
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.

Re: Voltimetro lcd 16x2

MensagemEnviado: 24 Abr 2018 08:42
por nivel
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");
//************************************************************************************

Re: Voltimetro lcd 16x2

MensagemEnviado: 24 Abr 2018 10:15
por andre_luis
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...

Re: Voltimetro lcd 16x2

MensagemEnviado: 24 Abr 2018 10:49
por nivel
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");

Re: Voltimetro lcd 16x2

MensagemEnviado: 24 Abr 2018 15:51
por edsont
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");

Re: Voltimetro lcd 16x2

MensagemEnviado: 24 Abr 2018 16:42
por nivel
Mesmo problema
//***********************************************************************************
void setup(){
lcd.begin(16, 2);
lcd.setCursor(0, 0);
lcd.print("VOLTIMETRO");

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

Re: Voltimetro lcd 16x2

MensagemEnviado: 24 Abr 2018 16:55
por edsont
Muito estranho.

Não tem outro LCD para testar? Vai que é defeito.

Re: Voltimetro lcd 16x2

MensagemEnviado: 24 Abr 2018 16:58
por nivel
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?

Re: Voltimetro lcd 16x2

MensagemEnviado: 24 Abr 2018 19:25
por edsont
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?

Re: Voltimetro lcd 16x2

MensagemEnviado: 25 Abr 2018 07:54
por nivel
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"
{

Re: Voltimetro lcd 16x2

MensagemEnviado: 29 Abr 2018 15:05
por nivel
Engraçado:
Com letra minúscula "voltimetro" funciona.
Com letra maiúscula "VOLTIMETRO" não funciona.
Arduino uno com atmega328P DIP.

Re: Voltimetro lcd 16x2

MensagemEnviado: 29 Abr 2018 18:31
por andre_luis
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).

Re: Voltimetro lcd 16x2

MensagemEnviado: 30 Abr 2018 08:48
por edsont
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.