PH传感器LCD无显示问题求助:代码逻辑错误排查
PH传感器LCD无显示问题排查与修复
核心错误分析
主loop未执行目标逻辑
你的loop()函数仅声明了loop1()/loop2()/loop3()三个函数,没有实际调用它们,导致PH判断和LCD显示的核心逻辑完全没有运行,这是LCD无显示的最根本原因。重复初始化硬件
在每个处理函数的else分支中,重复执行lcd.init()和Serial.begin(11520):lcd.init()已经在setup()中完成初始化,重复调用会重置LCD,破坏显示状态- 串口在
setup()中已打开,重复调用无意义,还可能干扰通信
阻塞式延迟干扰程序运行
else分支里的delay(2000)会彻底阻塞程序,导致PH值无法持续读取;反复执行lcd.clear()会让屏幕频繁闪烁,甚至无法稳定显示内容。冗余代码增加维护风险
loop1/loop2/loop3逻辑几乎完全一致,仅PH判断区间不同,这种冗余代码不仅浪费资源,还容易出现不一致的错误。
修复后的代码
#include <Wire.h> #include "DFRobot_LCD.h" DFRobot_LCD lcd(16, 2); //16字符2行显示 #define PH_PIN 25 float voltage, phvalue, temperature = 25; float acidVoltage = 1990; //4.0校准液电压 float neutralVoltage = 1389; //7.0校准液电压 void breath(unsigned char color){ for(int i=0; i<255; i++){ lcd.setPWM(color, i); delay(5); } delay(500); for(int i=254; i>=0; i--){ lcd.setPWM(color, i); delay(10); // 原1000ms延迟过长,调整为合理值 } delay(300); } void setup() { Serial.begin(11520); // LCD仅初始化一次 lcd.init(); lcd.setCursor(4,0); lcd.print("Welcome"); delay(3000); lcd.clear(); lcd.setCursor(3,0); lcd.print("Reading PH"); delay(5000); lcd.clear(); lcd.setCursor(3,0); lcd.print("Please Wait"); delay(5000); lcd.clear(); } // 封装PH计算与显示逻辑,避免冗余 void checkAndDisplayPH() { static unsigned long timepoint = millis(); if(millis() - timepoint > 1000U){ timepoint = millis(); voltage = analogRead(PH_PIN)/4095.0*3300; float slope = (7.0-4.0)/((neutralVoltage-1500)/30.0 - (acidVoltage-1500)/3.0); float intercept = 7.0 - slope*(neutralVoltage-1500)/3.0; phvalue = slope*(voltage-1500)/3.0 + intercept; // PH计算公式 bool inTargetRange = false; // 检查三个目标PH区间 if ((phvalue > 3.8 && phvalue < 4.1) || (phvalue > 6.8 && phvalue < 7.1) || (phvalue > 9.8 && phvalue < 10.1)) { inTargetRange = true; Serial.print("Voltage:"); Serial.print(voltage,1); Serial.print(" PH:"); Serial.println(phvalue,2); // LCD显示PH与电压,清除残留字符 lcd.setCursor(0,0); lcd.print("PH : "); lcd.print(phvalue,2); lcd.print(" "); lcd.setCursor(0,1); lcd.print("Volt: "); lcd.print(voltage/1000,2); lcd.print("V "); } if (!inTargetRange) { Serial.println("Dosing Required"); lcd.clear(); lcd.setCursor(2,0); // 调整光标让文本居中 lcd.print("Dosing Required"); } } } void loop(){ // 调用核心处理函数 checkAndDisplayPH(); }
修复说明
- 修复主loop未调用处理函数的问题,改为调用封装后的
checkAndDisplayPH() - 移除重复的硬件初始化操作,仅在setup中执行一次
- 将三个重复函数合并为一个,通过逻辑判断覆盖所有目标PH区间,减少冗余
- 优化LCD显示格式,清除残留字符,调整光标位置让文本更美观
- 移除阻塞式延迟,改用非阻塞定时判断,保证程序持续运行
- 修正呼吸灯函数中过长的延迟,避免程序长时间卡顿
内容的提问来源于stack exchange,提问作者Muhammad Aniqchino
相关产品推荐
相关产品推荐

