最近在DF商城看到个—模拟pH计,可用于测量液体的酸碱度。想想曾经在化学实验课上还是使用pH试纸来测量溶液酸碱度,测量不仅操作复杂而且也无法得到精确的pH数值。
如今使用DF出品的硬件以及文档资料便可轻松自制pH计,用此来测量常见液体的pH值,实验室级电极测量精度在±0.1@25℃完全满足使用需求。
大家都说柠檬很酸能酸掉大牙那种,今天我们就来看看到底有多酸—来实测柠檬的pH值。
一开始选用透明屏其实并没有特殊含义,只是最近才试玩了并且觉得显示效果不错,过程中朋友问我“你都选用透明屏了为什么不让它透明,不然你选择它的意义在那”。这灵魂拷问一时间我竟无以回答。后来经过一系列的构思设计以及朋友的建议,才有了最终的展示效果。
根据pH值颜色对照表,用灯带的颜色对应不同的pH值。
X-Y坐标显示测量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
}