olá a todos, recentemente, comecei um projeto no Arduino, que consiste, em utilizar um LCD Keypad Shield, no qual desenvolvi um menu, e fiz a integração de um sensor neste menu, sendo este sensor o  sct-013 20a, não invasivo, quando fui verificar, os resultados, ele funciona, mas quando entro na parte de medições, que seria o "sub menu", ele não atualiza os dados do sensor que seria de amperagem e potência, e ele só atualiza quando eu aperto o select do LCD Keypad Shield, sendo que este deveria atualizar os dados automaticamente, e depois quando apertarmos o botão left voltasse o menu de origem, gostaria de ajudada, por favor,
Agradeço desde já


Programação :

#include <LiquidCrystal.h> // Inclui biblioteca "LiquidCristal.h"
#include "EmonLib.h"

EnergyMonitor emon1;

 
LiquidCrystal lcd(8, 9, 4, 5, 6, 7); // Define Pinos do Display
 
int Menu = 0; // Inicializa valores para Menu
int estado = 0; // Inicializa valores para estado
int rede = 220.0;
int pino_sct = 1;
 
void setup() {
 lcd.begin(16, 2); // Estabelece caracteres do display
 clearPrintTitle();
}
 
void loop() {
 MenuPrincipal();
}
 
void MenuPrincipal() {
 int ValEstado = 0; // Inicializa valores para ValEstado
 int x = analogRead (0);
 lcd.setCursor(0,0); // Posiciona Cursor
 
 if (x < 80) { // Define valores máximos para UP em ValEstado = 1
 } 
 else if (x < 200) {
 ValEstado = 1;
 } 
 else if (x < 400){ // Define valores máximos para Down em ValEstado = 2
 ValEstado = 2;
 }
 else if (x < 600){ // Define ação nula para Left
 ValEstado = 4;
 } 
 else if (x < 800){ // Define valores máximos para Select em ValEstado = 3
 ValEstado = 3;
 }
 
 if (Menu < 0 || Menu > 4) {
 Menu = 0; 
 }
 
 if (ValEstado != estado) {
 if (ValEstado == 1) {
 Menu = Menu - 1; 
 displayMenu(Menu);
 } else if (ValEstado == 2) {
 Menu = Menu + 1; 
 displayMenu(Menu);
 } else if (ValEstado == 3) {
 selectMenu(Menu); 
 }
 else if (ValEstado == 4) {
  displayMenu(Menu);
 }
 estado = ValEstado;
 } 
 delay(5);
}
 
void displayMenu(int x) {
 switch (x) {
 case 1:
 clearPrintTitle();
 lcd.print ("--> Medicoes <--"); // Imprime na tela a opção do Menu
 break;
 case 2:
 clearPrintTitle();
 lcd.print ("--> Calculos <--"); // Imprime na tela a opção do Menu
 break;
 case 3:
 clearPrintTitle();
 lcd.print ("---> Item 3 <---"); // Imprime na tela a opção do Menu
 break;
 case 4:
 clearPrintTitle();
 lcd.print ("---> Item 4 <---"); // Imprime na tela a opção do Menu
 break;
 }
}
 
void clearPrintTitle() {
 lcd.clear();
 lcd.setCursor(0,0);
 lcd.print(" Fisica ");
 lcd.setCursor(0,1); 
}
 
void selectMenu(int x) {
 switch (x) {
 case 1:
 clearPrintTitle();
 sensor(); // Imprime na tela opção escolhida
 break;
 case 2:
 clearPrintTitle();
 lcd.print ("Selec. Item 2"); // Imprime na tela opção escolhida
 break;
 case 3:
 clearPrintTitle();
 lcd.print ("Selec. Item 3"); // Imprime na tela opção escolhida
 break;
 case 4:
 clearPrintTitle();
 lcd.print ("Selec. Item 4"); // Imprime na tela opção escolhida
 break;
 }
}

void sensor () {

  lcd.begin(16, 2);
  lcd.clear();
  Serial.begin(9600);   
  //Pino, calibracao - Cur Const= Ratio/BurdenR. 1800/62 = 29. 
  emon1.current(pino_sct, 29);
  //Informacoes iniciais display
  lcd.setCursor(0,0);
  lcd.print("Corr.(A):");
  lcd.setCursor(0,1);
  lcd.print("Pot. (W):");
  double Irms = emon1.calcIrms(1480);
  //Mostra o valor da corrente
  Serial.print("Corrente : ");
  Serial.print(Irms); // Irms
  lcd.setCursor(10,0);
  lcd.print(Irms);
   
  //Calcula e mostra o valor da potencia
  Serial.print(" Potencia : ");
  Serial.println(Irms*rede);
  lcd.setCursor(10,1);
  lcd.print("      ");
  lcd.setCursor(10,1);
  lcd.print(Irms*rede,1);
   
  delay(1000);
}

Exibições: 496

Responder esta

Respostas a este tópico

Boa noite.

O pessoal vai recomendar você retirar o seu código da área de texto e anexa-lo como arquivo ok.

Aparentemente, você está chamando a função sensor() que é a responsável pela leitura dos sensores, apenas no switch case 1. Por isso ele só vai atualizar o valor das leituras quando o programa estiver nesse ponto.

A estrutura do seu programa está bem confusa. Se você quer que ele mantenha as leituras dos sensores constantes, chame a função sensor() no loop, e use o switch case para alternar apenas as telas do display.

Olá, obrigado por responder, mas como eu podeira chamar a função do sensor no void loop, pois já realizei esse processo, e acabou em erro

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço