Commit 5c72890b authored by 957dd's avatar 957dd

加入了电压检测和远程重启

parent 710054ed
#ifndef INA226_H
#define INA226_H
#include <stdint.h>
#include <stdbool.h>
extern int sda_pin; // GPIO0
extern int scl_pin; // GPIO1
#define INA226_ADDRESS (0x40) // INA226 的 I2C 地址
#define INA226_REG_CONFIG (0x00)
#define INA226_REG_SHUNTVOLTAGE (0x01)
#define INA226_REG_BUSVOLTAGE (0x02)
#define INA226_REG_POWER (0x03)
#define INA226_REG_CURRENT (0x04)
#define INA226_REG_CALIBRATION (0x05)
// 初始化 INA226
bool INA226_begin(int sda_pin, int scl_pin);
// 配置 INA226
bool INA226_configure(int sda_pin, int scl_pin);
// 校准 INA226
bool INA226_calibrate(int sda_pin, int scl_pin, float rShuntValue, float iMaxExpected);
// 读取总线电压
float INA226_readBusVoltage(int sda_pin, int scl_pin);
// 读取电流
float INA226_readCurrent(int sda_pin, int scl_pin);
#endif // INA226_H
\ No newline at end of file
No preview for this file type
# 编译器
CC = gcc
# 编译选项
CFLAGS = -Wall -g -Ilib
CFLAGS = -Wall -g -Ilib
# 链接库
LDFLAGS = -lwiringPi -lmosquitto -lcjson
LDFLAGS = -lwiringPi -lmosquitto -lcjson -lm
# 目标可执行文件
TARGET = main
# 源文件目录
......
#include <wiringPi.h>
#include <stdio.h>
#include <math.h>
#include "INA226.h"
float currentLSB ;
int sda_pin=0; // GPIO0
int scl_pin=1; // GPIO1
// 软件 I2C 延时
void i2c_delay() {
delayMicroseconds(5);
}
// I2C 起始信号
void i2c_start(int sda_pin, int scl_pin) {
digitalWrite(sda_pin, HIGH);
digitalWrite(scl_pin, HIGH);
i2c_delay();
digitalWrite(sda_pin, LOW);
i2c_delay();
digitalWrite(scl_pin, LOW);
i2c_delay();
}
// I2C 停止信号
void i2c_stop(int sda_pin, int scl_pin) {
digitalWrite(sda_pin, LOW);
digitalWrite(scl_pin, LOW);
i2c_delay();
digitalWrite(scl_pin, HIGH);
i2c_delay();
digitalWrite(sda_pin, HIGH);
i2c_delay();
}
// I2C 发送一个字节
void i2c_write_byte(int sda_pin, int scl_pin, uint8_t data) {
for (int i = 7; i >= 0; i--) {
digitalWrite(sda_pin, (data >> i) & 0x01);
i2c_delay();
digitalWrite(scl_pin, HIGH);
i2c_delay();
digitalWrite(scl_pin, LOW);
i2c_delay();
}
// 接收 ACK
pinMode(sda_pin, INPUT);
digitalWrite(scl_pin, HIGH);
i2c_delay();
digitalWrite(scl_pin, LOW);
pinMode(sda_pin, OUTPUT);
}
// I2C 读取一个字节
uint8_t i2c_read_byte(int sda_pin, int scl_pin, bool ack) {
uint8_t data = 0;
pinMode(sda_pin, INPUT);
for (int i = 7; i >= 0; i--) {
digitalWrite(scl_pin, HIGH);
i2c_delay();
data |= (digitalRead(sda_pin) << i);
digitalWrite(scl_pin, LOW);
i2c_delay();
}
// 发送 ACK/NACK
pinMode(sda_pin, OUTPUT);
digitalWrite(sda_pin, ack ? LOW : HIGH);
digitalWrite(scl_pin, HIGH);
i2c_delay();
digitalWrite(scl_pin, LOW);
pinMode(sda_pin, INPUT);
return data;
}
// 初始化 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);
return true;
}
// 配置 INA226
bool INA226_configure(int sda_pin, int scl_pin) {
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);
return true;
}
// 校准 INA226
bool INA226_calibrate(int sda_pin, int scl_pin, 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);
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);
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);
int16_t value = (high << 8) | low;
return value * currentLSB; // 假设电流 LSB 为 1mA
}
\ No newline at end of file
File added
File mode changed from 100644 to 100755
......@@ -13,6 +13,7 @@
#include "mqtt.h"
#include "opensh.h"
#include "gpio_pwm.h"
#include "INA226.h"
char* TOPIC;
char* TOPIC2;
......@@ -69,7 +70,13 @@ void on_connect(struct mosquitto *mosq, void *obj, int rc) //回调函数
void mqtt_wirte()//心跳格式
{
float voltage = INA226_readBusVoltage(sda_pin, scl_pin);
float current = INA226_readCurrent(sda_pin, scl_pin);
char voltage_str[20]; // 足够存储转换后的字符串的缓冲区
sprintf(voltage_str, "%.2f", voltage);
char current_str[20]; // 足够存储转换后的字符串的缓冲区
sprintf(current_str, "%.2f", current);
int message=1;
cJSON *root = cJSON_CreateObject();
......@@ -77,6 +84,8 @@ void mqtt_wirte()//心跳格式
cJSON *head = cJSON_CreateObject();
cJSON_AddStringToObject(body, "ip", ip_address);
cJSON_AddStringToObject(body, "ID", TOPIC);
cJSON_AddStringToObject(body, "V:", voltage_str);
cJSON_AddStringToObject(body, "I:", current_str);
cJSON_AddStringToObject(body, "N", glat);
cJSON_AddStringToObject(body, "E", glon);
......@@ -85,7 +94,7 @@ void mqtt_wirte()//心跳格式
cJSON_AddItemToObject(root, "head",head);
char *payload = cJSON_PrintUnformatted(root);
printf("%s\n",payload);
mosquitto_publish(mosq, NULL, TOPIC2, strlen(payload), payload, 0, false);
mosquitto_publish(mosq, NULL, TOPIC3, strlen(payload), payload, 0, false);
......@@ -204,8 +213,11 @@ void on_message(struct mosquitto *mosq, void *obj, const struct mosquitto_messag
switch(gmessage_type)
{
case 1:
system("sudo reboot");//重启香橙派
break;
case 2:
if(gmessage_2_index<=50)
if(gmessage_2_index<=50)//限制刷新间隔
{
free(payload_str);
return ;
......
No preview for this file type
File mode changed from 100644 to 100755
......@@ -20,6 +20,7 @@
#include "mqtt.h"
#include "delay.h"
#include "opensh.h"
#include "INA226.h"
char buffer[30]; // 用于存储文件内容
uint8_t AppExit_pin_pwm=0;//判断坦克或者车的退出
......@@ -134,6 +135,11 @@ int main(int argc, char *argv[]) {
printf("WiringPi setup failed!\n");
return 1;
}
if (!INA226_begin(sda_pin, scl_pin)) {
printf("INA226 初始化失败!\n");
return 1;
}
const char *readbuf=device_inspect();
//将第3个和第4个字符提取出来
......@@ -167,10 +173,16 @@ int main(int argc, char *argv[]) {
sprintf(TOPIC3,"%s",readbuf);
printf("1:%s,2:%s,3:%s\n",TOPIC,TOPIC2,TOPIC3);
system("pkill chromium");
// 配置 INA226
INA226_configure(sda_pin, scl_pin);
// 校准 INA226
float rShuntValue = 0.1; // 分流电阻值(单位:欧姆)
float iMaxExpected = 5; // 最大预期电流(单位:安培)
INA226_calibrate(sda_pin, scl_pin, rShuntValue, iMaxExpected);
gStart=time(NULL);//开始时间戳
ipaddr();//获取ip
thread_start(AppExit,Mqttbeat,opensh,Mqtt_onnect);//开启线程
......
No preview for this file type
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