Browse Source

support hmp110

master
zhaohe 1 year ago
parent
commit
95d1a9b038
  1. 5
      .gitmodules
  2. 5
      .vscode/settings.json
  3. 2
      sdk
  4. 1
      transmit_disinfection_protocol_v1
  5. 152
      usrc/h2o2_sensor.cpp
  6. 44
      usrc/h2o2_sensor.hpp
  7. 18
      usrc/hardware.cpp
  8. 8
      usrc/main.cpp
  9. 2
      usrc/main.hpp

5
.gitmodules

@ -1,3 +1,6 @@
[submodule "sdk"]
path = sdk
url = zwsd@192.168.1.3:manufacturer_stm32/iflytop_sdk.git
url = zwsd@192.168.1.3:p_transmit_disinfection/transmit_disinfection_iflytop_sdk_v1.git
[submodule "transmit_disinfection_protocol_v1"]
path = transmit_disinfection_protocol_v1
url = zwsd@192.168.1.3:p_transmit_disinfection/transmit_disinfection_protocol_v1.git

5
.vscode/settings.json

@ -64,6 +64,9 @@
"cstdarg": "cpp",
"cinttypes": "cpp",
"modbus_basic.h": "c",
"*.bak": "cpp"
"*.bak": "cpp",
"xhash": "cpp",
"xmemory": "cpp",
"xstring": "cpp"
}
}

2
sdk

@ -1 +1 @@
Subproject commit f6f7900b876e6a4a6b2c5ebe6bd26b5f1b1fbe0a
Subproject commit b20f4cc2e42244d6dd21566dd1a4b1a48ddc64a9

1
transmit_disinfection_protocol_v1

@ -0,0 +1 @@
Subproject commit c39bd364d809a9a6ad965c83fd3ea28c67514317

152
usrc/h2o2_sensor.cpp

