Commit 170e1f10 authored by 957dd's avatar 957dd

feat:加入了霍尔传感器的使用和读值与上报

parent 14829c54
cmake_minimum_required(VERSION 3.10)
project(DeviceControlSystem
VERSION 1.1.2
VERSION 1.1.3
LANGUAGES C
)
......
......@@ -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
.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
.PHONY : system/sensor/heat.o
......@@ -1446,6 +1470,9 @@ help:
@echo "... system/sensor/INA226.o"
@echo "... system/sensor/INA226.i"
@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.i"
@echo "... system/sensor/heat.s"
......
#define PROJECT_VERSION_MAJOR 1
#define PROJECT_VERSION_MINOR 1
#define PROJECT_VERSION_PATCH 2
#define PROJECT_VERSION_PATCH 3
#define GIT_HASH ""
#define BUILD_TIMESTAMP "2025-05-20T12:37:15"
#define BUILD_TIMESTAMP "2025-05-22T11:00:34"
#define BUILD_USER "orangepi"
No preview for this file type
......@@ -13,6 +13,9 @@ extern char* TOPIC2_BACK;
extern char* TOPIC3_BACK;
extern uint16_t AppExit_pin_pwm;
extern int heartbeat_count;//心跳计时
//extern ThreadPool *pool;
#define BROKER_ADDRESS "119.45.167.177"
#define BROKER_PORT 1883
......
......@@ -5,15 +5,15 @@ extern int sda_pin; // GPIO0
extern int scl_pin; // GPIO1
// I2C 起始信号
void i2c_start(int sda_pin, int scl_pin);
void i2c_start(int sda, int scl);
// I2C 停止信号
void i2c_stop(int sda_pin, int scl_pin);
void i2c_stop(int sda, int scl);
// 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 读取一个字节
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
\ No newline at end of file
......@@ -24,7 +24,7 @@ int ipaddr() {//获取ip
}
//printf("ip:%s\n",ip_address);
my_zlog_debug("ip:%s",ip_address);
// my_zlog_debug("ip:%s",ip_address);
freeifaddrs(ifap);
......
......@@ -12,9 +12,12 @@
#include "fileopen.h"
#include "device_change.h"
#include "judg.h"
#include "ads1115.h"
struct mosquitto *mosq;
int heartbeat_count=0;
char* TOPIC = NULL;
char* TOPIC2 = NULL;
char* TOPIC3 = NULL;
......@@ -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 current = INA226_readCurrent(sda_pin, scl_pin);
char voltage_str[20]; // 足够存储转换后的字符串的缓冲区
......@@ -86,7 +88,7 @@ void mqtt_wirte(){//心跳格式,每5s一次心跳
char *version_num = program_version();
if(heat_tem() !=0 ) {//获取CPU温度
my_zlog_debug("获取cpu温度失败");
}
message=1;
......@@ -117,8 +119,34 @@ void mqtt_wirte(){//心跳格式,每5s一次心跳
mosquitto_publish(mosq, NULL, TOPIC3, strlen(payload), payload, 0, false);
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
......
......@@ -10,62 +10,62 @@ void i2c_delay() {
}
// I2C 起始信号
void i2c_start(int sda_pin, int scl_pin) {
digitalWrite(sda_pin, HIGH);
digitalWrite(scl_pin, HIGH);
void i2c_start(int sda, int scl) {
digitalWrite(sda, HIGH);
digitalWrite(scl, HIGH);
i2c_delay();
digitalWrite(sda_pin, LOW);
digitalWrite(sda, LOW);
i2c_delay();
digitalWrite(scl_pin, LOW);
digitalWrite(scl, LOW);
i2c_delay();
}
// I2C 停止信号
void i2c_stop(int sda_pin, int scl_pin) {
digitalWrite(sda_pin, LOW);
digitalWrite(scl_pin, LOW);
void i2c_stop(int sda, int scl) {
digitalWrite(sda, LOW);
digitalWrite(scl, LOW);
i2c_delay();
digitalWrite(scl_pin, HIGH);
digitalWrite(scl, HIGH);
i2c_delay();
digitalWrite(sda_pin, HIGH);
digitalWrite(sda, HIGH);
i2c_delay();
}
// 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--) {
digitalWrite(sda_pin, (data >> i) & 0x01);
digitalWrite(sda, (data >> i) & 0x01);
i2c_delay();
digitalWrite(scl_pin, HIGH);
digitalWrite(scl, HIGH);
i2c_delay();
digitalWrite(scl_pin, LOW);
digitalWrite(scl, LOW);
i2c_delay();
}
// 接收 ACK
pinMode(sda_pin, INPUT);
digitalWrite(scl_pin, HIGH);
pinMode(sda, INPUT);
digitalWrite(scl, HIGH);
i2c_delay();
digitalWrite(scl_pin, LOW);
pinMode(sda_pin, OUTPUT);
digitalWrite(scl, LOW);
pinMode(sda, OUTPUT);
}
// 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;
pinMode(sda_pin, INPUT);
pinMode(sda, INPUT);
for (int i = 7; i >= 0; i--) {
digitalWrite(scl_pin, HIGH);
digitalWrite(scl, HIGH);
i2c_delay();
data |= (digitalRead(sda_pin) << i);
digitalWrite(scl_pin, LOW);
data |= (digitalRead(sda) << i);
digitalWrite(scl, LOW);
i2c_delay();
}
// 发送 ACK/NACK
pinMode(sda_pin, OUTPUT);
digitalWrite(sda_pin, ack ? LOW : HIGH);
digitalWrite(scl_pin, HIGH);
pinMode(sda, OUTPUT);
digitalWrite(sda, ack ? LOW : HIGH);
digitalWrite(scl, HIGH);
i2c_delay();
digitalWrite(scl_pin, LOW);
pinMode(sda_pin, INPUT);
digitalWrite(scl, LOW);
pinMode(sda, INPUT);
return data;
}
\ No newline at end of file
......@@ -67,8 +67,12 @@ void *Mqttbeat(void *arg) {
Delay_Ms(15,0);
while(1) {
ipaddr();//获取ip
Delay_Ms(3,0);
mqtt_wirte();//心跳,3s一个
if( AppExit_pin_pwm == 202) Delay_Ms(0,90);
if( AppExit_pin_pwm != 202) Delay_Ms(0,100);
heartbeat_count++;
mqtt_wirte();//心跳,3s一个
if(heartbeat_count>=100) heartbeat_count=0;
}
return NULL;
}
......
......@@ -4,66 +4,66 @@
float currentLSB ;
// 初始化 INA226
bool INA226_begin(int sda_pin, int scl_pin) {
pinMode(sda_pin, OUTPUT);
pinMode(scl_pin, OUTPUT);
digitalWrite(sda_pin, HIGH);
digitalWrite(scl_pin, HIGH);
bool INA226_begin(int sda, int scl) {
pinMode(sda, OUTPUT);
pinMode(scl, OUTPUT);
digitalWrite(sda, HIGH);
digitalWrite(scl, HIGH);
return true;
}
// 配置 INA226
bool INA226_configure(int sda_pin, int scl_pin) {
bool INA226_configure(int sda, int scl) {
uint16_t config = 0x4127; // 默认配置:16 次平均,1.1ms 转换时间,连续模式
i2c_start(sda_pin, scl_pin);
i2c_write_byte(sda_pin, scl_pin, INA226_ADDRESS << 1);
i2c_write_byte(sda_pin, scl_pin, INA226_REG_CONFIG);
i2c_write_byte(sda_pin, scl_pin, config >> 8);
i2c_write_byte(sda_pin, scl_pin, config & 0xFF);
i2c_stop(sda_pin, scl_pin);
i2c_start(sda, scl);
i2c_write_byte(sda, scl, INA226_ADDRESS << 1);
i2c_write_byte(sda, scl, INA226_REG_CONFIG);
i2c_write_byte(sda, scl, config >> 8);
i2c_write_byte(sda, scl, config & 0xFF);
i2c_stop(sda, scl);
return true;
}
// 校准 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
uint16_t calibrationValue = (uint16_t)(0.00512 / (currentLSB * rShuntValue));
i2c_start(sda_pin, scl_pin);
i2c_write_byte(sda_pin, scl_pin, INA226_ADDRESS << 1);
i2c_write_byte(sda_pin, scl_pin, INA226_REG_CALIBRATION);
i2c_write_byte(sda_pin, scl_pin, calibrationValue >> 8);
i2c_write_byte(sda_pin, scl_pin, calibrationValue & 0xFF);
i2c_stop(sda_pin, scl_pin);
i2c_start(sda, scl);
i2c_write_byte(sda, scl, INA226_ADDRESS << 1);
i2c_write_byte(sda, scl, INA226_REG_CALIBRATION);
i2c_write_byte(sda, scl, calibrationValue >> 8);
i2c_write_byte(sda, scl, calibrationValue & 0xFF);
i2c_stop(sda, scl);
return true;
}
// 读取总线电压
float INA226_readBusVoltage(int sda_pin, int scl_pin) {
i2c_start(sda_pin, scl_pin);
i2c_write_byte(sda_pin, scl_pin, INA226_ADDRESS << 1);
i2c_write_byte(sda_pin, scl_pin, INA226_REG_BUSVOLTAGE);
i2c_start(sda_pin, scl_pin);
i2c_write_byte(sda_pin, scl_pin, (INA226_ADDRESS << 1) | 1);
uint8_t high = i2c_read_byte(sda_pin, scl_pin, true);
uint8_t low = i2c_read_byte(sda_pin, scl_pin, false);
i2c_stop(sda_pin, scl_pin);
float INA226_readBusVoltage(int sda, int scl) {
i2c_start(sda, scl);
i2c_write_byte(sda, scl, INA226_ADDRESS << 1);
i2c_write_byte(sda, scl, INA226_REG_BUSVOLTAGE);
i2c_start(sda, scl);
i2c_write_byte(sda, scl, (INA226_ADDRESS << 1) | 1);
uint8_t high = i2c_read_byte(sda, scl, true);
uint8_t low = i2c_read_byte(sda, scl, false);
i2c_stop(sda, scl);
int16_t value = (high << 8) | low;
return value * 0.00125; // 1.25mV/LSB
}
// 读取电流
float INA226_readCurrent(int sda_pin, int scl_pin) {
i2c_start(sda_pin, scl_pin);
i2c_write_byte(sda_pin, scl_pin, INA226_ADDRESS << 1);
i2c_write_byte(sda_pin, scl_pin, INA226_REG_CURRENT);
i2c_start(sda_pin, scl_pin);
i2c_write_byte(sda_pin, scl_pin, (INA226_ADDRESS << 1) | 1);
uint8_t high = i2c_read_byte(sda_pin, scl_pin, true);
uint8_t low = i2c_read_byte(sda_pin, scl_pin, false);
i2c_stop(sda_pin, scl_pin);
float INA226_readCurrent(int sda, int scl) {
i2c_start(sda, scl);
i2c_write_byte(sda, scl, INA226_ADDRESS << 1);
i2c_write_byte(sda, scl, INA226_REG_CURRENT);
i2c_start(sda, scl);
i2c_write_byte(sda, scl, (INA226_ADDRESS << 1) | 1);
uint8_t high = i2c_read_byte(sda, scl, true);
uint8_t low = i2c_read_byte(sda, scl, false);
i2c_stop(sda, scl);
int16_t value = (high << 8) | low;
return value * currentLSB; // 假设电流 LSB 为 1mA
}
\ No newline at end of file
......@@ -11,18 +11,18 @@
#define INA226_REG_CALIBRATION (0x05)
// 初始化 INA226
bool INA226_begin(int sda_pin, int scl_pin);
bool INA226_begin(int sda, int scl);
// 配置 INA226
bool INA226_configure(int sda_pin, int scl_pin);
bool INA226_configure(int sda, int scl);
// 校准 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
\ No newline at end of file
#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.0f;
ads1115_write_register(0x01, config);
delayMicroseconds(10000); // 等待转换
uint16_t raw = ads1115_read_conversion();
int16_t val = (int16_t)raw;
float voltage_divided = val * 4.096f / 32768.0f;
//float real_voltage = val * 6.144f / 32768.0f;
// 假设分压电阻 R1=2k, R2=10k
float real_voltage = voltage_divided * (10.0f + 2.0f) / 10.0f;//无分压电阻
return real_voltage;
}
#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
......@@ -15,10 +15,10 @@ int main(int argc, char *argv[]) {
//printf("WiringPi setup failed!\n");
return 3;
}
if (!INA226_begin(sda_pin, scl_pin)) {
my_zlog_fatal("INA226 初始化失败!");
if (!INA226_begin(sda_pin, scl_pin)&& !ads1115_init(sda_pin, scl_pin)) {
my_zlog_fatal("INA226 初始化失败或者ads1115初始化失败!");
//printf("INA226 初始化失败!\n");
return 4;
return 4;
}
if(Device_File_Init()!=0) {
my_zlog_fatal("This is a fatal message");
......@@ -33,17 +33,17 @@ int main(int argc, char *argv[]) {
int adino_jude = system("pactl load-module module-alsa-source device=hw:2,0");
if (adino_jude == 0) {
my_zlog_debug("命令执行成功!\n");
my_zlog_debug("命令执行成功!");
} else {
my_zlog_warn("命令执行失败,返回状态码: %d\n", adino_jude );
my_zlog_warn("命令执行失败,返回状态码: %d", adino_jude );
}
my_zlog_info("程序初始化成功");
//printf("程序初始化成功\n");
system("pkill chromium");
// 配置 INA226
if(!INA226_configure(sda_pin, scl_pin)) {
my_zlog_warn("INA226初始化失败");
}
......
......@@ -16,5 +16,6 @@
#include "request.h"
#include "fileopen.h"
#include "log.h"
#include "ads1115.h"
#endif
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment