You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PH传感器LCD无显示问题求助:代码逻辑错误排查

PH传感器LCD无显示问题排查与修复

核心错误分析

  1. 主loop未执行目标逻辑
    你的loop()函数仅声明了loop1()/loop2()/loop3()三个函数,没有实际调用它们,导致PH判断和LCD显示的核心逻辑完全没有运行,这是LCD无显示的最根本原因。

  2. 重复初始化硬件
    在每个处理函数的else分支中,重复执行lcd.init()和Serial.begin(11520):

    • lcd.init()已经在setup()中完成初始化,重复调用会重置LCD,破坏显示状态
    • 串口在setup()中已打开,重复调用无意义,还可能干扰通信
  3. 阻塞式延迟干扰程序运行
    else分支里的delay(2000)会彻底阻塞程序,导致PH值无法持续读取;反复执行lcd.clear()会让屏幕频繁闪烁,甚至无法稳定显示内容。

  4. 冗余代码增加维护风险
    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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 11:40:39