@ -0,0 +1,152 @@
#include "h2o2_sensor.hpp"
#include <stdio.h>
#include <string.h>
#include "adc.h"
#ifdef HAL_CAN_MODULE_ENABLED
using namespace iflytop;
using namespace zcr;
#define TAG "H2O2Sensor"
void H2O2Sensor::initialize() {
}
void H2O2Sensor::regSubmodule(int id, UART_HandleTypeDef* huart, uint8_t modbusid) {
ZASSERT(huart != NULL);
m_sensorId = id;
m_modbusid = modbusid;
modbusBlockHost.initialize(huart);
readSensorData();
}
uint32_t H2O2Sensor::readAvgAdcVal() {
// 读取15次,取中间十个数取平均值
uint32_t adcv[15] = {0}; // 15次采样
for (int i = 0; i < 15; i++) {
adcv[i] = readAdcVal();
}
// 冒泡排序
for (int i = 0; i < 15; i++) {
for (int j = 0; j < 15 - i - 1; j++) {
if (adcv[j] > adcv[j + 1]) {
uint32_t temp = adcv[j];
adcv[j] = adcv[j + 1];
adcv[j + 1] = temp;
}
}
}
uint32_t sum = 0;
for (int i = 2; i < 12; i++) {
sum += adcv[i];
}
return sum / 10;
}
uint32_t H2O2Sensor::readAdcVal() {
ADC_ChannelConfTypeDef sConfig; // 通道初始化
uint8_t id;
sConfig.Channel = ADC_CHANNEL_9;
sConfig.SamplingTime = ADC_SAMPLETIME_480CYCLES; // 采用周期239.5周期
sConfig.Rank = 1;
HAL_ADC_ConfigChannel(&hadc1, &sConfig);
uint32_t adcv = 0; //
HAL_ADC_Start(&hadc1); // 启动转换
HAL_ADC_PollForConversion(&hadc1, 30); // 等待转化结束
adcv = HAL_ADC_GetValue(&hadc1); // 求和
HAL_ADC_Stop(&hadc1); // 停止转换
return adcv; // 返回平均值
}
typedef struct {
int16_t rh; // Relative humidity %RH * 10
int16_t temp; // Temperature °C * 10
int16_t df_ptemp; // Dew/frost point temperature °C * 10
int16_t ah; // Absolute humidity g/m3 * 10
int16_t mr; // Mixing ratio g/kg * 10
int16_t wet_bulb_temp; // Wet-bulb temperature °C * 10
int16_t enthalpy; // Enthalpy kJ/kg * 10
} hmp110_sensordata_t;
hpp272_data_t* H2O2Sensor::readSensorData() {
sensordatacache.hydrogen_peroxide_volume = 0;
sensordatacache.h2o_h2o2_rs = 0;
sensordatacache.temperature1 = 20 * 100;
sensordatacache.relative_humidity = 0;
static uint16_t rxbuf[128];
static hmp110_sensordata_t sensordata;
memset(rxbuf, 0, sizeof(rxbuf));
bool suc = modbusBlockHost.readReg03Muti(1, 0x0100, rxbuf, 7, 300);
if (suc) {
sensordata.rh = rxbuf[0];
sensordata.temp = rxbuf[1];
sensordata.df_ptemp = rxbuf[2];
sensordata.ah = rxbuf[3];
sensordata.mr = rxbuf[4];
sensordata.wet_bulb_temp = rxbuf[5];
sensordata.enthalpy = rxbuf[6];
sensordatacache.temperature1 = sensordata.temp * 10;
sensordatacache.relative_humidity = sensordata.rh * 10;
} else {
ZLOGI(TAG, "readSensorData fail");
sensordatacache.temperature1 = 0;
sensordatacache.relative_humidity = 0;
}
uint32_t adcv = readAvgAdcVal();
float mv = adcv / 4095.0 * 3.3 * 1000;
float ma = mv / 150.0;
float ppm = (ma - 4) / (20 - 4) * 2000;
if (ppm < 0) ppm = 0;
ZLOGI(TAG, " i:%f ppm:%f temp:%d rh:%d", ma, ppm, sensordatacache.temperature1, sensordatacache.relative_humidity);
sensordatacache.hydrogen_peroxide_volume = ppm;
if (sensordatacache.hydrogen_peroxide_volume < 10) {
sensordatacache.hydrogen_peroxide_volume = 0;
}
// sensordatacache.hydrogen_peroxide_volume = 9973;
return &sensordatacache;
}
void H2O2Sensor::onRceivePacket(Cmdheader_t* cmdheader, int sensorId) {
if (sensorId != m_sensorId) {
return;
}
// hpp272_data_t* sensordata = readSensorData();
// if (sensordata) {
// txbuff[0] = sensorId;
// txbuff[1] = 0;
// memcpy(txbuff + 2, sensordata, sizeof(hpp272_data_t));
// m_zcanReceiver->sendAck(cmdheader, txbuff, sizeof(hpp272_data_t) + 2);
// } else {
// ZLOGE(TAG, "hpp272 is null");
// int16_t errcode = 1002; // 设备不在线
// m_zcanReceiver->sendErrorAck(cmdheader, errcode);
// }
// return;
}
void H2O2Sensor::onRceivePacket(CanPacketRxBuffer* rxbuf, uint8_t* packet, size_t len) {
Cmdheader_t* cmdheader = (Cmdheader_t*)packet;
if (cmdheader->cmdid == kcmd_m211887_operation && cmdheader->subcmdid == 0) {
uint8_t id = cmdheader->data[0];
onRceivePacket(cmdheader, id);
}
}
#endif

44
usrc/h2o2_sensor.hpp

@ -0,0 +1,44 @@
//
// Created by zwsd
//
#pragma once
#include "sdk/hal/zhal.hpp"
//
#include "sdk\components\vaisala_sensor\hpp272.hpp"
#include "sdk\components\zcanreceiver\zcanreceiver.hpp"
#ifdef HAL_CAN_MODULE_ENABLED
namespace iflytop {
class H2O2Sensor : public ZCanRceiverListener {
private:
uint8_t txbuff[sizeof(hpp272_data_t) + 10];
int32_t m_sensorId = -1;
int32_t m_modbusid = -1;
hpp272_data_t sensordatacache;
ModbusBlockHost modbusBlockHost;
public:
H2O2Sensor(/* args */) {}
~H2O2Sensor() {}
public:
void initialize();
void regSubmodule(int id, UART_HandleTypeDef* huart, uint8_t modbusid);
virtual hpp272_data_t* readSensorData();
public:
virtual void onRceivePacket(CanPacketRxBuffer* rxbuf, uint8_t* packet, size_t len);
virtual void onRceivePacket(Cmdheader_t* cmdheader, int sensorId);
private:
void loop();
uint32_t readAdcVal();
uint32_t readAvgAdcVal();
};
} // namespace iflytop
#endif

18
usrc/hardware.cpp

