Arduino 压力测量和记录
组件和用品
![]() |
| × | 1 | |||
![]() |
| × | 1 | |||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
![]() |
| × | 1 |
应用和在线服务
![]() |
|
关于这个项目
这个项目是想要记录储气罐中内置的气压以检查机械压缩机的效率的结果。
来自 George Kontaxis 的帮助
https://www.youtube.com/watch?v=AB7zgnfkEi4&feature=youtu.be
显示以巴和 PSI 为单位显示日期和压力
Arduino 压力表。读取 3 个压力
代码
- SKU237545 压力传感器,带 lcd 实时时钟和数据记录
- 设置实时时钟
SKU237545 压力传感器,带液晶实时时钟和数据记录C/C++
//使用 George 的代码创建于 2018 年 8 月 12 日的 Philip Blayney 和 Jack Davidson //Kontaxis 用于 SKU237545 压力传感器//https://www.youtube.com/watch?v=AB7zgnfkEi4&feature=youtu.be #include “ LiquidCrystal_PCF8574.h"#include "RTClib.h" // 实时时钟#include// sd 卡 #define LCD_ADDRESS 0x27 // 定义 LCD 特性#define LCD_ROWS 2#define LCD_COLUMNS 16#define SCROLL_DELAY 150#define BACKLIGHT 255 // 对象初始化LiquidCrystal_PCF8574 lcdI2C;RTC_DS1307 RTC; // 定义实时时钟对象int n =1;内部值; // Arduino 模拟引脚的简单数据记录器 #define LOG_INTERVAL 1000 // 在条目之间进行研磨(减少以获取更多/更快的数据)// 在将记录的数据永久写入磁盘之前的毫秒数 // 将其设置为 LOG_INTERVAL 以每次写入(最安全)// 将其设置为 10*LOG_INTERVAL 以每 10 次数据读取写入所有数据,如果断电,您可能最多丢失 // 最后 10 次读取,但它使用更少的电量并且速度更快!#define SYNC_INTERVAL 10000 // 在调用 flush() 之间磨合 - 将数据写入卡 600000 =10 minutesuint32_t syncTime =0; // 上次同步时间()const int chipSelect =10; // 对于数据记录屏蔽,我们使用数字引脚 10 作为 SD cs 线 File logfile;void error(char *str){ Serial.print(F("error:")); Serial.println(str);} void setup(void){ Serial.begin(9600); // 启动串口Serial.println(F("SKU237545 SENSOR的压力读数")); //F =宏函数保存动态内存lcdI2C.begin(LCD_COLUMNS, LCD_ROWS, LCD_ADDRESS, BACKLIGHT); lcdI2C.print(F("SKU237545 传感器")); lcdI2C.setCursor(0,1); lcdI2C.print(F(" bar and psi " ));延迟(2000); // 初始化 SD 卡 Serial.print(F("Initializing SD card...")); // 确保默认的片选引脚设置为 // 输出,即使您不使用它: pinMode(10, OUTPUT); if (!SD.begin(chipSelect)) { // 查看卡是否存在并且可以初始化: error("Card failed, or not present"); Serial.println(F("卡片初始化。"));字符文件名[] ="LOGGER00.CSV"; // 创建一个新文件 for (uint8_t i =0; i <100; i++) { filename[6] =i/10 + '0';文件名[7] =i%10 + '0'; if (!SD.exists(filename)) { // 只打开一个不存在的新文件 logfile =SD.open(filename, FILE_WRITE);休息; // 离开循环! } } 如果(!日志文件){ 错误(“无法创建文件”); lcdI2C.clear(); lcdI2C.setCursor(0,0); lcdI2C.print(F("文件编号")); lcdI2C.print(文件名); Serial.print(F("登录到:")); Serial.println(文件名); // 连接到 RTC if (!RTC.begin()) { logfile.println("RTC failed"); #if ECHO_TO_SERIAL Serial.println(F("RTC failed")); #endif //ECHO_TO_SERIAL } logfile.println("日期/时间,压力,bar,读数,psi,读数");延迟(5000); lcdI2C.clear(); // 清除 LCD 屏幕。} void loop(void){int sensorVal=analogRead(A1);//Serial.print("Sensor Value:");//Serial.print(sensorVal);float voltage =(sensorVal*5.0 )/1024.0;// Serial.print("Volts:");// Serial.print(电压);浮动压力_帕斯卡 =(3.0*((float)电压-0.475))*1000000.0; //在这里校准 float pressure_bar =pressure_pascal/10e5; float pressure_psi =pressure_bar*14.5038; Serial.print("压力 ="); Serial.print(pressure_bar); Serial.print("条"); Serial.print("psi"); Serial.print (pressure_psi); Serial.println();现在日期时间;现在 =RTC.now(); // 获取时间延迟((LOG_INTERVAL -1) - (millis() % LOG_INTERVAL)); // 在 SD 卡读取之间延迟我们想要的时间量 int H =now.hour(); // 立即获取小时数并将它们存储在一个名为 h 的整数中 int M =now.minute(); // 立即获取分钟并将它们存储在一个名为 m int S =now.second(); 的整数中; // 立即获取秒数并将它们存储在一个名为 s 的整数中 logfile.print(now.year(), DEC); logfile.print("/"); logfile.print(now.month(), DEC); logfile.print("/"); logfile.print(now.day(), DEC);日志文件。打印(“”); if (H<10){ // 如有必要,添加一个零,如上 logfile.print(0); } logfile.print(now.hour(), DEC); logfile.print(":"); if (M<10){ // 如有必要,添加一个零,如上 logfile.print(0); } logfile.print(now.minute(), DEC); logfile.print(":"); if (S<10){ // 如有必要,添加一个零,如上 logfile.print(0); } logfile.print(now.second(), DEC); // logfile.print('"'); Serial.println(); Serial.print(now.year(), DEC); Serial.print("/"); Serial.print(now.month(), DEC) ); Serial.print("/"); Serial.print(now.day(), DEC); Serial.print(" "); if (H<10){ // 如有必要加一个零,同上Serial.print(0); } Serial.print(now.hour(), DEC); Serial.print(":"); if (M<10){ // 如有必要,如上 Serial. print(0); } Serial.print(now.minute(), DEC); Serial.print(F(":")); if (S<10){ // 如有必要,添加一个零,如上 Serial .print(0); } Serial.print(now.second(), DEC); Serial.println(); lcdI2C.setCursor(0,0); lcdI2C.print(pressure_bar); // 首先将字符串打印到 LCD line lcdI2C.print ("bar"); lcdI2C.print (pressure_psi); lcdI2C.print ("psi"); lcdI2C.setCursor(0,1); //lcdI2C.print(now.year(), DEC); // lcd 没有足够的字符空间来显示年份 // lcdI2C.print("/"); lcdI2C.print(now.day(), DEC); lcdI2C.print("/"); lcdI2C.print(now .month(), DEC); lcdI2C.print(" "); if (H<10){ // 如有必要,添加一个零,如上 lcdI2C.print(0); lcdI2C.print(now.hour(), DEC); lcdI2C.print(":"); if (M<10){ // 添加一个零,如有必要,如上 lcdI2C.print(0); lcdI2C.print(now.minute(), DEC); lcdI2C.print(":"); if (S<10){ // 如有必要,添加一个零,如上 lcdI2C.print(0); lcdI2C.print(now.second(), DEC); logfile.print(", "); logfile.print(" 压力 ="); logfile.print(","); logfile.print(pressure_bar); logfile.print(","); logfile.print(" bar "); logfile.print(","); logfile.print(pressure_psi); logfile.print(","); logfile.print("psi"); logfile.println(); if ((millis() - syncTime) 设置实时时钟C/C++
//Code by tronixstuff#include "Wire.h"#define DS3231_I2C_ADDRESS 0x68// 将普通十进制数转换为二进制编码的十进制字节 decToBcd(byte val){ return( (val/10*16) + (val%10) );}// 将二进制编码的十进制数转换为正常的十进制数byte bcdToDec(byte val){ return( (val/16*10) + (val%16) );}void setup(){ Wire.begin(); Serial.begin(9600); // 这里设置初始时间: // DS3231 秒、分、小时、日、日、月、年 setDS3231time(00,43,14,3,14,8,18); // 在此设置所需时间}void setDS3231time(byte second, byte minute, byte hour, byte dayOfWeek, bytedayOfMonth, byte month, byte year){ // 将时间和日期数据设置为 DS3231 Wire.beginTransmission(DS3231_I2C_ADDRESS); Wire.write(0); // 设置下一个输入从秒寄存器开始 Wire.write(decToBcd(second)); // 设置秒 Wire.write(decToBcd(minute)); // 设置分钟 Wire.write(decToBcd(hour)); // 设置小时 Wire.write(decToBcd(dayOfWeek)); // 设置星期几 (1=Sunday, 7=Saturday) Wire.write(decToBcd(dayOfMonth)); // 设置日期(1 到 31) Wire.write(decToBcd(month)); // 设置月份 Wire.write(decToBcd(year)); // 设置年份(0 到 99) Wire.endTransmission();}void readDS3231time(byte *second,byte *minute,byte *hour,byte *dayOfWeek,byte *dayOfMonth,byte *month,byte *year){ Wire.开始传输(DS3231_I2C_ADDRESS); Wire.write(0); // 将 DS3231 寄存器指针设置为 00h Wire.endTransmission(); Wire.requestFrom(DS3231_I2C_ADDRESS, 7); // 从寄存器 00h 开始从 DS3231 请求七个字节的数据 *second =bcdToDec(Wire.read() &0x7f); *分钟 =bcdToDec(Wire.read()); *小时 =bcdToDec(Wire.read() &0x3f); *dayOfWeek =bcdToDec(Wire.read()); *dayOfMonth =bcdToDec(Wire.read()); *month =bcdToDec(Wire.read()); *year =bcdToDec(Wire.read());}void displayTime(){ byte second, minute, hour, dayOfWeek, dayOfMonth, month, year; // 从 DS3231 检索数据 readDS3231time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year); // 将其发送到串行监视器 Serial.print(hour, DEC); // 显示时将字节变量转换为十进制数 Serial.print(":");如果(分钟<10){ Serial.print(“0”); Serial.print(minute, DEC); Serial.print(":"); if (second<10) { Serial.print("0"); Serial.print(second, DEC); Serial.print(" "); Serial.print(dayOfMonth, DEC); Serial.print("/"); Serial.print(month, DEC); Serial.print("/"); Serial.print(year, DEC); Serial.print(" 星期几:"); switch(dayOfWeek){ case 1:Serial.println("Sunday");休息;情况 2:Serial.println("星期一");休息;案例 3:Serial.println("Tuesday");休息;案例 4:Serial.println("星期三");休息;案例 5:Serial.println("星期四");休息;案例 6:Serial.println("星期五");休息;案例 7:Serial.println("星期六");休息; }}void loop(){ displayTime(); // 在串口监视器上显示实时时钟数据,delay(1000); // 每秒}LiquidCrystal_PCF8574.h
所需的库,在 Sketch 下,包含库并添加 .zip,然后选择下载 zip 的位置 https://github.com/mathertel/LiquidCrystal_PCF8574RTClib.h
图书馆,实时时钟,先解压zip。然后将剩余的 zip 文件添加到您的库中 https://github.com/mechasolution/RTClib.h
示意图

A4转SDA
5 伏至 VCC
地对地

黑线到GND
红线到 5 伏



制造工艺