From 7f6c30553b673b0d9380604cf37f15b31441c9ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BF=B1=20=E6=B2=88?= <2401809606@qq.com> Date: Thu, 1 Jan 2026 14:00:05 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0ads111x=E9=A9=B1=E5=8A=A8,?= =?UTF-8?q?=E4=BE=A6=E6=B5=8B=E5=90=84=E7=94=B5=E6=BA=90=E6=80=BB=E7=BA=BF?= =?UTF-8?q?=E7=8A=B6=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .cproject | 20 ++- .project | 2 +- applications/data/DATA_comm.c | 4 + applications/data/Variable.c | 5 +- applications/data/Variable.h | 4 + applications/drv/drv_ads111x.c | 226 +++++++++++++++++++++++++++++++++ packages/packages.dbsqlite | Bin 425984 -> 430080 bytes packages/pkgs.json | 20 +++ 8 files changed, 273 insertions(+), 8 deletions(-) create mode 100644 applications/drv/drv_ads111x.c diff --git a/.cproject b/.cproject index 42d764f..3adf0d2 100644 --- a/.cproject +++ b/.cproject @@ -533,7 +533,9 @@ - + + + @@ -699,7 +701,9 @@ - + + + @@ -856,7 +860,9 @@ - + + + @@ -1014,7 +1020,9 @@ - + + + @@ -1024,7 +1032,7 @@ - + @@ -1044,7 +1052,7 @@ - + diff --git a/.project b/.project index f059ea4..350c330 100644 --- a/.project +++ b/.project @@ -1,6 +1,6 @@ - 828F + project diff --git a/applications/data/DATA_comm.c b/applications/data/DATA_comm.c index c85c137..a0899e3 100644 --- a/applications/data/DATA_comm.c +++ b/applications/data/DATA_comm.c @@ -132,6 +132,10 @@ void pasre_DAT(const char *api, const char *json_str) cJSON_AddItemToObject(dat,"SYSHUM",cJSON_CreateNumber(sys_humidity)); cJSON_AddItemToObject(dat,"SYSTIME",cJSON_CreateString(systime)); cJSON_AddItemToObject(dat,"NAME",cJSON_CreateString(machine_name)); + cJSON_AddItemToObject(dat,"PBAT",cJSON_CreateNumber(pow_bat)); + cJSON_AddItemToObject(dat,"PCODE",cJSON_CreateNumber(pow_code)); + cJSON_AddItemToObject(dat,"PDEV1",cJSON_CreateNumber(pow_dev1)); + cJSON_AddItemToObject(dat,"PDEV2",cJSON_CreateNumber(pow_dev2)); cJSON_AddItemToObject(dat,"VAR",cJSON_CreateString(sys_var)); } else if (strcmp(api, "SC810") == 0) diff --git a/applications/data/Variable.c b/applications/data/Variable.c index 3743962..8b84993 100644 --- a/applications/data/Variable.c +++ b/applications/data/Variable.c @@ -8,7 +8,10 @@ rt_int32_t sys_humidity;//主机环境湿度 char sys_var[8];//主机版本0.0.00A unsigned char sys_time[6];//系统时间 unsigned int sys_run_time;//运行时间 - +int pow_bat;//电池电压 +int pow_code;//主电压 +int pow_dev1;//设备电压.通讯 +int pow_dev2;//设备电压,其它 // 动态数据缓冲区(初始化为 NULL,后续分配) char *DATA_dat; diff --git a/applications/data/Variable.h b/applications/data/Variable.h index 6090254..455dc4a 100644 --- a/applications/data/Variable.h +++ b/applications/data/Variable.h @@ -9,6 +9,10 @@ extern rt_int32_t sys_humidity;//主机环境湿度 extern char sys_var[8];//主机版本0.0.00A extern unsigned char sys_time[6];//系统时间 extern unsigned int sys_run_time;//运行时间 +extern int pow_bat;//电池电压 +extern int pow_code;//主电压 +extern int pow_dev1;//设备电压.通讯 +extern int pow_dev2;//设备电压,其它 // ===== 字符串变量 ===== extern char *DATA_dat; diff --git a/applications/drv/drv_ads111x.c b/applications/drv/drv_ads111x.c new file mode 100644 index 0000000..ac96d73 --- /dev/null +++ b/applications/drv/drv_ads111x.c @@ -0,0 +1,226 @@ +/* + * Copyright (c) 2025, Your Name + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2025-12-27 Developer First version for ADS1115 on RT-Thread + */ + +#include +#include +#include +#include "Variable.h" + +#define DBG_TAG "sensor.ads1115" +#define DBG_LVL DBG_LOG +#include + +/* ADS1115 I2C 地址(A0 引脚接地时为 0x48) */ +#define ADS1115_I2C_ADDR 0x48 +/* 使用的 I2C 总线设备名 */ +#define ADS1115_I2C_BUS_NAME "i2c2" // 根据你的板子修改,如 "i2c1" + +/* ADS1115 寄存器地址 */ +#define ADS1115_REG_CONVERT 0x00 +#define ADS1115_REG_CONFIG 0x01 + +static struct rt_i2c_bus_device *i2c_bus = RT_NULL; + +/** + * 向 ADS1115 写入配置寄存器 + */ +static rt_err_t ads1115_write_config(rt_uint16_t config) +{ + rt_uint8_t buf[3] = { + ADS1115_REG_CONFIG, + (rt_uint8_t)(config >> 8), + (rt_uint8_t)(config & 0xFF) + }; + + struct rt_i2c_msg msgs[1] = { + { + .addr = ADS1115_I2C_ADDR, + .flags = RT_I2C_WR, + .buf = buf, + .len = 3, + } + }; + + if (rt_i2c_transfer(i2c_bus, msgs, 1) != 1) + { + LOG_E("Failed to write config register."); + return -RT_ERROR; + } + return RT_EOK; +} + +/** + * 从 ADS1115 读取转换结果 + */ +static rt_err_t ads1115_read_conversion(rt_int16_t *value) +{ + rt_uint8_t buf[2] = {0}; + + struct rt_i2c_msg msgs[2] = { + { + .addr = ADS1115_I2C_ADDR, + .flags = RT_I2C_WR, + .buf = (rt_uint8_t[]){ADS1115_REG_CONVERT}, + .len = 1, + }, + { + .addr = ADS1115_I2C_ADDR, + .flags = RT_I2C_RD, + .buf = buf, + .len = 2, + } + }; + + if (rt_i2c_transfer(i2c_bus, msgs, 2) != 2) + { + LOG_E("Failed to read conversion register."); + return -RT_ERROR; + } + + *value = (rt_int16_t)((buf[0] << 8) | buf[1]); + return RT_EOK; +} + +/** + * 读取指定通道的 ADC 值(单端输入) + * channel: 0 ~ 3 (对应 AIN0~AIN3 对 GND) + * 返回:RT_EOK 或错误码 + */ +static rt_err_t ads1115_read_channel(rt_uint8_t channel, rt_int16_t *raw_value) +{ + if (channel > 3) + { + LOG_E("Invalid channel: %d", channel); + return -RT_EINVAL; + } + + // 配置:OS=1, MUX=100+ch (单端), PGA=001 (±4.096V), MODE=1 (single), DR=100 (128SPS) + rt_uint16_t config = 0x8000 | // OS = 1 + ((0x04 | channel) << 12) | // MUX: AINx vs GND + (0x01 << 9) | // PGA = ±4.096V + (0x01 << 8) | // MODE = single-shot + (0x04 << 5); // DR = 128 SPS + + if (ads1115_write_config(config) != RT_EOK) + { + return -RT_ERROR; + } + + rt_thread_mdelay(10); // 等待转换完成(128SPS ≈ 8ms) + + return ads1115_read_conversion(raw_value); +} + + +/** + * 将原始 ADC 值转换为毫伏(mV) + * 假设使用 ±2.048V 量程(PGA=1),则 LSB = 2.048V / 32768 ≈ 0.0625 mV/LSB + * 但因为是单端且参考地,实际范围 0~2.048V → 满量程 2.048V = 32768 LSB + * 所以:Voltage(mV) = raw * (2048 / 32768) = raw * 0.0625 + */ +static rt_int32_t ads1115_raw_to_mv(rt_int16_t raw) +{ + /* 注意:单端模式下,raw 应为正数(0 ~ 32767)*/ + return (rt_int32_t)(((rt_int64_t)raw * 125) / 1000); // 等价于 raw * 0.0625 * 1000 +} + +/** + * ADS1115 读取线程(示例:读取 AIN0) + */ +static void ads1115_thread_entry(void *parameter) +{ + rt_int16_t raw = 0 ,mt = 3600; + + while (1) + { + if(mt>3600) + { + if (ads1115_read_channel(0, &raw) == RT_EOK) + { + pow_bat = ads1115_raw_to_mv(raw); + } + else + { + LOG_E("Failed to read ADS1115 P_BAT"); + } + } + else + { + mt = 0; + } + + if (ads1115_read_channel(1, &raw) == RT_EOK) + { + pow_code = ads1115_raw_to_mv(raw); + } + else + { + LOG_E("Failed to read ADS1115 P_CODE"); + } + + if (ads1115_read_channel(2, &raw) == RT_EOK) + { + pow_dev1 = ads1115_raw_to_mv(raw); + } + else + { + LOG_E("Failed to read ADS1115 P_DEV1"); + } + + if (ads1115_read_channel(3, &raw) == RT_EOK) + { + pow_dev2 = ads1115_raw_to_mv(raw); + } + else + { + LOG_E("Failed to read ADS1115 P_DEV2"); + } + + + rt_thread_mdelay(1000); // 每 秒读取一次 + } +} + +/** + * ADS1115 驱动初始化函数 + */ +static int rt_hw_ads1115_init(void) +{ + i2c_bus = rt_i2c_bus_device_find(ADS1115_I2C_BUS_NAME); + if (i2c_bus == RT_NULL) + { + LOG_E("Failed to find I2C bus: %s", ADS1115_I2C_BUS_NAME); + return -RT_ENOSYS; + } + + LOG_I("Found I2C bus: %s", ADS1115_I2C_BUS_NAME); + + /* 创建读取线程 */ + rt_thread_t tid = rt_thread_create("ads1115", + ads1115_thread_entry, + RT_NULL, + 512, + RT_THREAD_PRIORITY_MAX - 2, + 10); + if (tid != RT_NULL) + { + rt_thread_startup(tid); + } + else + { + LOG_E("Failed to create ADS1115 thread."); + return -RT_ERROR; + } + + return RT_EOK; +} + +/* 自动初始化 */ +INIT_APP_EXPORT(rt_hw_ads1115_init); diff --git a/packages/packages.dbsqlite b/packages/packages.dbsqlite index 97c5b00441b391c87ae47c635d2dce87ffa4c2db..5ac3905e1102201a68c09eddbcaae629b03b258f 100644 GIT binary patch delta 2021 zcma)7&2QX96yIdMTSS|NB7xLGq#igRq^!pC;h9khZAg|7(o`jF4$zgH@qA>hCbn67 zDJ@7&1X3kVpdKRiGDwgs;^UD20jalMIdJZsGqa&ly;7Xi(pZ|2-uu1Zd%ySI&d#Ns zpDz9IR_jTl(TIP%e0Ac5k`4>tKJT9j-OsYy7%*CTq{V+1hGNdw+WC&3~KUH7`#7Jo)y-zl0sw!5zP+QaRk#Ns;%mSQf*9&U>55FpQH>$Y9Lm zxkcweoCQ(?iXh;c3n7720j7*%$v6XmNq*0M)Y_eR4q3hortE8ZH#F%W9A-)sIyfWjLeI(A3VKD($kW z?WG&*BW=$wkUGc!0VEWZBvR0+914OZP{wBrG03Iv*=ycvh29vuTMKED%R!tKFWisx zSD~ahrP%q$QX0;MBSulATt58(8%F6Jd(~U1^S{=eUtH~Ww$%&wG%O zNCvv=OQAVYI`SbVpV<$*r8@W5mlwJ>ZXH{Vy_GB8JLTtg&RedtUQEBbZ{qsCArP|2 zP!kbXJI*7YL8&yyC>W&!`91r7eP%nGaS>nJOimD{K!_1(6gEIY0h!{=b%GHF`&`pN ztl2Aj|J-ZO96TGg-+1-)DK}qRQ%@Vy-%p=C|M)zedV26_)_%}B*vQ&<5C4BpmK*lE zw_ZoMT7*u&daD*3`GjKaN5Hr`N3J_*fEbc2fD#y@q7A!J3sLr}UOTdSt71q46m!i& zBLf3SjfoUTPF(JTfbk%)pLk!?(Ma9wAMJ)T4>M87emE$?qCe0=b;?>q>Y71C!iS9b zMls5KHwKB(NC|2r)Zf_U*6!Il$YZw7pqTw1bT-#T5ht5@CrirBI>rh>#DT$36NnGz z5m8u4L`6gq!78^OkA~lv`AM@c6K?;+NnVJpEj>6g1Bc79(!BynL%4Qog?hB^r~(*E LBsmW#3K;tjE5@1R delta 104 zcmZozAl1+yH9?wn4+8^3#zX~s#yuMomhf|=@-77mFl0>T5jZv7ubo9}lj2gI=B2Xj zOJx~>m