@ -2,19 +2,18 @@
#include <stddef.h>
#include <stdio.h>
#include <string.h>
#include "adc.h"
#include "main.h"
#include "project.hpp"
//
// #include "sdk/components/single_axis_motor_control_v2/single_axis_motor_control_v2.hpp"
#include "sdk/components/iflytop_can_slave_modules/idcard_reader_service.hpp"
#include "sdk/components/single_axis_motor_control/single_axis_motor_control.hpp"
#include "sdk/hal/zhal.hpp"
#include "sdk\components\iflytop_can_slave_modules\io_control_service.hpp"
#include "sdk\components\iflytop_can_slave_v1\iflytop_can_slave.hpp"
#include "sdk\components\m3078\m3078_code_scaner.hpp"
//
#include "h2o2_sensor.hpp"
#include "sdk\components\huacheng_sensor\dp600_pressure_sensor.hpp"
#include "sdk\components\vaisala_sensor\hpp272.hpp"
#include "sdk\components\zcan_module\huacheng_pressure_sensor.hpp"
@ -33,7 +32,8 @@ ZGPIO AirBlowerCtrl2;
ZGPIO HeatingStripCtrl1;
ZGPIO HeatingStripCtrl2;
HPP272 hpp272; // 维萨拉传感器
// HPP272 hpp272; // 维萨拉传感器
H2O2Sensor m_h2o2_sensor;
uint32_t ADC_Get_Average(uint8_t ch, uint8_t times) {
ADC_ChannelConfTypeDef sConfig; // 通道初始化
@ -112,7 +112,10 @@ void Hardware::initialize(int deviceId) {
HeatingStripCtrl1.initAsOutput(PC6, ZGPIO::kMode_nopull, true, false);
HeatingStripCtrl2.initAsOutput(PC7, ZGPIO::kMode_nopull, true, false);
hpp272.initialize(&huart3, 0xf0);
// hpp272.initialize(&huart3, 0xf0);
m_h2o2_sensor.initialize();
m_h2o2_sensor.regSubmodule(1, &huart3, 0x01);
}
int32_t Hardware::process_rx_packet(from_where_t fromwhere, uint8_t *packet, int32_t len, uint8_t *receipt, int32_t &receiptsize, bool &matching) {
@ -229,7 +232,8 @@ int32_t Hardware::process_rx_packet(from_where_t fromwhere, uint8_t *packet, int
static hpp272_data_t fake_hpp272data;
PROCESS_CMD(kcmd_m211887_operation, 0, 1) {
hpp272_data_t *hpp272data = hpp272.readVal();
// hpp272_data_t *hpp272data = hpp272.readVal();
hpp272_data_t *hpp272data = m_h2o2_sensor.readSensorData();
#if 0
data.h2o2 = m_hpp272_data_1.hydrogen_peroxide_volume;

8
usrc/main.cpp

@ -7,11 +7,9 @@
#include "project.hpp"
//
// #include "sdk/components/single_axis_motor_control_v2/single_axis_motor_control_v2.hpp"
#include "sdk/components/iflytop_can_slave_modules/idcard_reader_service.hpp"
#include "sdk/components/single_axis_motor_control/single_axis_motor_control.hpp"
#include "sdk/hal/zhal.hpp"
#include "sdk\components\iflytop_can_slave_modules\io_control_service.hpp"
#include "sdk\components\iflytop_can_slave_v1\iflytop_can_slave.hpp"
#include <string.h>
#include "sdk\components\m3078\m3078_code_scaner.hpp"
#include "sdk\components\tmc\ic\ztmc4361A.hpp"
#include "sdk\components\tmc\ic\ztmc5130.hpp"
@ -42,7 +40,7 @@ void dumphexdata(uint8_t *data, int32_t len) {
* GLOBAL *
*******************************************************************************/
IflytopCanProtocolStackProcesser m_protocolStack;
Hardware m_hardware;
ZGPIO debuglight;
ZCanReceiver m_canReceiver;

2
usrc/main.hpp

@ -4,8 +4,6 @@
#include <functional>
#include "sdk\components\iflytop_can_slave_modules\device_base_control_service.hpp"
#include "sdk\components\iflytop_can_slave_v1\iflytop_can_slave.hpp"
#include "sdk\components\zcanreceiver\zcanreceiver.hpp"
namespace iflytop {
using namespace std;

Loading…
Cancel
Save