用透明屏+pH电极做一个pH计

本文介绍了如何使用DF商城的模拟pH计V2和相关硬件,结合ESP32-C3微控制器,DIY一款手持pH计。通过精确测量,揭示了柠檬的pH值,展现了从设计到制作的完整过程,包括电路连接、程序编写等,并利用RGB灯带以颜色变化展示不同pH值。
摘要由CSDN通过智能技术生成

最近在DF商城看到个—模拟pH计,可用于测量液体的酸碱度。想想曾经在化学实验课上还是使用pH试纸来测量溶液酸碱度,测量不仅操作复杂而且也无法得到精确的pH数值。
如今使用DF出品的硬件以及文档资料便可轻松自制pH计,用此来测量常见液体的pH值,实验室级电极测量精度在±0.1@25℃完全满足使用需求。
大家都说柠檬很酸能酸掉大牙那种,今天我们就来看看到底有多酸—来实测柠檬的pH值。





一开始选用透明屏其实并没有特殊含义,只是最近才试玩了并且觉得显示效果不错,过程中朋友问我“你都选用透明屏了为什么不让它透明,不然你选择它的意义在那”。这灵魂拷问一时间我竟无以回答。后来经过一系列的构思设计以及朋友的建议,才有了最终的展示效果。



根据pH值颜色对照表,用灯带的颜色对应不同的pH值。


X-Y坐标显示测量pH值的变化曲线

横坐标对应显示pH值



 

DIY手持式pH计







材料清单:




硬件组装:

安装电源开关


用电磨机给外壳开孔


固定pH计的信号转接板


用塑料片固定透明屏

 

连接透明屏转接板


焊接且固定C3的扩展板


插上C3


连接3.7V电池


打孔安装灯带



额。。。翻车了,3颗坏2颗(南瘦)


算了,还是重新设计一下吧,绘制图纸


用激光切割亚克力板



在反面切割开孔并安装亚克力板
使用切割工具须小心注意安全



将前盖与后盖组合起来



在外壳正面贴上黑色贴纸



连接上pH计探头




到此你便得到了一个精雕细刻、流光溢彩、妙不可言的pH计!



最后有一说一柠檬真的很酸!




实用工具推荐
钩式测试夹
在pH计的制作过程中非常实用的工具,在测试与焊接前使用钩式测试夹,直接钩住焊孔,连接稳定解放双手;彩色的设计更容易区分电路。






程序

 

#include <Arduino.h>
#include <U8g2lib.h>
#include <SPI.h>

#if defined ARDUINO_SAM_ZERO
#define OLED_DC  7
#define OLED_CS  5
#define OLED_RST 6
/*ESP32 */
#elif defined(ESP32)
#define OLED_DC  1
#define OLED_CS  7
#define OLED_RST 6
/*ESP8266*/
#elif defined(ESP8266)
#define OLED_DC  D4
#define OLED_CS  D6
#define OLED_RST D5
/*AVR series board*/
#else 
#define OLED_DC  2
#define OLED_CS  3
#define OLED_RST 4
#endif
U8G2_SSD1309_128X64_NONAME2_1_4W_HW_SPI u8g2(/* rotation=*/U8G2_R0, /* cs=*/ OLED_CS, /* dc=*/ OLED_DC,/* reset=*/OLED_RST);
const uint8_t col[] U8X8_PROGMEM= {0x00,0x00,0x1F,0x0E,0x04}; 

#include "DFRobot_PH.h"
#include <EEPROM.h>

#define PH_PIN A0
float voltage,voltage1,phValue,temperature = 25;
float acidVoltage = 2032.44; 
float neutralVoltage = 1500.0; 
int w;
int qw;

float  w0,w1,w2,w3,w4,w5,w6,w7,w8;

int p;

float randNumber;//随机数

DFRobot_PH ph;

void setup()
    {
        Serial.begin(115200);
        ph.begin();
        
        u8g2.begin();
 u8g2.setFontPosTop();
    }

void loop()
    {
        static unsigned long timepoint = millis();
        if(millis()-timepoint>1000U){                  //time interval: 1s
            timepoint = millis();
            //temperature = readTemperature();         // read your temperature sensor to execute temperature compensation
            
              voltage = analogRead(PH_PIN)/4096.0*2900;  // read the voltage
          //  voltage = analogRead(PH_PIN)/1024.0*5000;
             
            phValue = ph.readPH(voltage,temperature);  // convert voltage to pH with temperature compensation
            Serial.print("temperature:");
            Serial.print(temperature,1);
            Serial.print("^C  pH:");
            Serial.print(phValue,2);


//voltage1=voltage-1500.00;
voltage1=voltage*0.001;
            
            Serial.print("  voltage:");
            Serial.print(voltage1);
            Serial.println("mV");


            
        }
        ph.calibration(voltage,temperature);           // calibration process by Serail CMD



  w=map(phValue, 0, 15, 5, 99);
  qw=map(phValue, 0, 15, 2, 39);

w8=w7;
w7=w6;
w6=w5;
w5=w4;
  w4=w3;
  w3=w2;
  w2=w1;
  w1=w0;
  w0=qw;




      u8g2.firstPage();   
  do
  {

  u8g2.drawLine(5, 54, 104, 54);
  
  
  u8g2.drawLine(50, 0, 50, 40);
  u8g2.drawLine(50, 40, 120, 40);
  
  //u8g2.clearBuffer();        
    u8g2.setFont(u8g2_font_t0_11b_tr  );  
    u8g2.drawStr(5,55,"0");  
    u8g2.drawStr(50,55,"7");
    u8g2.drawStr(95,55,"14");
 //  u8g2.drawStr(w,50,"^");
u8g2.drawXBMP( /* x=*/w , /* y=*/49 , /* width=*/5 , /* height=*/5 , col );


u8g2.drawLine(58, w7, 50, w8);
u8g2.drawLine(66, w6, 58, w7);
u8g2.drawLine(74, w5, 66, w6);
u8g2.drawLine(82, w4, 74, w5);

u8g2.drawLine(90, w3, 82, w4);
u8g2.drawLine(98, w2, 90, w3);
u8g2.drawLine(106, w1, 98, w2);
u8g2.drawLine(114, w0, 106, w1);


       u8g2.setFont(u8g2_font_HelvetiPixelOutline_tr);
    u8g2.setCursor(/* x=*/1, /* y=*/10);    //Define the cursor of print function, any output of the print function will start at this position.
    u8g2.print(phValue);

    u8g2.sendBuffer();          

  } while( u8g2.nextPage() );

 // delay(1000);
  
    }

float readTemperature()
    {
      //add your code here to get the temperature from your temperature sensor
    }

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

派大星m

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值