Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
C
car-controlserver
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wenzhongjian
car-controlserver
Commits
170e1f10
Commit
170e1f10
authored
May 22, 2025
by
957dd
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
feat:加入了霍尔传感器的使用和读值与上报
parent
14829c54
Hide whitespace changes
Inline
Side-by-side
Showing
16 changed files
with
239 additions
and
90 deletions
+239
-90
CMakeLists.txt
CMakeLists.txt
+1
-1
Makefile
build/Makefile
+27
-0
version.h
build/include/version.h
+2
-2
main
build/main
+0
-0
mqtt.h
include/mqtt.h
+3
-0
softiic.h
include/softiic.h
+5
-4
ip.c
src/ip.c
+1
-1
mqtt.c
src/mqtt.c
+32
-4
softiic.c
src/softiic.c
+29
-28
thread_main.c
src/thread_main.c
+6
-2
INA226.c
system/sensor/INA226.c
+38
-37
INA226.h
system/sensor/INA226.h
+6
-5
ads1115.c
system/sensor/ads1115.c
+66
-0
ads1115.h
system/sensor/ads1115.h
+15
-0
main.c
usr/main.c
+6
-6
main.h
usr/main.h
+2
-0
No files found.
CMakeLists.txt
View file @
170e1f10
cmake_minimum_required
(
VERSION 3.10
)
cmake_minimum_required
(
VERSION 3.10
)
project
(
DeviceControlSystem
project
(
DeviceControlSystem
VERSION 1.1.
2
VERSION 1.1.
3
LANGUAGES C
LANGUAGES C
)
)
...
...
build/Makefile
View file @
170e1f10
...
@@ -760,6 +760,30 @@ system/sensor/INA226.c.s:
...
@@ -760,6 +760,30 @@ system/sensor/INA226.c.s:
$(MAKE)
$(MAKESILENT)
-f
CMakeFiles/main.dir/build.make CMakeFiles/main.dir/system/sensor/INA226.c.s
$(MAKE)
$(MAKESILENT)
-f
CMakeFiles/main.dir/build.make CMakeFiles/main.dir/system/sensor/INA226.c.s
.PHONY
:
system/sensor/INA226.c.s
.PHONY
:
system/sensor/INA226.c.s
system/sensor/ads1115.o
:
system/sensor/ads1115.c.o
.PHONY
:
system/sensor/ads1115.o
# target to build an object file
system/sensor/ads1115.c.o
:
$(MAKE)
$(MAKESILENT)
-f
CMakeFiles/main.dir/build.make CMakeFiles/main.dir/system/sensor/ads1115.c.o
.PHONY
:
system/sensor/ads1115.c.o
system/sensor/ads1115.i
:
system/sensor/ads1115.c.i
.PHONY
:
system/sensor/ads1115.i
# target to preprocess a source file
system/sensor/ads1115.c.i
:
$(MAKE)
$(MAKESILENT)
-f
CMakeFiles/main.dir/build.make CMakeFiles/main.dir/system/sensor/ads1115.c.i
.PHONY
:
system/sensor/ads1115.c.i
system/sensor/ads1115.s
:
system/sensor/ads1115.c.s
.PHONY
:
system/sensor/ads1115.s
# target to generate assembly for a file
system/sensor/ads1115.c.s
:
$(MAKE)
$(MAKESILENT)
-f
CMakeFiles/main.dir/build.make CMakeFiles/main.dir/system/sensor/ads1115.c.s
.PHONY
:
system/sensor/ads1115.c.s
system/sensor/heat.o
:
system/sensor/heat.c.o
system/sensor/heat.o
:
system/sensor/heat.c.o
.PHONY
:
system/sensor/heat.o
.PHONY
:
system/sensor/heat.o
...
@@ -1446,6 +1470,9 @@ help:
...
@@ -1446,6 +1470,9 @@ help:
@
echo
"... system/sensor/INA226.o"
@
echo
"... system/sensor/INA226.o"
@
echo
"... system/sensor/INA226.i"
@
echo
"... system/sensor/INA226.i"
@
echo
"... system/sensor/INA226.s"
@
echo
"... system/sensor/INA226.s"
@
echo
"... system/sensor/ads1115.o"
@
echo
"... system/sensor/ads1115.i"
@
echo
"... system/sensor/ads1115.s"
@
echo
"... system/sensor/heat.o"
@
echo
"... system/sensor/heat.o"
@
echo
"... system/sensor/heat.i"
@
echo
"... system/sensor/heat.i"
@
echo
"... system/sensor/heat.s"
@
echo
"... system/sensor/heat.s"
...
...
build/include/version.h
View file @
170e1f10
#define PROJECT_VERSION_MAJOR 1
#define PROJECT_VERSION_MAJOR 1
#define PROJECT_VERSION_MINOR 1
#define PROJECT_VERSION_MINOR 1
#define PROJECT_VERSION_PATCH
2
#define PROJECT_VERSION_PATCH
3
#define GIT_HASH ""
#define GIT_HASH ""
#define BUILD_TIMESTAMP "2025-05-2
0T12:37:15
"
#define BUILD_TIMESTAMP "2025-05-2
2T11:00:34
"
#define BUILD_USER "orangepi"
#define BUILD_USER "orangepi"
build/main
View file @
170e1f10
No preview for this file type
include/mqtt.h
View file @
170e1f10
...
@@ -13,6 +13,9 @@ extern char* TOPIC2_BACK;
...
@@ -13,6 +13,9 @@ extern char* TOPIC2_BACK;
extern
char
*
TOPIC3_BACK
;
extern
char
*
TOPIC3_BACK
;
extern
uint16_t
AppExit_pin_pwm
;
extern
uint16_t
AppExit_pin_pwm
;
extern
int
heartbeat_count
;
//心跳计时
//extern ThreadPool *pool;
//extern ThreadPool *pool;
#define BROKER_ADDRESS "119.45.167.177"
#define BROKER_ADDRESS "119.45.167.177"
#define BROKER_PORT 1883
#define BROKER_PORT 1883
...
...
include/softiic.h
View file @
170e1f10
...
@@ -5,15 +5,15 @@ extern int sda_pin; // GPIO0
...
@@ -5,15 +5,15 @@ extern int sda_pin; // GPIO0
extern
int
scl_pin
;
// GPIO1
extern
int
scl_pin
;
// GPIO1
// I2C 起始信号
// I2C 起始信号
void
i2c_start
(
int
sda
_pin
,
int
scl_pin
);
void
i2c_start
(
int
sda
,
int
scl
);
// I2C 停止信号
// I2C 停止信号
void
i2c_stop
(
int
sda
_pin
,
int
scl_pin
);
void
i2c_stop
(
int
sda
,
int
scl
);
// I2C 发送一个字节
// I2C 发送一个字节
void
i2c_write_byte
(
int
sda
_pin
,
int
scl_pin
,
uint8_t
data
);
void
i2c_write_byte
(
int
sda
,
int
scl
,
uint8_t
data
);
// I2C 读取一个字节
// I2C 读取一个字节
uint8_t
i2c_read_byte
(
int
sda
_pin
,
int
scl_pin
,
bool
ack
);
uint8_t
i2c_read_byte
(
int
sda
,
int
scl
,
bool
ack
);
#endif
#endif
\ No newline at end of file
src/ip.c
View file @
170e1f10
...
@@ -24,7 +24,7 @@ int ipaddr() {//获取ip
...
@@ -24,7 +24,7 @@ int ipaddr() {//获取ip
}
}
//printf("ip:%s\n",ip_address);
//printf("ip:%s\n",ip_address);
my_zlog_debug
(
"ip:%s"
,
ip_address
);
//
my_zlog_debug("ip:%s",ip_address);
freeifaddrs
(
ifap
);
freeifaddrs
(
ifap
);
...
...
src/mqtt.c
View file @
170e1f10
...
@@ -12,9 +12,12 @@
...
@@ -12,9 +12,12 @@
#include "fileopen.h"
#include "fileopen.h"
#include "device_change.h"
#include "device_change.h"
#include "judg.h"
#include "judg.h"
#include "ads1115.h"
struct
mosquitto
*
mosq
;
struct
mosquitto
*
mosq
;
int
heartbeat_count
=
0
;
char
*
TOPIC
=
NULL
;
char
*
TOPIC
=
NULL
;
char
*
TOPIC2
=
NULL
;
char
*
TOPIC2
=
NULL
;
char
*
TOPIC3
=
NULL
;
char
*
TOPIC3
=
NULL
;
...
@@ -71,8 +74,7 @@ void on_connect(struct mosquitto *mosq, void *obj, int rc) {//回调函数
...
@@ -71,8 +74,7 @@ void on_connect(struct mosquitto *mosq, void *obj, int rc) {//回调函数
}
}
}
}
void
mqtt_wirte
(){
//心跳格式,每5s一次心跳
void
heartbeat_send
()
{
//心跳发送格式
float
voltage
=
INA226_readBusVoltage
(
sda_pin
,
scl_pin
);
float
voltage
=
INA226_readBusVoltage
(
sda_pin
,
scl_pin
);
float
current
=
INA226_readCurrent
(
sda_pin
,
scl_pin
);
float
current
=
INA226_readCurrent
(
sda_pin
,
scl_pin
);
char
voltage_str
[
20
];
// 足够存储转换后的字符串的缓冲区
char
voltage_str
[
20
];
// 足够存储转换后的字符串的缓冲区
...
@@ -86,7 +88,7 @@ void mqtt_wirte(){//心跳格式,每5s一次心跳
...
@@ -86,7 +88,7 @@ void mqtt_wirte(){//心跳格式,每5s一次心跳
char
*
version_num
=
program_version
();
char
*
version_num
=
program_version
();
if
(
heat_tem
()
!=
0
)
{
//获取CPU温度
if
(
heat_tem
()
!=
0
)
{
//获取CPU温度
my_zlog_debug
(
"获取cpu温度失败"
);
}
}
message
=
1
;
message
=
1
;
...
@@ -117,8 +119,34 @@ void mqtt_wirte(){//心跳格式,每5s一次心跳
...
@@ -117,8 +119,34 @@ void mqtt_wirte(){//心跳格式,每5s一次心跳
mosquitto_publish
(
mosq
,
NULL
,
TOPIC3
,
strlen
(
payload
),
payload
,
0
,
false
);
mosquitto_publish
(
mosq
,
NULL
,
TOPIC3
,
strlen
(
payload
),
payload
,
0
,
false
);
cJSON_Delete
(
root
);
// 释放 cJSON 对象
cJSON_Delete
(
root
);
// 释放 cJSON 对象
}
void
angle_mqtt_send
()
{
float
angle_shot
=
ads1115_read_channel
(
2
);
if
(
angle_shot
>
0
){
angle_shot
=
ads1115_read_channel
(
2
)
*
365
/
5
;
my_zlog_debug
(
"%.2f"
,
angle_shot
);
topic_middle_value
();
cJSON
*
root
=
cJSON_CreateObject
();
char
TOPIC_send_angle
[
26
];
sprintf
(
TOPIC_send_angle
,
"dev_rtinfo/%s"
,
TOPIC3
);
cJSON_AddStringToObject
(
root
,
"type"
,
"tank_angle"
);
cJSON_AddNumberToObject
(
root
,
"angle:"
,
angle_shot
);
char
*
payload
=
cJSON_PrintUnformatted
(
root
);
my_zlog_debug
(
"%s"
,
payload
);
mosquitto_publish
(
mosq
,
NULL
,
TOPIC_send_angle
,
strlen
(
payload
),
payload
,
0
,
false
);
cJSON_Delete
(
root
);
// 释放 cJSON 对象
}
}
void
mqtt_wirte
(){
//心跳格式,每5s一次心跳
if
(
AppExit_pin_pwm
==
202
)
angle_mqtt_send
();
if
(
heartbeat_count
>=
100
)
heartbeat_send
();
return
;
}
}
void
message_3
(
cJSON
*
body
,
cJSON
*
pwm_ctrl
){
//message_type为3,控制pwm
void
message_3
(
cJSON
*
body
,
cJSON
*
pwm_ctrl
){
//message_type为3,控制pwm
...
...
src/softiic.c
View file @
170e1f10
...
@@ -10,62 +10,62 @@ void i2c_delay() {
...
@@ -10,62 +10,62 @@ void i2c_delay() {
}
}
// I2C 起始信号
// I2C 起始信号
void
i2c_start
(
int
sda
_pin
,
int
scl_pin
)
{
void
i2c_start
(
int
sda
,
int
scl
)
{
digitalWrite
(
sda
_pin
,
HIGH
);
digitalWrite
(
sda
,
HIGH
);
digitalWrite
(
scl
_pin
,
HIGH
);
digitalWrite
(
scl
,
HIGH
);
i2c_delay
();
i2c_delay
();
digitalWrite
(
sda
_pin
,
LOW
);
digitalWrite
(
sda
,
LOW
);
i2c_delay
();
i2c_delay
();
digitalWrite
(
scl
_pin
,
LOW
);
digitalWrite
(
scl
,
LOW
);
i2c_delay
();
i2c_delay
();
}
}
// I2C 停止信号
// I2C 停止信号
void
i2c_stop
(
int
sda
_pin
,
int
scl_pin
)
{
void
i2c_stop
(
int
sda
,
int
scl
)
{
digitalWrite
(
sda
_pin
,
LOW
);
digitalWrite
(
sda
,
LOW
);
digitalWrite
(
scl
_pin
,
LOW
);
digitalWrite
(
scl
,
LOW
);
i2c_delay
();
i2c_delay
();
digitalWrite
(
scl
_pin
,
HIGH
);
digitalWrite
(
scl
,
HIGH
);
i2c_delay
();
i2c_delay
();
digitalWrite
(
sda
_pin
,
HIGH
);
digitalWrite
(
sda
,
HIGH
);
i2c_delay
();
i2c_delay
();
}
}
// I2C 发送一个字节
// I2C 发送一个字节
void
i2c_write_byte
(
int
sda
_pin
,
int
scl_pin
,
uint8_t
data
)
{
void
i2c_write_byte
(
int
sda
,
int
scl
,
uint8_t
data
)
{
for
(
int
i
=
7
;
i
>=
0
;
i
--
)
{
for
(
int
i
=
7
;
i
>=
0
;
i
--
)
{
digitalWrite
(
sda
_pin
,
(
data
>>
i
)
&
0x01
);
digitalWrite
(
sda
,
(
data
>>
i
)
&
0x01
);
i2c_delay
();
i2c_delay
();
digitalWrite
(
scl
_pin
,
HIGH
);
digitalWrite
(
scl
,
HIGH
);
i2c_delay
();
i2c_delay
();
digitalWrite
(
scl
_pin
,
LOW
);
digitalWrite
(
scl
,
LOW
);
i2c_delay
();
i2c_delay
();
}
}
// 接收 ACK
// 接收 ACK
pinMode
(
sda
_pin
,
INPUT
);
pinMode
(
sda
,
INPUT
);
digitalWrite
(
scl
_pin
,
HIGH
);
digitalWrite
(
scl
,
HIGH
);
i2c_delay
();
i2c_delay
();
digitalWrite
(
scl
_pin
,
LOW
);
digitalWrite
(
scl
,
LOW
);
pinMode
(
sda
_pin
,
OUTPUT
);
pinMode
(
sda
,
OUTPUT
);
}
}
// I2C 读取一个字节
// I2C 读取一个字节
uint8_t
i2c_read_byte
(
int
sda
_pin
,
int
scl_pin
,
bool
ack
)
{
uint8_t
i2c_read_byte
(
int
sda
,
int
scl
,
bool
ack
)
{
uint8_t
data
=
0
;
uint8_t
data
=
0
;
pinMode
(
sda
_pin
,
INPUT
);
pinMode
(
sda
,
INPUT
);
for
(
int
i
=
7
;
i
>=
0
;
i
--
)
{
for
(
int
i
=
7
;
i
>=
0
;
i
--
)
{
digitalWrite
(
scl
_pin
,
HIGH
);
digitalWrite
(
scl
,
HIGH
);
i2c_delay
();
i2c_delay
();
data
|=
(
digitalRead
(
sda
_pin
)
<<
i
);
data
|=
(
digitalRead
(
sda
)
<<
i
);
digitalWrite
(
scl
_pin
,
LOW
);
digitalWrite
(
scl
,
LOW
);
i2c_delay
();
i2c_delay
();
}
}
// 发送 ACK/NACK
// 发送 ACK/NACK
pinMode
(
sda
_pin
,
OUTPUT
);
pinMode
(
sda
,
OUTPUT
);
digitalWrite
(
sda
_pin
,
ack
?
LOW
:
HIGH
);
digitalWrite
(
sda
,
ack
?
LOW
:
HIGH
);
digitalWrite
(
scl
_pin
,
HIGH
);
digitalWrite
(
scl
,
HIGH
);
i2c_delay
();
i2c_delay
();
digitalWrite
(
scl
_pin
,
LOW
);
digitalWrite
(
scl
,
LOW
);
pinMode
(
sda
_pin
,
INPUT
);
pinMode
(
sda
,
INPUT
);
return
data
;
return
data
;
}
}
\ No newline at end of file
src/thread_main.c
View file @
170e1f10
...
@@ -67,8 +67,12 @@ void *Mqttbeat(void *arg) {
...
@@ -67,8 +67,12 @@ void *Mqttbeat(void *arg) {
Delay_Ms
(
15
,
0
);
Delay_Ms
(
15
,
0
);
while
(
1
)
{
while
(
1
)
{
ipaddr
();
//获取ip
ipaddr
();
//获取ip
Delay_Ms
(
3
,
0
);
if
(
AppExit_pin_pwm
==
202
)
Delay_Ms
(
0
,
90
);
mqtt_wirte
();
//心跳,3s一个
if
(
AppExit_pin_pwm
!=
202
)
Delay_Ms
(
0
,
100
);
heartbeat_count
++
;
mqtt_wirte
();
//心跳,3s一个
if
(
heartbeat_count
>=
100
)
heartbeat_count
=
0
;
}
}
return
NULL
;
return
NULL
;
}
}
...
...
system/sensor/INA226.c
View file @
170e1f10
...
@@ -4,66 +4,66 @@
...
@@ -4,66 +4,66 @@
float
currentLSB
;
float
currentLSB
;
// 初始化 INA226
// 初始化 INA226
bool
INA226_begin
(
int
sda
_pin
,
int
scl_pin
)
{
bool
INA226_begin
(
int
sda
,
int
scl
)
{
pinMode
(
sda
_pin
,
OUTPUT
);
pinMode
(
sda
,
OUTPUT
);
pinMode
(
scl
_pin
,
OUTPUT
);
pinMode
(
scl
,
OUTPUT
);
digitalWrite
(
sda
_pin
,
HIGH
);
digitalWrite
(
sda
,
HIGH
);
digitalWrite
(
scl
_pin
,
HIGH
);
digitalWrite
(
scl
,
HIGH
);
return
true
;
return
true
;
}
}
// 配置 INA226
// 配置 INA226
bool
INA226_configure
(
int
sda
_pin
,
int
scl_pin
)
{
bool
INA226_configure
(
int
sda
,
int
scl
)
{
uint16_t
config
=
0x4127
;
// 默认配置:16 次平均,1.1ms 转换时间,连续模式
uint16_t
config
=
0x4127
;
// 默认配置:16 次平均,1.1ms 转换时间,连续模式
i2c_start
(
sda
_pin
,
scl_pin
);
i2c_start
(
sda
,
scl
);
i2c_write_byte
(
sda
_pin
,
scl_pin
,
INA226_ADDRESS
<<
1
);
i2c_write_byte
(
sda
,
scl
,
INA226_ADDRESS
<<
1
);
i2c_write_byte
(
sda
_pin
,
scl_pin
,
INA226_REG_CONFIG
);
i2c_write_byte
(
sda
,
scl
,
INA226_REG_CONFIG
);
i2c_write_byte
(
sda
_pin
,
scl_pin
,
config
>>
8
);
i2c_write_byte
(
sda
,
scl
,
config
>>
8
);
i2c_write_byte
(
sda
_pin
,
scl_pin
,
config
&
0xFF
);
i2c_write_byte
(
sda
,
scl
,
config
&
0xFF
);
i2c_stop
(
sda
_pin
,
scl_pin
);
i2c_stop
(
sda
,
scl
);
return
true
;
return
true
;
}
}
// 校准 INA226
// 校准 INA226
bool
INA226_calibrate
(
int
sda
_pin
,
int
scl_pin
,
float
rShuntValue
,
float
iMaxExpected
)
{
bool
INA226_calibrate
(
int
sda
,
int
scl
,
float
rShuntValue
,
float
iMaxExpected
)
{
currentLSB
=
iMaxExpected
/
32767
.
0
;
// 计算电流 LSB,/INA226_REG_CALIBRATION
currentLSB
=
iMaxExpected
/
32767
.
0
;
// 计算电流 LSB,/INA226_REG_CALIBRATION
uint16_t
calibrationValue
=
(
uint16_t
)(
0
.
00512
/
(
currentLSB
*
rShuntValue
));
uint16_t
calibrationValue
=
(
uint16_t
)(
0
.
00512
/
(
currentLSB
*
rShuntValue
));
i2c_start
(
sda
_pin
,
scl_pin
);
i2c_start
(
sda
,
scl
);
i2c_write_byte
(
sda
_pin
,
scl_pin
,
INA226_ADDRESS
<<
1
);
i2c_write_byte
(
sda
,
scl
,
INA226_ADDRESS
<<
1
);
i2c_write_byte
(
sda
_pin
,
scl_pin
,
INA226_REG_CALIBRATION
);
i2c_write_byte
(
sda
,
scl
,
INA226_REG_CALIBRATION
);
i2c_write_byte
(
sda
_pin
,
scl_pin
,
calibrationValue
>>
8
);
i2c_write_byte
(
sda
,
scl
,
calibrationValue
>>
8
);
i2c_write_byte
(
sda
_pin
,
scl_pin
,
calibrationValue
&
0xFF
);
i2c_write_byte
(
sda
,
scl
,
calibrationValue
&
0xFF
);
i2c_stop
(
sda
_pin
,
scl_pin
);
i2c_stop
(
sda
,
scl
);
return
true
;
return
true
;
}
}
// 读取总线电压
// 读取总线电压
float
INA226_readBusVoltage
(
int
sda
_pin
,
int
scl_pin
)
{
float
INA226_readBusVoltage
(
int
sda
,
int
scl
)
{
i2c_start
(
sda
_pin
,
scl_pin
);
i2c_start
(
sda
,
scl
);
i2c_write_byte
(
sda
_pin
,
scl_pin
,
INA226_ADDRESS
<<
1
);
i2c_write_byte
(
sda
,
scl
,
INA226_ADDRESS
<<
1
);
i2c_write_byte
(
sda
_pin
,
scl_pin
,
INA226_REG_BUSVOLTAGE
);
i2c_write_byte
(
sda
,
scl
,
INA226_REG_BUSVOLTAGE
);
i2c_start
(
sda
_pin
,
scl_pin
);
i2c_start
(
sda
,
scl
);
i2c_write_byte
(
sda
_pin
,
scl_pin
,
(
INA226_ADDRESS
<<
1
)
|
1
);
i2c_write_byte
(
sda
,
scl
,
(
INA226_ADDRESS
<<
1
)
|
1
);
uint8_t
high
=
i2c_read_byte
(
sda
_pin
,
scl_pin
,
true
);
uint8_t
high
=
i2c_read_byte
(
sda
,
scl
,
true
);
uint8_t
low
=
i2c_read_byte
(
sda
_pin
,
scl_pin
,
false
);
uint8_t
low
=
i2c_read_byte
(
sda
,
scl
,
false
);
i2c_stop
(
sda
_pin
,
scl_pin
);
i2c_stop
(
sda
,
scl
);
int16_t
value
=
(
high
<<
8
)
|
low
;
int16_t
value
=
(
high
<<
8
)
|
low
;
return
value
*
0
.
00125
;
// 1.25mV/LSB
return
value
*
0
.
00125
;
// 1.25mV/LSB
}
}
// 读取电流
// 读取电流
float
INA226_readCurrent
(
int
sda
_pin
,
int
scl_pin
)
{
float
INA226_readCurrent
(
int
sda
,
int
scl
)
{
i2c_start
(
sda
_pin
,
scl_pin
);
i2c_start
(
sda
,
scl
);
i2c_write_byte
(
sda
_pin
,
scl_pin
,
INA226_ADDRESS
<<
1
);
i2c_write_byte
(
sda
,
scl
,
INA226_ADDRESS
<<
1
);
i2c_write_byte
(
sda
_pin
,
scl_pin
,
INA226_REG_CURRENT
);
i2c_write_byte
(
sda
,
scl
,
INA226_REG_CURRENT
);
i2c_start
(
sda
_pin
,
scl_pin
);
i2c_start
(
sda
,
scl
);
i2c_write_byte
(
sda
_pin
,
scl_pin
,
(
INA226_ADDRESS
<<
1
)
|
1
);
i2c_write_byte
(
sda
,
scl
,
(
INA226_ADDRESS
<<
1
)
|
1
);
uint8_t
high
=
i2c_read_byte
(
sda
_pin
,
scl_pin
,
true
);
uint8_t
high
=
i2c_read_byte
(
sda
,
scl
,
true
);
uint8_t
low
=
i2c_read_byte
(
sda
_pin
,
scl_pin
,
false
);
uint8_t
low
=
i2c_read_byte
(
sda
,
scl
,
false
);
i2c_stop
(
sda
_pin
,
scl_pin
);
i2c_stop
(
sda
,
scl
);
int16_t
value
=
(
high
<<
8
)
|
low
;
int16_t
value
=
(
high
<<
8
)
|
low
;
return
value
*
currentLSB
;
// 假设电流 LSB 为 1mA
return
value
*
currentLSB
;
// 假设电流 LSB 为 1mA
}
}
\ No newline at end of file
system/sensor/INA226.h
View file @
170e1f10
...
@@ -11,18 +11,18 @@
...
@@ -11,18 +11,18 @@
#define INA226_REG_CALIBRATION (0x05)
#define INA226_REG_CALIBRATION (0x05)
// 初始化 INA226
// 初始化 INA226
bool
INA226_begin
(
int
sda
_pin
,
int
scl_pin
);
bool
INA226_begin
(
int
sda
,
int
scl
);
// 配置 INA226
// 配置 INA226
bool
INA226_configure
(
int
sda
_pin
,
int
scl_pin
);
bool
INA226_configure
(
int
sda
,
int
scl
);
// 校准 INA226
// 校准 INA226
bool
INA226_calibrate
(
int
sda
_pin
,
int
scl_pin
,
float
rShuntValue
,
float
iMaxExpected
);
bool
INA226_calibrate
(
int
sda
,
int
scl
,
float
rShuntValue
,
float
iMaxExpected
);
// 读取总线电压
// 读取总线电压
float
INA226_readBusVoltage
(
int
sda
_pin
,
int
scl_pin
);
float
INA226_readBusVoltage
(
int
sda
,
int
scl
);
// 读取电流
// 读取电流
float
INA226_readCurrent
(
int
sda
_pin
,
int
scl_pin
);
float
INA226_readCurrent
(
int
sda
,
int
scl
);
#endif // INA226_H
#endif // INA226_H
\ No newline at end of file
system/sensor/ads1115.c
0 → 100644
View file @
170e1f10
#include "ads1115.h"
#include "common.h"
int
_sda_pin
=
0
;
int
_scl_pin
=
1
;
#define ADS1115_ADDR 0x48
// I2C写寄存器
static
void
ads1115_write_register
(
uint8_t
reg
,
uint16_t
val
)
{
i2c_start
(
_sda_pin
,
_scl_pin
);
i2c_write_byte
(
_sda_pin
,
_scl_pin
,
(
ADS1115_ADDR
<<
1
)
|
0
);
i2c_write_byte
(
_sda_pin
,
_scl_pin
,
reg
);
i2c_write_byte
(
_sda_pin
,
_scl_pin
,
(
val
>>
8
)
&
0xFF
);
i2c_write_byte
(
_sda_pin
,
_scl_pin
,
val
&
0xFF
);
i2c_stop
(
_sda_pin
,
_scl_pin
);
}
// 读取转换寄存器
static
uint16_t
ads1115_read_conversion
()
{
uint16_t
result
=
0
;
i2c_start
(
_sda_pin
,
_scl_pin
);
i2c_write_byte
(
_sda_pin
,
_scl_pin
,
(
ADS1115_ADDR
<<
1
)
|
0
);
i2c_write_byte
(
_sda_pin
,
_scl_pin
,
0x00
);
i2c_start
(
_sda_pin
,
_scl_pin
);
i2c_write_byte
(
_sda_pin
,
_scl_pin
,
(
ADS1115_ADDR
<<
1
)
|
1
);
uint8_t
msb
=
i2c_read_byte
(
_sda_pin
,
_scl_pin
,
1
);
uint8_t
lsb
=
i2c_read_byte
(
_sda_pin
,
_scl_pin
,
0
);
i2c_stop
(
_sda_pin
,
_scl_pin
);
result
=
(
msb
<<
8
)
|
lsb
;
return
result
;
}
bool
ads1115_init
(
int
_sda_pin
,
int
_scl_pin
)
{
pinMode
(
_sda_pin
,
OUTPUT
);
pinMode
(
_scl_pin
,
OUTPUT
);
digitalWrite
(
_sda_pin
,
HIGH
);
digitalWrite
(
_scl_pin
,
HIGH
);
return
true
;
}
// 读取某个单端通道电压,channel = 0~3
float
ads1115_read_channel
(
int
channel
)
{
uint16_t
config
=
0
;
if
(
channel
==
0
)
config
=
0xC203
;
// MUX=100 (AIN0-GND)
else
if
(
channel
==
1
)
config
=
0xD203
;
// MUX=101 (AIN1-GND)
else
if
(
channel
==
2
)
config
=
0xE203
;
// MUX=110 (AIN2-GND)
else
if
(
channel
==
3
)
config
=
0xF203
;
// MUX=111 (AIN3-GND)
else
return
-
1
.
0
f
;
ads1115_write_register
(
0x01
,
config
);
delayMicroseconds
(
10000
);
// 等待转换
uint16_t
raw
=
ads1115_read_conversion
();
int16_t
val
=
(
int16_t
)
raw
;
float
voltage_divided
=
val
*
4
.
096
f
/
32768
.
0
f
;
//float real_voltage = val * 6.144f / 32768.0f;
// 假设分压电阻 R1=2k, R2=10k
float
real_voltage
=
voltage_divided
*
(
10
.
0
f
+
2
.
0
f
)
/
10
.
0
f
;
//无分压电阻
return
real_voltage
;
}
system/sensor/ads1115.h
0 → 100644
View file @
170e1f10
#ifndef ADS1115_H
#define ADS1115_H
#include <stdint.h>
#include <stdbool.h>
// 初始化GPIO引脚(SDA、SCL),必须先调用
bool
ads1115_init
(
int
_sda_pin
,
int
_scl_pin
);
// 读取指定通道AIN0~AIN3的电压值(单位伏特)
// 输入参数 channel: 0~3
// 返回实际电压值,负数代表错误
float
ads1115_read_channel
(
int
channel
);
#endif
\ No newline at end of file
usr/main.c
View file @
170e1f10
...
@@ -15,10 +15,10 @@ int main(int argc, char *argv[]) {
...
@@ -15,10 +15,10 @@ int main(int argc, char *argv[]) {
//printf("WiringPi setup failed!\n");
//printf("WiringPi setup failed!\n");
return
3
;
return
3
;
}
}
if
(
!
INA226_begin
(
sda_pin
,
scl_pin
))
{
if
(
!
INA226_begin
(
sda_pin
,
scl_pin
)
&&
!
ads1115_init
(
sda_pin
,
scl_pin
)
)
{
my_zlog_fatal
(
"INA226 初始化失败!"
);
my_zlog_fatal
(
"INA226 初始化失败
或者ads1115初始化失败
!"
);
//printf("INA226 初始化失败!\n");
//printf("INA226 初始化失败!\n");
return
4
;
return
4
;
}
}
if
(
Device_File_Init
()
!=
0
)
{
if
(
Device_File_Init
()
!=
0
)
{
my_zlog_fatal
(
"This is a fatal message"
);
my_zlog_fatal
(
"This is a fatal message"
);
...
@@ -33,17 +33,17 @@ int main(int argc, char *argv[]) {
...
@@ -33,17 +33,17 @@ int main(int argc, char *argv[]) {
int
adino_jude
=
system
(
"pactl load-module module-alsa-source device=hw:2,0"
);
int
adino_jude
=
system
(
"pactl load-module module-alsa-source device=hw:2,0"
);
if
(
adino_jude
==
0
)
{
if
(
adino_jude
==
0
)
{
my_zlog_debug
(
"命令执行成功!
\n
"
);
my_zlog_debug
(
"命令执行成功!"
);
}
else
{
}
else
{
my_zlog_warn
(
"命令执行失败,返回状态码: %d
\n
"
,
adino_jude
);
my_zlog_warn
(
"命令执行失败,返回状态码: %d"
,
adino_jude
);
}
}
my_zlog_info
(
"程序初始化成功"
);
my_zlog_info
(
"程序初始化成功"
);
//printf("程序初始化成功\n");
//printf("程序初始化成功\n");
system
(
"pkill chromium"
);
system
(
"pkill chromium"
);
// 配置 INA226
// 配置 INA226
if
(
!
INA226_configure
(
sda_pin
,
scl_pin
))
{
if
(
!
INA226_configure
(
sda_pin
,
scl_pin
))
{
my_zlog_warn
(
"INA226初始化失败"
);
my_zlog_warn
(
"INA226初始化失败"
);
}
}
...
...
usr/main.h
View file @
170e1f10
...
@@ -16,5 +16,6 @@
...
@@ -16,5 +16,6 @@
#include "request.h"
#include "request.h"
#include "fileopen.h"
#include "fileopen.h"
#include "log.h"
#include "log.h"
#include "ads1115.h"
#endif
#endif
\ No newline at end of file
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment