first commit

This commit is contained in:
2024-07-16 11:15:42 +08:00
commit a44ec58780
47 changed files with 6775 additions and 0 deletions

View File

@ -0,0 +1,58 @@
#ifndef COMMUNICATION_PROTOCOL_H
#define COMMUNICATION_PROTOCOL_H
#include <stdint.h>
#include "IRIS_Method.h"
#include <Communication_struct.h>
// DEFINE The protocol Here
//Forexample
// #define MYCOMAN 0x02 //命令全大写
// todo : define your protocol here
/*-------------------------------------------------------------------------------------------------------------*/
// #define Digital_number 0
#define DIGITALNUMBER 0
#define RADIANCE 1
#define REFLECTANCE 2
#define DARKNOISE 3
#define DIRECTIO_UP 0
#define DIRECTION_DOWN 1
#define BANDNUMBER 2048
/// 加时间戳
struct IS11_datastruct
{
u_int8_t type = 0; // 0 DN 1 Radiance 3 Reflectance 4 gain 5 offset
u_int8_t direction = 0; //0 up 1 down 2 dark_up 3 dark_down
u_int8_t tuigan_stat =0;//0:伸 1:缩
u_int8_t year= 0;
u_int8_t month= 0;
u_int8_t day= 0;
u_int8_t hour= 0;
u_int8_t minute= 0;
u_int8_t second= 0;
u_int32_t shutter_time = 0;
u_int64_t index = 0;
float temprature[8];
float data[BANDNUMBER];
};
struct clalidata_struct
{
uint32_t shutter;
float gain[BANDNUMBER];
float offset[BANDNUMBER];
};
/*-------------------------------------------------------------------------------------------------------------*/
/*
在此之下开始定义一些函数
*/
#endif

View File

@ -0,0 +1,33 @@
#ifndef COMMUNICATION_STRUCT_H
#define COMMUNICATION_STRUCT_H
// Define your communication structures here
// For example:
/*
如果发送和接受的数据结构一样,那么就定义一个结构体
struct MyComan_struct //对应的命令结构体 小驼峰命名法+struct
{
uint8_t Command;
uint16_t LenthofIn;
};
如果发送和接受的数据结构不一样,那么就分开定义
struct MyComan_Send_struct //对应的命令结构体 小驼峰命名法+Send_struct
{
uint8_t Command;
uint16_t LenthofIn;
};
struct MyComan_Recv_struct //对应的命令结构体 小驼峰命名法+Recv_struct
{
uint8_t Command;
uint16_t LenthofOut;
};
*/
#endif // COMMUNICATION_STRUCT_H

219
src/DS18B20.cpp Normal file
View File

@ -0,0 +1,219 @@
#include "DS18B20.h"
#include <log.h>
DeviceAddress sensor0 = { 0x28, 0x40, 0xB9, 0x2C ,0xF, 0x0, 0x0 ,0xEA };
DeviceAddress sensor1 = { 0x28, 0xB0, 0xBA, 0x2D ,0xF, 0x0, 0x0 ,0x59 };
DeviceAddress sensor2 = { 0x28, 0x8C ,0xDA ,0x2D, 0xF, 0x0 ,0x0, 0xD8 };
DeviceAddress sensor3 = { 0x28 ,0x4A ,0xD7, 0x2D, 0xF ,0x0 ,0x0 ,0x19 };
DeviceAddress sensor4 = { 0x28, 0x9E ,0xDA, 0x2D ,0xF, 0x0, 0x0, 0xED };
DeviceAddress sensor5 = { 0x28, 0xA9 ,0x0A ,0xFB, 0xD, 0x0, 0x0, 0x9C };
DeviceAddress sensor6 = { 0x28, 0x17 ,0xF6, 0x2C, 0xF ,0x0 ,0x0 ,0xC7 };
DeviceAddress sensor7 = { 0x28, 0xBF, 0x92, 0x2D ,0xF, 0x0, 0x0 ,0xBB };
DeviceAddress sensoraddr[8];
OneWire oneWire(DS18b20_pin);
DallasTemperature DS18b20(&oneWire);
int temp_number;
uint8_t *p[8] = {sensoraddr[0],sensoraddr[1],sensoraddr[2],sensoraddr[3],sensoraddr[4],sensoraddr[5],sensoraddr[6],sensoraddr[7]};
//冒泡排序 将温度地址 DeviceAddress sensoraddr[30]; 从小到大排序
void bubble_sort(DeviceAddress *addr,int n)
{
uint64_t a1 ,a2;
for (int i = 0; i < n; i++)
{
for(uint8_t b = 0 ; b<8;b++)
{
a1 += addr[i][b];
}
for (int j = 0; j < n-i-1; j++)
{
for(uint8_t c = 0 ; c<8;c++)
{
a2 += addr[j][c];
}
if (a1 > a2)
{
uint8_t *temp = p[i];
p[i] = p[j];
p[j] = temp;
}
}
}
}
uint8_t DS18b20_init()
{
//温度模块初始化
// DS18b20.setOneWire(&oneWire);
DS18b20.begin();
temp_number = DS18b20.getDeviceCount();
int i = 0;
while(temp_number <= 0 )
{
temp_number = DS18b20.getDeviceCount();
vTaskDelay(500);
if (i>=5)
{
write_log(log_path,"ds18b2 init failed,no ds18b20",10);
return 0;
}
i++;
}
write_log(log_path,"ds18b20 has" + String(temp_number),10);
for(size_t i = 0; i < temp_number; i++)
{
DS18b20.getAddress(sensoraddr[i],i);
}
bubble_sort(sensoraddr,temp_number);
return temp_number;
}
//温度监测
void getall_temp(float *temp)
{
DS18b20.requestTemperatures(); // Send the command to get temperatures
for(int8_t i ;i<temp_number;i++)
{
temp[i] = DS18b20.getTempC(p[i]);
// temp[i] = getone_temp(i);
}
write_log(log_path,"get temperatures ok",10);
}
float getone_temp(uint8_t address)
{
float temp;
DS18b20.requestTemperatures(); // Send the command to get temperatures
temp = DS18b20.getTempC(p[address]);
return temp;
}
void set_ds18b20_address(uint8_t num,uint8_t * addr)
{
// uint8_t num = addr[0];
memcpy(&sensoraddr[num],addr,8);
}
//测试用
//温度监测
// void getall_temp(float *temp)
// {
// DS18b20.requestTemperatures(); // Send the command to get temperatures
// for (u_int32_t i = 0; i < temp_number; i++)
// {
// temp[i] = DS18b20.getTempC(sensoraddr[i]);
// }
// }
// uint8_t get_ds18b20_addr()
// {
// float temp[8];
// getall_temp(temp);
// for(size_t i = 0; i < temp_number; i++)
// {
// Serial.printf("%d temp: %2f ds18b20 addr :",i,temp[i]);
// for(int a = 0 ; a< 8 ;a++)
// {
// Serial.printf(" %x ",sensoraddr[i][a]);
// }
// Serial.println("");
// }
// return 0;
// }
// {
// "sensor0":{
// "byte0":"",
// "byte1":"",
// "byte2":"",
// "byte3":"",
// "byte4":"",
// "byte5":"",
// "byte6":"",
// "byte7":""
// },
// "sensor1":{
// "byte0":"",
// "byte1":"",
// "byte2":"",
// "byte3":"",
// "byte4":"",
// "byte5":"",
// "byte6":"",
// "byte7":""
// },
// "sensor2":{
// "byte0":"",
// "byte1":"",
// "byte2":"",
// "byte3":"",
// "byte4":"",
// "byte5":"",
// "byte6":"",
// "byte7":""
// },
// "sensor3":{
// "byte0":"",
// "byte1":"",
// "byte2":"",
// "byte3":"",
// "byte4":"",
// "byte5":"",
// "byte6":"",
// "byte7":""
// },
// "sensor4":{
// "byte0":"",
// "byte1":"",
// "byte2":"",
// "byte3":"",
// "byte4":"",
// "byte5":"",
// "byte6":"",
// "byte7":""
// },
// "sensor5":{
// "byte0":"",
// "byte1":"",
// "byte2":"",
// "byte3":"",
// "byte4":"",
// "byte5":"",
// "byte6":"",
// "byte7":""
// },
// "sensor6":{
// "byte0":"",
// "byte1":"",
// "byte2":"",
// "byte3":"",
// "byte4":"",
// "byte5":"",
// "byte6":"",
// "byte7":""
// },
// "sensor7":{
// "byte0":"",
// "byte1":"",
// "byte2":"",
// "byte3":"",
// "byte4":"",
// "byte5":"",
// "byte6":"",
// "byte7":""
// }
// }

14
src/DS18B20.h Normal file
View File

@ -0,0 +1,14 @@
#ifndef _DS18B20_H_
#define _DS18B20_H_
//DS18B20库
#include <OneWire.h>
#include <DallasTemperature.h>
#define DS18b20_pin 4
uint8_t DS18b20_init();
void getall_temp(float *temp);
float getone_temp(uint8_t address);
uint8_t get_ds18b20_addr();
void set_ds18b20_address(uint8_t num,uint8_t * addr);
#endif

10
src/Define.h Normal file
View File

@ -0,0 +1,10 @@
#ifndef Define_h
#define Define_h
//#define DebugCalibration
//#define DINBIAO
//#define Curentvsion "V2.4b"\
#define Curentvsion "V2.5b"
#define Curentvsion "V2.3"
#define TINY_GSM_DEBUG Serial
#endif

164
src/GSMMannager.cpp Normal file
View File

@ -0,0 +1,164 @@
#include "GSMMannager.h"
// #include "SoftwareSerial.h"
// uint32_t AIR_AutoBaud();
const char apn[] = "CMNET";
const char gprsUser[] = "";
const char gprsPass[] = "";
HardwareSerial *MySerial;
GSMMannger::GSMMannger(int serialnumber, int rx, int tx)
{
MySerial=new HardwareSerial(serialnumber);
modem = new TinyGsm(*MySerial);
MySerial->begin(115200, SERIAL_8N1, rx, tx);
client = new TinyGsmClient(*modem);
// !!!!!!!!!!! <20>ϵ<EFBFBD>
// Serial.println("Wait...");
write_log(log_path,"Wait...",10);
pinMode(37, OUTPUT); //pin32控制sim800C电源 高电平上电 低电平断电
digitalWrite(37, HIGH);
vTaskDelay(100);
digitalWrite(37, LOW);
// Serial.println("Wait...1");
write_log(log_path,"Wait...1",10);
vTaskDelay(1800);
// Set your reset, enable, power pins here
// !!!!!!!!!!!
vTaskDelay(5000);
// Set GSM module baud rate
// MySerial->readString();
int banddd=TinyGsmAutoBaud(*MySerial, rx, tx, 9600,460800);
if (banddd==0)
{
// Serial.println("fail to connect sim800 reboot");
write_log(log_path,"fail to connect sim800 reboot",10);
esp_restart();
/* code */
}
// Serial.println("band is" + String(banddd));
write_log(log_path,"band is" + String(banddd),10);
vTaskDelay(6000);
modem->init();
String modemInfo = modem->getModemInfo();
if (modemInfo=="")
{
// Serial.println("fail to getmode reboot");
write_log(log_path,"fail to getmode reboot",10);
esp_restart();
/* code */
}
// Serial.print("Modem Info: ");
write_log(log_path,"Modem Info: ",10);
//以后用4G再
// SerialMon.println(modemInfo);
write_log(log_path,modemInfo,10);
if (GSM_PIN && modem->getSimStatus() != 3)
{
modem->simUnlock(GSM_PIN);
}
// SerialMon.print("Waiting for network...");
write_log(log_path,"Waiting for network...",10);
if (!modem->waitForNetwork())
{
// SerialMon.println(" fail");
write_log(log_path,"fail",10);
vTaskDelay(10000);
return;
}
// SerialMon.println(" success");
write_log(log_path,"success",10);
if (modem->isNetworkConnected())
{
// SerialMon.println("Network connected");
write_log(log_path,"Network connected",10);
}
// SerialMon.print(F("Connecting to "));
write_log(log_path,"Connecting to ",10);
// SerialMon.print(apn);
write_log(log_path,apn,10);
if (!modem->gprsConnect(apn, gprsUser, gprsPass))
{
// SerialMon.println(" fail");
write_log(log_path,"fail",10);
vTaskDelay(10000);
return;
}
// SerialMon.println(" success");
write_log(log_path,"success",10);
if (modem->isGprsConnected())
{
// SerialMon.println("GPRS connected");
write_log(log_path,"GPRS connected",10);
}
modem->NTPServerSync();
}
String GSMMannger::I2toS(int n)
{
if (n>=10)
{
return String(n);
} else{
return "0"+ String(n);
}
}
String GSMMannger::GetDataAndTime() {
//String str=modem->getGSMDateTime(DATE_FULL);
if(modem->getNetworkTime(&year,&month,&day,&hour,&minute, &second,&timezone))
{
String date=String(year)+"-"+I2toS(month)+"-"+I2toS(day)+" "+I2toS(hour)+":"+I2toS(minute)+":"+I2toS(second);
return date;}
return "-1";
}
void GSMMannger::loop()
{
if (!modem->isNetworkConnected())
{
SerialMon.println("Network disconnected");
if (!modem->waitForNetwork(20000L, true))
{
SerialMon.println(" re wait For Network fail");
esp_restart();
vTaskDelay(10000);
return;
}
if (modem->isNetworkConnected())
{
SerialMon.println("Network re-connected");
}
// and make sure GPRS/EPS is still connected
if (!modem->isGprsConnected())
{
SerialMon.println("GPRS disconnected!");
SerialMon.print(F("Connecting to "));
SerialMon.print(apn);
if (!modem->gprsConnect(apn, gprsUser, gprsPass))
{
SerialMon.println(" set apn gprsuser gprspass fail");
esp_restart();
vTaskDelay(10000);
return;
}
if (modem->isGprsConnected())
{
SerialMon.println("GPRS reconnected");
}
}
}
}

39
src/GSMMannager.h Normal file
View File

@ -0,0 +1,39 @@
#ifndef _GSMMannager_H_
#define _GSMMannager_H_
#define TINY_GSM_MODEM_SIM800
#define SerialMon Serial
#include <TinyGsmClient.h>
#include <PubSubClient.h>
#include "log.h"
//#define TINY_GSM_DEBUG SerialMon
#define GSM_AUTOBAUD_MIN 9600
#define GSM_AUTOBAUD_MAX 115200
#define TINY_GSM_USE_GPRS true
#define TINY_GSM_USE_WIFI false
#define GSM_PIN ""
class GSMMannger
{
public:
GSMMannger(int serialnumber,int rx,int tx); // <20><><EFBFBD>ǹ<EFBFBD><C7B9><EFBFBD><ECBAAF>
// GSMMannger();
TinyGsm *modem;
TinyGsmClient *client;
String GetDataAndTime();
void loop();
String I2toS(int n);
int year,month, day, hour,minute, second;
float timezone;
};
#endif

174
src/IRIS_Method.cpp Normal file
View File

@ -0,0 +1,174 @@
/**
******************************************************************************
* @file : IRIS_Method.c
* @author : xin
* @brief : None
* @attention : None
* @date : 2024/2/1
******************************************************************************
*/
//
// Created by xin on 2024/2/1.
//
#include "IRIS_Method.h"
int32_t IRIS_Protocol_Pack(uint8_t Command, uint16_t LenthofIn, uint8_t *BufferIn, uint8_t *PackData) {
if (PackData == NULL || (LenthofIn != 0 && BufferIn == NULL)) {
return -1;
}
PackData[0] = 0x55;
PackData[1] = 0xAA;
PackData[2] = Command;
uint16_t datalenth = LenthofIn;
PackData[3] = (datalenth >> 8) & 0xFF;
PackData[4] = datalenth & 0xFF;
if (LenthofIn != 0) {
memcpy(&PackData[5], BufferIn, LenthofIn);
}
uint16_t crcbytelenth = LenthofIn;
uint16_t CRC = IRIS_calcCRC(PackData + 5, crcbytelenth);
PackData[LenthofIn + 5] = (CRC >> 8) & 0xFF;
PackData[LenthofIn + 6] = CRC & 0xFF;
return LenthofIn + 7;
}
int32_t IRIS_STM32_Protocol_Unpack(uint8_t *PackData, uint16_t LenthofIn, uint8_t *Command, uint8_t *BufferOut) {
if (PackData == NULL || BufferOut == NULL) {
return ERROR_INPUT;
}
if (PackData[0] != 0x55 || PackData[1] != 0xAA) {
return ERROR_HEADER;
}
uint16_t LenthofOut = PackData[4] + (PackData[3] << 8); //减去CRC的两个字节
if (LenthofOut > LenthofIn - 7) {
return ERROR_NOT_ENOUGH_DATA;
}
if (PackData[LenthofOut + 6] == 0xEE && PackData[LenthofOut + 5] == 0xEE) {
} else {
uint16_t CRC = IRIS_calcCRC(PackData + 5, LenthofOut);
if (CRC != (PackData[LenthofOut + 6] + (PackData[LenthofOut + 5] << 8))) {
return ERROR_CRC;
}
}
if (LenthofOut == 0) {
return 0;
}
*Command = PackData[2];
memcpy(BufferOut, &PackData[5], LenthofOut);
return LenthofOut;
}
int32_t IRIS_Protocol_Unpack(uint8_t *PackData, uint16_t LenthofIn, uint8_t Command, uint8_t *BufferOut) {
if (PackData == NULL || BufferOut == NULL) {
return ERROR_INPUT;
}
if (PackData[0] != 0x55 || PackData[1] != 0xAA) {
return ERROR_HEADER;
}
if (PackData[2] != Command) {
return ERROR_COMMAND;
}
uint16_t LenthofOut = PackData[4] + (PackData[3] << 8);
if (LenthofOut > LenthofIn - 7) {
return ERROR_NOT_ENOUGH_DATA;
}
if (PackData[LenthofOut + 6] == 0xEE && PackData[LenthofOut + 5] == 0xEE) {
} else {
uint16_t CRC = IRIS_calcCRC(PackData + 5, LenthofOut);
if (CRC != (PackData[LenthofOut + 6] + (PackData[LenthofOut + 5] << 8))) {
return ERROR_CRC;
}
}
if (LenthofOut == 0) {
return 0;
}
memcpy(BufferOut, &PackData[5], LenthofOut);
return LenthofOut;
}
int32_t IRIS_Cut_Befor_Header(uint8_t *PackData, uint16_t LenthofIn) {
if (PackData == NULL) {
return ERROR_INPUT;
}
uint16_t i = 0;
for (i = 0; i < LenthofIn; i++) {
if (PackData[i] == 0x55 && PackData[i + 1] == 0xAA) {
break;
}
}
if (i == LenthofIn) {
//清空数据
memset(PackData, 0, LenthofIn);
return 0;
}
uint16_t LenthofOut = LenthofIn - i;
memcpy(PackData, &PackData[i], LenthofOut);
return LenthofOut;
}
int32_t IRIS_Check_Data_Valid(uint8_t *PackData, uint16_t LenthofIn) {
if (PackData == NULL) {
return ERROR_INPUT;
}
if (LenthofIn < 7) {
return ERROR_NOT_ENOUGH_DATA;
/* code */
}
if (PackData[0] != 0x55 || PackData[1] != 0xAA) {
return ERROR_HEADER;
}
uint16_t LenthofOut = PackData[4] + (PackData[3] << 8);
if (LenthofOut > LenthofIn - 7) {
return ERROR_NOT_ENOUGH_DATA;
}
if (PackData[LenthofOut + 6] == 0xEE && PackData[LenthofOut + 5] == 0xEE) {
} else {
uint16_t CRC = IRIS_calcCRC(PackData + 5, LenthofOut);
if (CRC != (PackData[LenthofOut + 6] + (PackData[LenthofOut + 5] << 8))) {
return ERROR_CRC;
}
}
return 1;
}
uint16_t IRIS_calcCRC(const void *pBuffer, uint16_t bufferSize) {
const uint8_t *pBytesArray = (const uint8_t *) pBuffer;
uint16_t poly = 0x8408;
uint16_t crc = 0;
uint8_t carry;
uint8_t i_bits;
uint16_t j;
for (j = 0; j < bufferSize; j++) {
crc = crc ^ pBytesArray[j];
for (i_bits = 0; i_bits < 8; i_bits++) {
carry = crc & 1;
crc = crc / 2;
if (carry) {
crc = crc ^ poly;
}
}
}
return crc;
}

60
src/IRIS_Method.h Normal file
View File

@ -0,0 +1,60 @@
/**
******************************************************************************
* @file : IRIS_Method.h
* @author : xin
* @brief : None
* @attention : None
* @date : 2024/2/1
******************************************************************************
*/
//
// Created by xin on 2024/2/1.
//
#ifndef IRIS_COMMUNICATION_PROTOCOL_IRIS_METHOD_H
#define IRIS_COMMUNICATION_PROTOCOL_IRIS_METHOD_H
#define ERROR_NOT_ENOUGH_DATA -200
#define ERROR_HEADER -300
#define ERROR_COMMAND -400
#define ERROR_INPUT -500
#define ERROR_CRC -600
#include <stdint.h>
#include<Arduino.h>
// 成功返回打包后的数据长度
// -1: Error
// 成功返回打包后的数据长度
int32_t IRIS_Protocol_Pack(uint8_t Command,uint16_t LenthofIn, uint8_t *BufferIn, uint8_t *PackData);
// 解包函数 PackData 是接收到的数据 LenthofIn 是数据长度 Command 是命令 BufferOut 是输出
// 下位机使用的打包函数 Command 是输出
// 成功返回解包后的数据长度
// 0: 该命令返回无参数
// 错误返回ERRor
// 成功返回解包后的数据长度
int32_t IRIS_STM32_Protocol_Unpack(uint8_t *PackData, uint16_t LenthofIn, uint8_t *Command, uint8_t *BufferOut);
// 解包函数 PackData 是接收到的数据 LenthofIn 是数据长度 Command 是命令输入 BufferOut 是输出 上位机使用
// 成功返回解包后的数据长度
// 0: 该命令返回无参数
// 错误返回ERRor
// 成功返回解包后的数据长度
int32_t IRIS_Protocol_Unpack(uint8_t *PackData, uint16_t LenthofIn, uint8_t Command, uint8_t *BufferOut);
// 定义裁切命令
// 成功返回裁切后的数据长度
// -1: Error
int32_t IRIS_Cut_Befor_Header(uint8_t *PackData, uint16_t LenthofIn );
// 检查数据是否有效
// 有效返回值1
// 错误返回ERRor
int32_t IRIS_Check_Data_Valid(uint8_t *PackData, uint16_t LenthofIn );
// 返回CRC校验值
uint16_t IRIS_calcCRC(const void *pBuffer, uint16_t bufferSize);
#endif //IRIS_COMMUNICATION_PROTOCOL_IRIS_METHOD_H

218
src/IS11Comon.cpp Normal file
View File

@ -0,0 +1,218 @@
#include "IS11Comon.h"
u_char BufferForRead[10000];
int TotalIndexNow = 0;
u_char BufferFortempWrite[1000];
// MySerialWrite=nullptr;
SERIALWRITE MySerialWrite = nullptr;
SERIALREAD MySerialRead = nullptr;
bool ISIS11Init = false;
uint16_t crc16(const uint8_t *data, size_t len, uint16_t polynomial)
{
uint16_t i, j, tmp, CRC16;
CRC16 = 0xFFFF; // CRC寄存器初始值
for (i = 0; i < len; i++)
{
CRC16 ^= data[i];
for (j = 0; j < 8; j++)
{
tmp = (uint16_t)(CRC16 & 0x0001);
CRC16 >>= 1;
if (tmp == 1)
{
CRC16 ^= polynomial; // 异或多项式
}
}
}
return CRC16;
}
size_t SendSettingCommand(u_char *Command, size_t CommandLenth, u_char *Value, size_t ValueLenth)
{
memcpy(BufferFortempWrite, Command, CommandLenth);
memcpy(BufferFortempWrite + CommandLenth, Value, ValueLenth);
uint16_t crc = crc16(BufferFortempWrite, CommandLenth + ValueLenth);
memcpy(BufferFortempWrite + CommandLenth + ValueLenth, &crc, 2);
SerialWrite(BufferFortempWrite, CommandLenth + ValueLenth + 2);
return GetSetBackFromSensor();
}
size_t SendGetData(int shutter)
{
int lenth = sizeof(GET_ALL_DN);
uint16_t crc = crc16(GET_ALL_DN, lenth);
memcpy(BufferFortempWrite, GET_ALL_DN, lenth);
memcpy(BufferFortempWrite + lenth, &crc, 2);
SerialWrite(BufferFortempWrite, lenth + 2);
// String datastr;
// for (size_t i = 0; i < lenth + 2; i++)
// {
// datastr += String(BufferFortempWrite[i]);
// }
// write_log(gp_log, "send data:" + datastr, 20);
vTaskDelay(shutter);
return GetInfoBackFromSensor(true);
}
size_t SendGetSensorInfo(u_char *Command, size_t lenth)
{
uint16_t crc = crc16(Command, lenth);
memcpy(BufferFortempWrite, Command, lenth);
memcpy(BufferFortempWrite + lenth, &crc, 2);
SerialWrite(BufferFortempWrite, lenth + 2);
String datastr;
for (size_t i = 0; i < lenth + 2; i++)
{
datastr += String(BufferFortempWrite[i]);
}
write_log(gp_log, "send data:" + datastr, 20);
size_t retunnumber = GetInfoBackFromSensor();
return retunnumber;
}
size_t GetSetBackFromSensor()
{
TotalIndexNow = 0;
TotalIndexNow += SerailRead(BufferForRead + TotalIndexNow, 1);
while (TotalIndexNow < 8)
{
TotalIndexNow += SerailRead(BufferForRead + TotalIndexNow, 1);
}
return TotalIndexNow;
}
bool panduanHeader()
{
if (TotalIndexNow < 2)
{
return false;
/* code */
}
int temp = 0;
while (BufferForRead[temp] != 0x01 &&
!(BufferForRead[temp + 1] == 0x03 || BufferForRead[temp + 1] == 0x06 || BufferForRead[temp + 1] == 0x10))
{
if (temp >= TotalIndexNow - 2)
{
break;
/* code */
}
temp++;
/* code */
}
memcpy(BufferForRead, BufferForRead + temp, TotalIndexNow - temp);
TotalIndexNow = TotalIndexNow - temp;
temp = 0;
if (BufferForRead[temp] != 0x01 &&
!(BufferForRead[temp + 1] == 0x03 || BufferForRead[temp + 1] == 0x06 || BufferForRead[temp + 1] == 0x10))
{
return false;
}
return true;
}
size_t GetInfoBackFromSensor(bool isbig) // big 是指用几个字节表示数据长度 暂时只发现采集数据时用两个字节
{
if (isbig)
{
TotalIndexNow = 0;
memset(BufferForRead, 0, sizeof(BufferForRead));
TotalIndexNow += SerailRead(BufferForRead + TotalIndexNow, 2);
while (!panduanHeader())
{
TotalIndexNow += SerailRead(BufferForRead + TotalIndexNow, 1);
}
while (TotalIndexNow < 4)
{
TotalIndexNow += SerailRead(BufferForRead + TotalIndexNow, 1);
}
int lenth = BufferForRead[2] * 256 + BufferForRead[3];
while (TotalIndexNow < lenth + 4)
{
TotalIndexNow += SerailRead(BufferForRead + TotalIndexNow, 1024);
}
return TotalIndexNow;
}
else
{
// 长度用一个字节表示
TotalIndexNow = 0;
TotalIndexNow += SerailRead(BufferForRead + TotalIndexNow, 1);
while (TotalIndexNow < 3)
{
TotalIndexNow += SerailRead(BufferForRead + TotalIndexNow, 1);
}
int lenth = BufferForRead[2];
while (TotalIndexNow < lenth + 5)
{
TotalIndexNow += SerailRead(BufferForRead + TotalIndexNow, 1);
}
return TotalIndexNow;
}
}
size_t SerialWrite(u_char *data, size_t lenth)
{
if (MySerialWrite != nullptr)
{
return MySerialWrite(data, lenth);
}
return 0;
}
size_t SerailRead(u_char *data, size_t lenth)
{
if (MySerialRead != nullptr)
{
return MySerialRead(data, lenth);
}
return 0;
}
void InitFunction(SERIALWRITE a, SERIALREAD readfunc)
{
MySerialWrite = a;
MySerialRead = readfunc;
ISIS11Init = true;
}
u_char *GetDataBufferPTR()
{
return BufferForRead;
}
bool isSensorInit()
{
return ISIS11Init;
}
void CoverLittleAndBig(char *data, int lenth)
{
char *tempdata = new char[lenth];
memcpy(tempdata, data, lenth);
for (size_t i = 0; i < lenth / 2; i++)
{
data[2 * i] = tempdata[2 * i + 1];
data[2 * i + 1] = tempdata[2 * i];
/* code */
}
delete[] tempdata;
}

143
src/IS11Comon.h Normal file
View File

@ -0,0 +1,143 @@
/**
* @brief is11相关底层函数
*
*/
#ifndef __IS11COMON_H__
#define __IS11COMON_H__
#ifndef IS11COMMON_H
#define IS11COMMON_H
#include <stdint.h>
#include <stddef.h>
#include <string>
#include<Arduino.h>
#include "log.h"
#define COMMAND_GET 0x03
#define COMMAND_SET 0x06
#define COMMAND_MULTSET 0x10
#define POLYNOMIAL 0xa001 //modbus crc
typedef unsigned char u_char;
/**
* @brief 串口写函数类型
*
*/
typedef size_t (*SERIALWRITE)(u_char* data,size_t lenth);
/**
* @brief 串口读函数原型
*
*/
typedef size_t (*SERIALREAD)(u_char* data,size_t lenth);
const u_char GET_ADDRESS[] ={0x01,0x03,0x00,0x01,0x00,0x01};
const u_char GET_BANDRATE[] ={0x01,0x03,0x00,0x02,0x00,0x01};
const u_char GET_INTEGRAL_TIME[] ={0x01,0x03,0x00,0x06,0x00,0x01};
const u_char GET_AVERAGE_NUMBER[] ={0x01,0x03,0x00,0x07,0x00,0x01};
const u_char GET_WAVELENTH_AT_BAND[]={0x01,0x03,0x00,0x10,0x00,0x02};
const u_char GET_VALUE_AT_BAND[] ={0x01,0x03,0x00,0x30,0x00,0x02};
const u_char GET_SETTING_OF_LAMP[] ={0x01,0x03,0x00,0x04,0x00,0x01};
const u_char GET_WAVELENTH_COEFF[] ={0x01,0x03,0x00,0x20,0x00,0x08};
const u_char GET_ALL_DN[] ={0x01,0x03,0x01,0x00,0x10,0x00};
const u_char GET_SERIAL_NUMBER[] ={0x01,0x03,0x00,0x40,0x00,0x00};
const u_char GET_PRODUCT_NAME[] ={0x01,0x03,0x00,0x50,0x00,0x00};
const u_char SET_ADDRESS[] ={0x01,0x06,0x00,0x01};
// const u_char SET_BandRATE[] ={0x01,0x06,0x00,0x02};
const u_char SET_INTEGRAL_TIME[] ={0x01,0x06,0x00,0x06};
const u_char SET_AVERAGE_NUMBER[] ={0x01,0x06,0x00,0x07};
const u_char SET_WORK_MODE[] ={0x01,0x06,0x00,0x01};
const u_char SET_WAVELENTH_COEFF[] ={0x01,0x10,0x00,0x20,0x00,0x08,0x16};
/**
* @brief 判断传感器是否初始化完成
*
* @return true
* @return false
*/
bool isSensorInit();
/**
* @brief 初始化传感器
*
* @param writefunc 写函数
* @param readfunc 读函数
*/
void InitFunction(SERIALWRITE writefunc,SERIALREAD readfunc);
/**
* @brief 获取 BufferForRead 的指针 用于读取返回的数据
*
*/
u_char * GetDataBufferPTR();
/**
* @brief 发送获取设备信息的指令 适用于Get指令
*
* @param Command 指令 预定的数组
* @param lenth 指令长度 可以用sizeof来求算
* @return size_t 返回数据的长度 输出存放于 BufferForRead;
*/
size_t SendGetSensorInfo(u_char * Command,size_t lenth);//此过程不适合获取数据
/**
* @brief
*
* @param shutter
* @return size_t
*/
size_t SendGetData(int shutter);
/**
* @brief 发送设置指令
*
* @param Command 指令内容
* @param CommandLenth 指令长度
* @param Value 设置值
* @param ValueLenth 值长度 默认是两个字节
* @return size_t 返回值长度
*/
size_t SendSettingCommand(u_char * Command,size_t CommandLenth,u_char *Value,size_t ValueLenth=2);
//big
/**
* @brief 用来获取信息的返回的数据
*
* @param isbig 是指用几个字节表示数据长度 暂时只发现采集数据时用两个字节
* @return size_t 接收到的数据大小
*/
size_t GetInfoBackFromSensor(bool isbig=false);
/**
* @brief 获取设置后返回数据
*
* @return size_t 返回数据长度;
*/
size_t GetSetBackFromSensor();
/**
* @brief
*
* @param data
* @param lenth
* @return size_t
*/
size_t SerialWrite(u_char* data,size_t lenth);
size_t SerailRead(u_char* data,size_t lenth=0);
/**
* @brief 计算crc16
*
* @param data 数据
* @param len 数据长度
* @param polynomial crc16多项式 默认是A001H
* @return uint16_t crc16的值
*/
uint16_t crc16(const uint8_t *data, size_t len, uint16_t polynomial=POLYNOMIAL) ;
bool panduanHeader();
void CoverLittleAndBig(char *data,int lenth);
#endif
#endif // __IS11COMON_H__

5
src/MyEsp8266.cpp Normal file
View File

@ -0,0 +1,5 @@
//
// Created by xin on 2022/4/28.
//
#include "MyEsp8266.h"

14
src/MyEsp8266.h Normal file
View File

@ -0,0 +1,14 @@
//
// Created by xin on 2022/4/28.
//
#ifndef ESP32MAINBOARD_MYESP8266_H
#define ESP32MAINBOARD_MYESP8266_H
class MyEsp8266 {
};
#endif //ESP32MAINBOARD_MYESP8266_H

139
src/MyWebServer.cpp Normal file
View File

@ -0,0 +1,139 @@
#include "MyWebServer.h"
ESPWebServer *ESPStaticServer;
void webserver::printn(String str)
{
if (serialmy != nullptr)
{
serialmy->print(str);
}
}
void webserver::initme()
{
printn("webserver begain\n");
// wifiMulti.addAP("IRIS", "irishk*******"); // 将需要连接的一系列WiFi ID和密码输入这里
// wifiMulti.addAP("ssid_from_AP_2", "your_password_for_AP_2"); // ESP8266-NodeMCU再启动后会扫描当前网络
// wifiMulti.addAP("ssid_from_AP_3", "your_password_for_AP_3"); // 环境查找是否有这里列出的WiFi ID。如果有
// printn("Connecting ..."); // 则尝试使用此处存储的密码进行连接。
// int i = 0;
// while (wifiMulti.run() != WL_CONNECTED) { // 尝试进行wifi连接。
// vTaskDelay(1000);
// printn("retry to connect wifi");
// }
// WiFi连接成功后将通过串口监视器输出连接成功信息
printn("Connected to \n");
printn(WiFi.SSID()); // 通过串口监视器输出连接的WiFi名称
printn("IP address:\t");
printn(WiFi.localIP().toString()); // 通过串口监视器输出ESP8266-NodeMCU的IP
printn("\n");
if (SPIFFS.begin())
{ // 启动闪存文件系统
printn("SPIFFS Started.\n");
}
else
{
printn("SPIFFS Failed to Start.\n");
}
server->onNotFound(handleUserRequet); // 告知系统如何处理用户请求
server->begin(); // 启动网站服务
printn("HTTP server started\n");
}
webserver::webserver(HardwareSerial *serial)
{
serialmy = serial;
server=new ESPWebServer(80);
ESPStaticServer=server;
initme();
}
webserver::webserver()
{
serialmy = nullptr;
server=new ESPWebServer(80);
ESPStaticServer=server;
initme();
}
webserver::~webserver()
{
}
void webserver::handleUserRequet()
{
// Serial.println("some one come\n");
write_log(log_path,"some one come\n",10);
// 获取用户请求网址信息
String webAddress = ESPStaticServer->uri();
// 通过handleFileRead函数处处理用户访问
bool fileReadOK = handleFileRead(webAddress);
// 如果在SPIFFS无法找到用户访问的资源则回复404 (Not Found)
if (!fileReadOK)
{
ESPStaticServer->send(404, "text/plain", "404 Not Found");
}
}
bool webserver::handleFileRead(String path)
{ //处理浏览器HTTP访问
if (path.endsWith("/"))
{ // 如果访问地址以"/"为结尾
path = "/index.html"; // 则将访问地址修改为/index.html便于SPIFFS访问
}
String contentType = getContentType(path); // 获取文件类型
if (SPIFFS.exists(path))
{ // 如果访问的文件可以在SPIFFS中找到
File file = SPIFFS.open(path, "r"); // 则尝试打开该文件
ESPStaticServer->streamFile(file, contentType); // 并且将该文件返回给浏览器
file.close(); // 并且关闭文件
return true; // 返回true
}
return false; // 如果文件未找到则返回false
}
// 获取文件类型
String webserver::getContentType(String filename)
{
if (filename.endsWith(".htm"))
return "text/html";
else if (filename.endsWith(".html"))
return "text/html";
else if (filename.endsWith(".css"))
return "text/css";
else if (filename.endsWith(".js"))
return "application/javascript";
else if (filename.endsWith(".png"))
return "image/png";
else if (filename.endsWith(".gif"))
return "image/gif";
else if (filename.endsWith(".jpg"))
return "image/jpeg";
else if (filename.endsWith(".ico"))
return "image/x-icon";
else if (filename.endsWith(".xml"))
return "text/xml";
else if (filename.endsWith(".pdf"))
return "application/x-pdf";
else if (filename.endsWith(".zip"))
return "application/x-zip";
else if (filename.endsWith(".gz"))
return "application/x-gzip";
return "text/plain";
}
void webserver::loop()
{
ESPStaticServer->handleClient();
// printn("...");
}

40
src/MyWebServer.h Normal file
View File

@ -0,0 +1,40 @@
#ifndef wenserver_H
#define wenserver_H
#define ESP32
#ifdef ESP32
#include "WebServer.h"
#include "WiFi.h"
#include "Arduino.h"
#include "SPIFFS.h"
#define ESPWebServer WebServer
#elif
#include <ESP8266WebServer.h>
#include <ESP8266WiFi.h>
#define ESPWebServer ESP8266WebServer
#endif
#include <FS.h>
#include "log.h"
class webserver
{
private:
public:
webserver(HardwareSerial *serial);
webserver();
void initme();
HardwareSerial *serialmy;
~webserver();
static void handleUserRequet();
static bool handleFileRead(String path);
static String getContentType(String filename);
void loop();
void printn(String str);
ESPWebServer *server;
};
#endif

314
src/SDmanger.cpp Normal file
View File

@ -0,0 +1,314 @@
#include"SDmanger.h"
File Comenfile;
int sdcard::init_sdcard()
{
SD_MMC.setPins(9,10,11,12,13,14);
int succ = SD_MMC.begin("/sdcard", true,true,150);
if (succ) {
// Serial.printf("SD_MMC Begin: %d\n", succ);
write_log(log_path,"SD_MMC Begin: "+String(succ),10);
uint8_t cardType = SD_MMC.cardType();
// Serial.print("SD_MMC Card Type: ");
write_log(log_path,"SD_MMC Card Type: ",10);
if (cardType == CARD_MMC) {
// Serial.println("MMC");
write_log(log_path,"MMC",10);
} else if (cardType == CARD_SD) {
// Serial.println("SDSC");
write_log(log_path,"SDSC",10);
} else if (cardType == CARD_SDHC) {
// Serial.println("SDHC");
write_log(log_path,"SDHC",10);
} else {
// Serial.println("UNKNOWN");
write_log(log_path,"UNKNOWN",10);
}
uint64_t cardSize = SD_MMC.cardSize() / (1024 * 1024);
uint32_t c = cardSize;
// Serial.printf("SD_MMC Card Size: %lluMB\n", cardSize);
write_log(log_path,"SD_MMC Card Size: "+String(c)+"MB",10);
// Serial.printf("Total space: %lluMB\n", SD_MMC.totalBytes() / (1024 * 1024));
float a = SD_MMC.totalBytes() / (1024 * 1024);
write_log(log_path,"Total space: "+String(a)+"MB",10);
// Serial.printf("Used space: %lluMB\n", SD_MMC.usedBytes() / (1024 * 1024));
a = SD_MMC.usedBytes() / (1024 * 1024);
write_log(log_path,"Used space: "+String(a)+"MB",10);
mylistDir( "/", 0);
// File file;
// file.listFiles("/");
// file.flush();
// file.close();
} else {
// Serial.printf("Failed to mount SD card VFAT filesystem. \n");
write_log(log_path,"Failed to mount SD card VFAT filesystem. ",10);
// Serial.println("Do you have an SD Card installed?");
write_log(log_path,"Do you have an SD Card installed?",10);
// Serial.println("Check pin 12 and 13, not grounded, or grounded with 10k resistors!\n\n");
write_log(log_path,"Check pin 12 and 13, not grounded, or grounded with 10k resistors!\n\n",10);
// major_fail();
}
return ESP_OK;
}
void sdcard::mylistDir( const char * dirname, uint8_t levels) {
write_log(log_path,"Listing directory: "+String(dirname),10);
String dir(dirname);
File root = SD_MMC.open(dirname);
if (!root) {
write_log(log_path,"Failed to open directory",10);
return;
}
if (!root.isDirectory()) {
write_log(log_path,"Not a directory",10);
return;
}
File filex = root.openNextFile();
while (filex) {
if (filex.isDirectory())
{
write_log(log_path," DIR : " + String(filex.name()),10);
if (levels) {
String filename=dir+"/"+String(filex.name());
mylistDir( filename.c_str(), levels - 1);
}
}
else
{
write_log(log_path," FILE: " + String(filex.name()) + " size :"+ String(filex.size()) + "B",10);
}
filex = root.openNextFile();
}
}
bool sdcard::ListDir(const char * dirname,Vector <String> &stringlist)
{
stringlist.clear();
// Serial.printf("Listing directory: %s\n", dirname);
write_log(log_path,"Listing directory: "+String(dirname),10);
String dir(dirname);
File root = SD_MMC.open(dirname);
if (!root) {
// Serial.println("Failed to open directory");
write_log(log_path,"Failed to open directory",10);
return true;
}
if (!root.isDirectory()) {
// Serial.println("Not a directory");
write_log(log_path,"Not a directory",10);
return true;
}
File filex = root.openNextFile();
while (filex)
{
if (filex.isDirectory()) {
} else {
String filename=dir+"/"+String(filex.name());
stringlist.push_back(filename);
if (stringlist.size()==stringlist.max_size())
{
return false;
/* code */
}
}
filex = root.openNextFile();
}
return true;
}
void sdcard::delete_old_stuff() {
// Serial.printf("Total space: %lluMB\n", SD_MMC.totalBytes() / (1024 * 1024));
float a = SD_MMC.totalBytes() / (1024 * 1024);
write_log(log_path,"Total space: "+String(a)+"MB",10);
// Serial.printf("Used space: %lluMB\n", SD_MMC.usedBytes() / (1024 * 1024));
a = SD_MMC.usedBytes() / (1024 * 1024);
write_log(log_path,"Used space: "+String(a)+"MB",10);
//listDir( "/", 0);
float full = 1.0 * SD_MMC.usedBytes() / SD_MMC.totalBytes();;
if (full < 0.8) {
// Serial.printf("Nothing deleted, %.1f%% disk full\n", 100.0 * full);
write_log(log_path,"Nothing deleted, "+String(100.0 * full)+"% disk full",10);
} else {
// Serial.printf("Disk is %.1f%% full ... deleting oldest file\n", 100.0 * full);
write_log(log_path,"Disk is "+String(100.0 * full)+"% full ... deleting oldest file",10);
while (full > 0.8) {
double del_number = 999999999;
char del_numbername[50];
File f = SD_MMC.open("/");
File file = f.openNextFile();
while (file) {
//Serial.println(file.name());
if (!file.isDirectory()) {
char foldname[50];
strcpy(foldname, file.name());
for ( int x = 0; x < 50; x++) {
if ( (foldname[x] >= 0x30 && foldname[x] <= 0x39) || foldname[x] == 0x2E) {
} else {
if (foldname[x] != 0) foldname[x] = 0x20;
}
}
double i = atof(foldname);
if ( i > 0 && i < del_number) {
strcpy (del_numbername, file.name());
del_number = i;
}
//Serial.printf("Name is %s, number is %f\n", foldname, i);
}
file = f.openNextFile();
}
// Serial.printf("lowest is Name is %s, number is %f\n", del_numbername, del_number);
write_log(log_path,"lowest is Name is "+String(del_numbername)+", number is "+String(del_number),10);
if (del_number < 999999999) {
deleteFolderOrFile(del_numbername);
}
full = 1.0 * SD_MMC.usedBytes() / SD_MMC.totalBytes();
// Serial.printf("Disk is %.1f%% full ... \n", 100.0 * full);
write_log(log_path,"Disk is "+String(100.0 * full)+"% full ... ",10);
f.close();
}
}
}
void sdcard::deleteFolderOrFile(const char * val) {
write_log(log_path,"Deleting : "+String(val),10);
File f = SD_MMC.open(val);
if (!f) {
write_log(log_path,"Failed to open "+String(val),10);
return;
}
if (f.isDirectory()) {
File file = f.openNextFile();
while (file) {
if (file.isDirectory()) {
write_log(log_path," DIR : ",10);
write_log(log_path,file.name(),10);
} else {
write_log(log_path," FILE: ",10);
write_log(log_path,file.name(),10);
write_log(log_path," SIZE: ",10);
write_log(log_path,String(file.size()),10);
if (SD_MMC.remove(file.name())) {
write_log(log_path," deleted.",10);
} else {
write_log(log_path," FAILED.",10);
}
}
file = f.openNextFile();
}
f.close();
if (SD_MMC.rmdir(val)) {
write_log(log_path,"Dir "+String(val)+" removed",10);
} else {
write_log(log_path,"Remove dir failed",10);
}
} else {
//Remove the file
if (SD_MMC.remove(val)) {
write_log(log_path,"File "+String(val)+" deleted",10);
} else {
write_log(log_path,"Delete failed",10);
}
}
}
void sdcard:: testwriet()
{
File file;
file = SD_MMC.open("/gps/try.txt", "wb");
file.println("hello world");
file.flush();
file.close();
}
void sdcard::WriteStringToFile(String name,String Str)
{
File file;
file = SD_MMC.open(name, "w+");
file.println(Str);
file.flush();
file.close();
}
void sdcard::WriteStringToFile(String name,char *data,size_t lenth)
{
File file;
file = SD_MMC.open(name, "wb");
file.write((const byte *)data,lenth);
file.flush();
file.close();
}
bool sdcard::Mkdir(String path)
{
return SD_MMC.mkdir(path);
}
namespace sdcard
{
void openFileformWirte(String Path)
{
if (Comenfile.available())
{
Comenfile.close();
/* code */
}
Comenfile = SD_MMC.open(Path, "w+");
}
void WritetoFileCommen(String Str)
{
if (Comenfile.available())
{
Comenfile.print(Str);
Comenfile.flush();
/* code */
}
}
void WritetoFileCommen(char *data,size_t lenth)
{
if (Comenfile.available())
{
Comenfile.write((const byte *)data,lenth);
Comenfile.flush();
/* code */
}
}
void closeCommenFile()
{
if (Comenfile.available())
{
Comenfile.close();
/* code */
}
}
}

31
src/SDmanger.h Normal file
View File

@ -0,0 +1,31 @@
#ifndef SDMANGER_H
#define SDMANGER_H
#include "driver/sdmmc_host.h"
#include "driver/sdmmc_defs.h"
#include "sdmmc_cmd.h"
#include "esp_vfs_fat.h"
#include "FS.h"
#include <SD_MMC.h>
#include "Vector.h"
#include "log.h"
#include "Arduino.h"
#include "string.h"
namespace sdcard{
int init_sdcard();
void mylistDir( const char * dirname, uint8_t levels);
bool ListDir(const char * dirname,Vector <String> &stringlist);
void delete_old_stuff();
void deleteFolderOrFile(const char * val) ;
void testwriet();
void WriteStringToFile(String name,String Str);
void WriteStringToFile(String name,char *data,size_t lenth);
bool Mkdir(String path);
void openFileformWirte(String Path);
void WritetoFileCommen(String Str);
void WritetoFileCommen(char *data,size_t lenth);
void closeCommenFile();
}
#endif

777
src/SensorIS11.cpp Normal file
View File

@ -0,0 +1,777 @@
#include<SensorIS11.h>
#include"servo.h"
Ds1302 ds1302_date(0, 8, 7);
Ds1302::DateTime sys_time;
STRSensorInfo SensorIS11::initSensor()
{
// IS1Sensor.SetPortName(id);
pinMode(5,OUTPUT);
pinMode(6,OUTPUT);
radiance_struct_up.shutter = 1;
radiance_struct_down.shutter = 1;
for (uint32_t i = 0; i < 2048; i++)
{
radiance_struct_up.gain[i] = 1;
radiance_struct_down.gain[i] = 1;
radiance_struct_up.offset[i] = 0;
radiance_struct_down.offset[i] = 0;
}
SensorInfo.BandNum = 2048;
return SensorInfo=GetSensorInfo();
// return SensorInfo;
// return true;
}
STRSensorInfo SensorIS11::GetSensorInfo()
{
// Serial.println("init ok");
// write_log(log_path,"init isSensorInit",10);
STRSensorInfo setem;
if (!isSensorInit())
{
// Serial.println("sensor is 123123");
// write_log(log_path,"sensor is 123123",10);
return setem;
}
// write_log(log_path,"init ok",10);
int retlenth= SendGetSensorInfo((u_char *)GET_SERIAL_NUMBER,sizeof(GET_SERIAL_NUMBER));
vTaskDelay(100);
// write_log(log_path,String(retlenth),10);
char * result=new char[retlenth];
memcpy(result,DataRetrun+3,retlenth);
//result[4]='\0';
// std::string str11(result);
// setem.serialnumber = str11;
setem.serialnumber = String(result);
delete[] result;
// Serial.println(String(setem.serialnumber.c_str()));
// write_log(log_path,"serialnumber :"+String(setem.serialnumber.c_str()),10);
// write_log(log_path,"serialnumber :"+setem.serialnumber,10);
retlenth= SendGetSensorInfo((u_char *)GET_PRODUCT_NAME,sizeof(GET_PRODUCT_NAME));
vTaskDelay(100);
result=new char[retlenth];
memcpy(result,DataRetrun+3,retlenth);
// vTaskDelay(500);
// result[4]='\0';
// std::string str1(result);
// write_log(log_path,"productname :"+String(setem.SensorName.c_str()),10);
setem.SensorName = String(result);
// write_log(log_path,"productname :"+setem.SensorName,10);
delete result;
setem.BandNum=2048;
// Serial.println(String(setem.SensorName.c_str())+"_"+String(setem.serialnumber.c_str()));
// write_log(log_path,String(setem.SensorName.c_str())+"_"+String(setem.serialnumber.c_str()),10);
setem.maxValue=65535;
setem.wavelenthlist = new float[setem.BandNum]();
retlenth= SendGetSensorInfo((u_char *)GET_WAVELENTH_COEFF,sizeof(GET_WAVELENTH_COEFF));
vTaskDelay(100);
float a[4];
memcpy(a,DataRetrun+3,16);
// write_log(log_path,"CoverLittleAndBig",10);
CoverLittleAndBig((char *)a,4*sizeof(float));
int bandsss= setem.BandNum;
#ifdef ARDUINO
// Serial.print("a0:");
// Serial.print(a[0]);
// Serial.print(" a1:");
// Serial.print(a[1]);
// Serial.print(" a2:");
// Serial.print(a[2]);
// Serial.print(" a3:");
// Serial.println(a[3]);
// write_log(log_path,"ARDUINO",10);
// write_log(log_path,"a0:"+String(a[0])+" a1:"+String(a[1])+" a2:"+String(a[2])+" a3:"+String(a[3]),10);
#endif
setem.a1=a[0];
setem.a2=a[1];
setem.a3=a[2];
setem.a4=a[3];
for ( int i = 1; i <=bandsss ; i++)
{
setem.wavelenthlist[i-1] = a[0] * i*i*i + a[1] * i*i + a[2] * i + a[3];
setem.WavelenthStr=setem.WavelenthStr+String( setem.wavelenthlist[i-1]).c_str()+",";
}
// vTaskDelay(500);
// Serial.write(dataretrun,retlenth);
// memcpy(a,dataretrun+)
u_char temp[2]={0x00,0x01};
retlenth=SendSettingCommand((u_char*)SET_AVERAGE_NUMBER,sizeof(SET_AVERAGE_NUMBER),temp,sizeof(temp));
// Serial.println("init ok");
return setem;
}
//shutter1 1关 2开
void SensorIS11::SetShutter(int id)
{
switch (id) {
case 1:{ //关
digitalWrite(5,LOW);
vTaskDelay(200);
break;
}
case 2:{ //开
digitalWrite(5,HIGH);
vTaskDelay(200);
break;
}
}
}
//0下 1上
void SensorIS11::servo_direction(int direction)
{
switch (direction)
{
case 0:{
servo_set_angle(0);
vTaskDelay(1500);
break;
}
case 1:{
servo_set_angle(195);
vTaskDelay(1500);
break;
}
}
}
///这获取到的是4096的那个数组
void SensorIS11::GetOneDate(int msc)
{
if (msc!=shutternow)
{
u_char shutter[2];
shutter[0]=msc/256;
shutter[1]=msc%256;
SendSettingCommand((u_char *) SET_INTEGRAL_TIME,sizeof(SET_INTEGRAL_TIME),shutter,sizeof(shutter));
}
shutternow=msc;
size_t retsize= SendGetData(shutternow);
//DATABUFF 4096 需要输出的数据
memcpy(DATABUFF,DataRetrun+4,4096);
shortLittletoBiG(DATABUFF, SensorInfo.BandNum*2);
}
//获取SHUTTER时间返回的是最大值
int SensorIS11::OptSnenser(int persent)
{
long maxtime = 20000;
int maxvalue=SensorInfo.maxValue*1.0*persent / 100;
int maxvaluenow = 0;
static float shutternow = 10;
GetOneDate(shutternow);
maxvaluenow= Getmaxvalue(DATABUFF, SensorInfo.BandNum);
// Serial.print("now Shutter is :");
// Serial.print(shutternow);
// Serial.print(" maxvalue is :");
// Serial.println(maxvaluenow);
// write_log(log_path,"now Shutter is :"+String(shutternow)+" maxvalue is :"+String(maxvaluenow),10);
int numberoftry = 0;
while (maxvaluenow<maxvalue*0.95 || maxvaluenow>maxvalue) {
if (maxvaluenow > maxvalue)
{
shutternow = shutternow *0.7;
}
else
{
shutternow = maxvalue * 0.98 / (maxvaluenow * 1.0)*shutternow + 1;
}
if (shutternow > maxtime)
{
shutternow = maxtime;
break;
}
GetOneDate(shutternow);
maxvaluenow= Getmaxvalue(DATABUFF, SensorInfo.BandNum);
#ifdef ARDUINO
// Serial.print("now Shutter is :");
// Serial.print(shutternow);
// Serial.print(" maxvalue is :");
// Serial.println(maxvaluenow);
write_log(log_path,"now Shutter is :"+String(shutternow)+" maxvalue is :"+String(maxvaluenow),10);
#endif
numberoftry++;
if (numberoftry > 200)
{
return maxtime;
}
if (shutternow == maxtime)
{
return maxtime;
}
}
#ifdef ARDUINO
// Serial.print("zi dong value:");
// Serial.println(shutternow);
write_log(log_path,"zi dong value:"+String(shutternow),10);
#endif
if (shutternow<0)
{
shutternow=maxtime;
/* code */
}
write_log(log_path,"Finish OptSnenser",10);
return shutternow;
}
void SensorIS11::shortLittletoBiG(unsigned short *data,int lenth)
{
CoverLittleAndBig((char *)data,lenth);
}
int SensorIS11::Getmaxvalue(unsigned short *data,int lenth)
{
int ret=-1;
for (int i = 0; i < lenth; ++i) {
if (data[i]>ret){
ret=data[i];
}
}
return ret;
}
struct IS11_datastruct IS11_datastruct_up;
struct IS11_datastruct IS11_datastruct_down;
struct IS11_datastruct IS11_datastruct_dark_up;
struct IS11_datastruct IS11_datastruct_dark_down;
void SensorIS11::TakeOneJob(bool dingbing=false)
{
ds1302_date.getDateTime(&sys_time);
// String path = "/guangpu_data/"+ String(sys_time.year) + "/" + String(sys_time.month) + "/" + String(sys_time.day)+ "/"+ String(sys_time.hour) + "-" + String(sys_time.minute) + "-" + String(sys_time.second) + ".bin";
work_progress = 0 ;
float temp[8];
getall_temp(temp);
//opt_up opt_down dark_up dn_up dn_down dark_down
//1 opt_up
servo_direction(1);
SetShutter(2);
shutterup=OptSnenser(90);
SetShutter(1);
work_progress = 15;
//2 opt_down
servo_direction(0);
SetShutter(2);
shutterdown=OptSnenser(90);
SetShutter(1);
work_progress = 30;
//3 dark_up
SetShutter(1);
GetOneDate(shutterup);
for (int i = 0; i < SensorInfo.BandNum;i++)
{
IS11_datastruct_dark_up.data[i] = DATABUFF[i];
}
IS11_datastruct_dark_up.type = 0;
IS11_datastruct_dark_up.direction = 2;
IS11_datastruct_dark_up.tuigan_stat = get_tuigan_status();
IS11_datastruct_dark_up.year = sys_time.year;
IS11_datastruct_dark_up.month = sys_time.month;
IS11_datastruct_dark_up.day = sys_time.day;
IS11_datastruct_dark_up.hour = sys_time.hour;
IS11_datastruct_dark_up.minute = sys_time.minute;
IS11_datastruct_dark_up.second = sys_time.second;
IS11_datastruct_dark_up.shutter_time = shutterup;
IS11_datastruct_dark_up.index = index;
memcpy(IS11_datastruct_dark_up.temprature,temp,8*sizeof(float));
work_progress = 45;
//4 dn_up
servo_direction(1);
SetShutter(2);
GetOneDate(shutterup);
SetShutter(1);
SensorInfo.BandNum = 2048;
for (int i = 0; i < SensorInfo.BandNum;i++)
{
IS11_datastruct_up.data[i] = DATABUFF[i];
}
IS11_datastruct_up.type = 0;
IS11_datastruct_up.direction = 0;
IS11_datastruct_up.tuigan_stat = get_tuigan_status();
IS11_datastruct_up.year = sys_time.year;
IS11_datastruct_up.month = sys_time.month;
IS11_datastruct_up.day = sys_time.day;
IS11_datastruct_up.hour = sys_time.hour;
IS11_datastruct_up.minute = sys_time.minute;
IS11_datastruct_up.second = sys_time.second;
IS11_datastruct_up.shutter_time = shutterup;
IS11_datastruct_up.index = index;
memcpy(IS11_datastruct_up.temprature,temp,8*sizeof(float));
work_progress = 60;
//5 dn_down
servo_direction(0);
SetShutter(2);
GetOneDate(shutterdown);
SetShutter(1);
for (int i = 0; i < SensorInfo.BandNum;i++) {
IS11_datastruct_down.data[i] = DATABUFF[i];
}
IS11_datastruct_down.type = 0;
IS11_datastruct_down.direction = 1;
IS11_datastruct_down.tuigan_stat = get_tuigan_status();
IS11_datastruct_down.year = sys_time.year;
IS11_datastruct_down.month = sys_time.month;
IS11_datastruct_down.day = sys_time.day;
IS11_datastruct_down.hour = sys_time.hour;
IS11_datastruct_down.minute = sys_time.minute;
IS11_datastruct_down.second = sys_time.second;
IS11_datastruct_down.shutter_time = shutterdown;
IS11_datastruct_down.index = index;
memcpy(IS11_datastruct_down.temprature,temp,8*sizeof(float));
work_progress = 75;
//6 dark_down
SetShutter(1);
GetOneDate(shutterdown);
for (int i = 0; i < SensorInfo.BandNum;i++)
{
IS11_datastruct_dark_down.data[i] = DATABUFF[i];
}
IS11_datastruct_dark_down.type = 0;
IS11_datastruct_dark_down.direction = 3;
IS11_datastruct_dark_down.tuigan_stat = get_tuigan_status();
IS11_datastruct_dark_down.year = sys_time.year;
IS11_datastruct_dark_down.month = sys_time.month;
IS11_datastruct_dark_down.day = sys_time.day;
IS11_datastruct_dark_down.hour = sys_time.hour;
IS11_datastruct_dark_down.minute = sys_time.minute;
IS11_datastruct_dark_down.second = sys_time.second;
IS11_datastruct_dark_down.shutter_time = shutterdown;
IS11_datastruct_dark_down.index = index;
memcpy(IS11_datastruct_dark_down.temprature,temp,8*sizeof(float));
work_progress = 90;
//save data to file
if(!SD_MMC.exists("/guangpu_data/"+ String(sys_time.year)))
{
sdcard::Mkdir("/guangpu_data/"+ String(sys_time.year));
}
if(!SD_MMC.exists("/guangpu_data/"+ String(sys_time.year) + "/" + String(sys_time.month)))
{
sdcard::Mkdir("/guangpu_data/"+ String(sys_time.year) + "/" + String(sys_time.month));
}
if(!SD_MMC.exists("/guangpu_data/"+ String(sys_time.year) + "/" + String(sys_time.month) + "/" + String(sys_time.day)))
{
sdcard::Mkdir("/guangpu_data/"+ String(sys_time.year) + "/" + String(sys_time.month) + "/" + String(sys_time.day));
}
String path1 = "/guangpu_data/"+ String(sys_time.year) + "/" + String(sys_time.month) + "/" + String(sys_time.day)+ "/"+ String(sys_time.hour) + "-" + String(sys_time.minute) + "-" + String(sys_time.second);
sdcard::Mkdir(path1);
String path2 = path1 + "/up.bin";
File file;
file = SD_MMC.open(path2,"wb");
file.write((uint8_t *)(&IS11_datastruct_up),sizeof(IS11_datastruct));
file.flush();
file.close();
work_progress = 92;
path2 = path1 + "/dark_up.bin";
file = SD_MMC.open(path2,"wb");
file.write((uint8_t *)(&IS11_datastruct_dark_up),sizeof(IS11_datastruct));
file.flush();
file.close();
work_progress = 94;
path2 = path1 + "/down.bin";
file = SD_MMC.open(path2,"wb");
file.write((uint8_t *)(&IS11_datastruct_down),sizeof(IS11_datastruct));
file.flush();
file.close();
work_progress = 96;
path2 = path1 + "/dark_down.bin";
file = SD_MMC.open(path2,"wb");
file.write((uint8_t *)(&IS11_datastruct_dark_down),sizeof(IS11_datastruct));
file.flush();
file.close();
index++;
work_progress = 100 ;
}
SensorIS11::SensorIS11()
{
shutternow = 0;
DataRetrun = GetDataBufferPTR();
}
///////////////////////////////////////////////////////////
void SensorIS11::send_dn(HardwareSerial *wb485Serial,IS11_datastruct *IS11_datastructure)
{
int32_t send_lenth;
u_char *send_buff = new u_char[sizeof(IS11_datastruct) + 7];
send_lenth = IRIS_Protocol_Pack(0x02,(uint16_t)sizeof(IS11_datastruct), (uint8_t *)IS11_datastructure,send_buff);
wb485Serial->write(send_buff,send_lenth);
delete send_buff;
vTaskDelay(50);
}
void SensorIS11::send_radiance(HardwareSerial *wb485Serial,IS11_datastruct *IS11_datastructure)
{
struct IS11_datastruct IS11_datastruct_send = *IS11_datastructure;
int32_t send_lenth;
u_char *send_buff = new u_char[sizeof(IS11_datastruct) + 7];
IS11_datastruct_send.type = 0x01;
if(IS11_datastructure == &IS11_datastruct_up)
{
for (int i = 0; i < 2048;i++)
{
IS11_datastruct_send.data[i] = IS11_datastruct_send.data[i] / IS11_datastruct_send.shutter_time * radiance_struct_up.shutter * radiance_struct_up.gain[i] - radiance_struct_up.offset[i];
}
}
else if(IS11_datastructure == &IS11_datastruct_down)
{
for (int i = 0; i < 2048;i++)
{
IS11_datastruct_send.data[i] = IS11_datastruct_send.data[i] / IS11_datastruct_send.shutter_time * radiance_struct_down.shutter * radiance_struct_down.gain[i] - radiance_struct_down.offset[i];
}
}
send_lenth = IRIS_Protocol_Pack(0x02,(uint16_t)sizeof(IS11_datastruct), (uint8_t *)(&IS11_datastruct_send),send_buff);
wb485Serial->write(send_buff,send_lenth);
delete send_buff;
vTaskDelay(50);
}
//send_data_type 0x00 DN类型 只回传up、down、up_darknoise、down_darknoise
//send_data_type 0x01 DN类型 只回传up、down
//send_data_type 0x02 DN类型 只回传up
//send_data_type 0x03 DN类型 只回传down
//send_data_type 0x04 DN类型 只回传up_darknosie
//send_data_type 0x05 DN类型 只回传down_darknoise
//send_data_type 0x06 DN类型 只回传dark 这个dark主要是在高级模式下才有高级模式下dark不用区分方向
//send_data_type 0x10 radiance类型 只回传up、down和DN类型的 up_darknoise、down_darknoise
//send_data_type 0x11 radiance类型 只回传up、down
//send_data_type 0x12 radiance类型 只回传up
//send_data_type 0x13 radiance类型 只回传down
void SensorIS11::senddata(HardwareSerial *wb485Serial,u_int32_t send_data_type)
{
switch (send_data_type)
{
case 0X00:
send_dn(wb485Serial,&IS11_datastruct_up);
send_dn(wb485Serial,&IS11_datastruct_down);
send_dn(wb485Serial,&IS11_datastruct_dark_up);
send_dn(wb485Serial,&IS11_datastruct_dark_down);
break;
case 0X01:
send_dn(wb485Serial,&IS11_datastruct_up);
send_dn(wb485Serial,&IS11_datastruct_down);
break;
case 0X02:
send_dn(wb485Serial,&IS11_datastruct_up);
break;
case 0X03:
send_dn(wb485Serial,&IS11_datastruct_down);
break;
case 0X04:
send_dn(wb485Serial,&IS11_datastruct_dark_up);
break;
case 0X05:
send_dn(wb485Serial,&IS11_datastruct_dark_down);
break;
case 0X10:
send_radiance(wb485Serial,&IS11_datastruct_up);
send_radiance(wb485Serial,&IS11_datastruct_down);
send_dn(wb485Serial,&IS11_datastruct_dark_up);
send_dn(wb485Serial,&IS11_datastruct_dark_down);
break;
case 0X11:
send_radiance(wb485Serial,&IS11_datastruct_up);
send_radiance(wb485Serial,&IS11_datastruct_down);
break;
case 0X12:
send_radiance(wb485Serial,&IS11_datastruct_up);
break;
case 0X13:
send_radiance(wb485Serial,&IS11_datastruct_down);
break;
default:
break;
}
}
/*
////////////////////////////////////////////////////////////////////////////////////////////////////////////
高级模式
支持选择采集的方向up、down、dark
是否自动扣除暗电流
不支持自动曝光,
平均次数
direction 0:up 1:down 2:dark
shutter_time 使用指定时间曝光 单位毫秒 最大时长30秒 必须大于0
remove_dark 0:不扣除 1:扣除
collect_times 采集次数
////////////////////////////////////////////////////////////////////////////////////////////////////////////
*/
void SensorIS11::advanced_mode(u_int32_t direction,u_int32_t shutter_time,u_int32_t collect_times,u_int32_t remove_dark)
{
work_progress = 0;
struct IS11_datastruct *IS11_datastructure_avn = nullptr;
switch (direction)
{
case 0:
servo_direction(1);
SetShutter(2);
IS11_datastructure_avn = &IS11_datastruct_up;
break;
case 1:
servo_direction(0);
SetShutter(2);
IS11_datastructure_avn = &IS11_datastruct_down;
break;
case 2:
SetShutter(1);
IS11_datastructure_avn = &IS11_datastruct_dark_up;
break;
default:
break;
}
int aa = collect_times;
uint32_t caiji_times = 0;
memset(IS11_datastructure_avn->data,0,8192);
getall_temp(IS11_datastructure_avn->temprature);
ds1302_date.getDateTime(&sys_time);
IS11_datastructure_avn->year = sys_time.year;
IS11_datastructure_avn->month = sys_time.month;
IS11_datastructure_avn->day = sys_time.day;
IS11_datastructure_avn->hour = sys_time.hour;
IS11_datastructure_avn->minute = sys_time.minute;
IS11_datastructure_avn->second = sys_time.second;
while(aa > 0)
{
work_progress = (caiji_times * 100) / (collect_times * 2) ;
GetOneDate(shutter_time);
for (int i = 0; i < SensorInfo.BandNum;i++)
{
IS11_datastructure_avn->data[i] += DATABUFF[i];
}
IS11_datastructure_avn->type = 0;
IS11_datastructure_avn->direction = direction;
IS11_datastructure_avn->tuigan_stat = get_tuigan_status();
IS11_datastructure_avn->shutter_time = shutter_time;
IS11_datastructure_avn->index = index;
if(remove_dark == 1 && direction != 2)
{
// write_log(log_path,"remove_dark",10);
SetShutter(1);
GetOneDate(shutter_time);
SetShutter(2);
for (int i = 0; i < SensorInfo.BandNum;i++)
{
// if (i==1000)
// {
// write_log(log_path,"or data:"+String(IS11_datastructure_avn->data[i])+ " darkdata:"+String(DATABUFF[i]),10);
// /* code */
// }
IS11_datastructure_avn->data[i] -= DATABUFF[i];
IS11_datastruct_dark_up.data[i] = DATABUFF[i];
}
IS11_datastruct_dark_up.type = 0;
IS11_datastruct_dark_up.direction = 2;
IS11_datastruct_dark_up.tuigan_stat = get_tuigan_status();
IS11_datastruct_dark_up.shutter_time = shutter_time;
IS11_datastruct_dark_up.index = index;
// getall_temp(IS11_datastruct_dark_up.temprature);
}
aa--;
caiji_times++;
}
for (int i = 0; i < SensorInfo.BandNum;i++)
{
IS11_datastructure_avn->data[i] = IS11_datastructure_avn->data[i] / collect_times;
}
SetShutter(1);
work_progress = 100;
}
/*
////////////////////////////////////////////////////////////////////////////////////////////////////////////
opt
方向有up、down、dark
////////////////////////////////////////////////////////////////////////////////////////////////////////////
*/
void SensorIS11::opt(u_int32_t direction)
{
switch (direction)
{
case 0:
// servo_direction(1);
SetShutter(2);
break;
case 1:
// servo_direction(0);
SetShutter(2);
break;
case 2:
SetShutter(1);
break;
default:
break;
}
work_progress = 50;
dingbiao_shutter = OptSnenser(90);
work_progress = 100;
SetShutter(1);
}
//////////////////////////////////////////////////////////////////////////////////////////////
void SensorIS11::save_dingbiao(uint8_t * data)
{
IS11_datastruct *IS11_datastructure = (IS11_datastruct *)data;
float ab = 0;
write_log(log_path,"save_dingbiao",10);
write_log(log_path,"direction:"+String(IS11_datastructure->direction),10);
write_log(log_path,"type:"+String(IS11_datastructure->type),10);
if(IS11_datastructure->direction == 0)
{
if (IS11_datastructure->type == 4)
{
radiance_struct_up.shutter = IS11_datastructure->shutter_time;
write_log(log_path,"shutter_time:"+String(IS11_datastructure->shutter_time),10);
for (int i = 0; i < BANDNUMBER;i++)
{
radiance_struct_up.gain[i] = IS11_datastructure->data[i];
}
ab = IS11_datastructure->data[0] * 1000000;
write_log(log_path,"gain:"+String(ab),10);
}
else if (IS11_datastructure->type == 5)
{
for (int i = 0; i < BANDNUMBER;i++)
{
radiance_struct_up.offset[i] = IS11_datastructure->data[i];
}
write_log(log_path,"offset:"+String(IS11_datastructure->data[0]),10);
}
else
{
return;
}
}
else if(IS11_datastructure->direction == 1)
{
if (IS11_datastructure->type == 4)
{
radiance_struct_down.shutter = IS11_datastructure->shutter_time;
write_log(log_path,"shutter_time:"+String(IS11_datastructure->shutter_time),10);
for (int i = 0; i < BANDNUMBER;i++)
{
radiance_struct_down.gain[i] = IS11_datastructure->data[i];
}
ab = IS11_datastructure->data[0] * 1000000;
write_log(log_path,"gain:"+String(ab),10);
}
else if (IS11_datastructure->type == 5)
{
for (int i = 0; i < BANDNUMBER;i++)
{
radiance_struct_down.offset[i] = IS11_datastructure->data[i];
}
write_log(log_path,"offset:"+String(IS11_datastructure->data[0]),10);
}
else
{
return;
}
}
else
{
return;
}
}
//////////////////////////////////////////////////////////////////////////////////////////////
/*
////////////////////////////
波长 序列号x 能量值
=a1*x^3+a2*x^2+a3*x+a4 0 1111
DC
暗电流测量的目的 设备本身的干扰 主要受到温度的影响
测试不同的波长对应的能量
DN
通过光栅将光分解为不同的波长 然后照射到CCD上
CCD的将不同波长的能量采集出来转换为DN值
opt 最佳曝光的时长
采集到的能量和曝光时间有关
CCD采集能量的最好范围是 70%到90%之间是线性的 可信度最高 准确率最好
*/
/*
Radiance = DN / shuttertime * shutter * a -b;
*/

71
src/SensorIS11.h Normal file
View File

@ -0,0 +1,71 @@
#ifndef SENSORIS11_H
#define SENSORIS11_H
#include <Arduino.h>
#include "comon.h"
#include "IS11Comon.h"
#include "log.h"
#include "Communication_Protocol.h"
#include "tuigan.h"
#include "servo.h"
#include "DS18B20.h"
#include "SoftwareSerial.h"
#include "SDmanger.h"
#include "ds1302.h"
class SensorIS11 {
public:
SensorIS11();
STRSensorInfo SensorInfo;
STRSensorInfo initSensor();
STRSensorInfo GetSensorInfo();
void SetShutter(int id);// 0 dark 1 green 2 blue
void GetOneDate(int msc);
int OptSnenser(int percent);
unsigned short DATABUFF[2048];
int shutterup,shutterdown;
unsigned short *DownData=nullptr;
unsigned short *UpData=nullptr;
void shortLittletoBiG( unsigned short *data,int lenth);
int Getmaxvalue(unsigned short *data,int lenth);
// void TakeOneJob();
void TakeOneJob(bool dingbing);
void servo_direction(int direction);
void send_dn(HardwareSerial *wb485Serial,IS11_datastruct *IS11_datastructure);
void send_radiance(HardwareSerial *wb485Serial,IS11_datastruct *IS11_datastructure);
void senddata(HardwareSerial *wb485Serial,u_int32_t send_data_type);
void save_dingbiao(uint8_t * data);
void save_guangpu_data(IS11_datastruct * data);
// int dingbiao(u_int32_t step,u_int32_t shutter_timer);
void advanced_mode(u_int32_t direction,u_int32_t shutter_time,u_int32_t collect_times,u_int32_t remove_dark);
void opt(u_int32_t direction);
PRINTFUNC PrintFunc;
// Ds1302 ds1302;
int shutternow;
u_int32_t index;
volatile u_int32_t work_progress;
volatile u_int32_t dingbiao_shutter;
//uint16_t result[2048];
clalidata_struct radiance_struct_up;
clalidata_struct radiance_struct_down;
u_char *DataRetrun;
};
#endif

206
src/TCPserver.cpp Normal file
View File

@ -0,0 +1,206 @@
#include "TCPserver.h"
bool fenge(String &zifuchuan, String &outstring, String fengefu)
{
int weizhi = 0; //找查的位置
if (zifuchuan == "")
{
// Serial.print("commanesdafasdf");
return false;
/* code */
}
weizhi = zifuchuan.indexOf(fengefu); //找到位置
if (weizhi != -1) //如果位置不为空
{
// Serial.println(zifuchuan);
outstring = zifuchuan.substring(0, weizhi); //打印取第一个字符
zifuchuan = zifuchuan.substring(weizhi + fengefu.length(), zifuchuan.length());
return true;
//分隔后只取后面一段内容 以方便后面找查
}
else
{
// Serial.print(zifuchuan);
outstring = zifuchuan;
zifuchuan = "";
return true;
}
}
TCPserver::TCPserver(int port)
{
server = new WiFiServer(port);
myserial = nullptr;
isPortOutInit = false;
}
#if ARDUINO_USB_CDC_ON_BOOT && !ARDUINO_USB_MODE
TCPserver::TCPserver(USBCDC *serial,int port)
{
server = new WiFiServer(port);
myserial = serial;
isPortOutInit = true;
}
#elif ARDUINO_USB_CDC_ON_BOOT && ARDUINO_USB_MODE
TCPserver::TCPserver(HWCDC *serial,int port)
{
server = new WiFiServer(port);
myserial = serial;
isPortOutInit = true;
}
#else
TCPserver::TCPserver(HardwareSerial *serial, int port /* args */)
{
server = new WiFiServer(port);
myserial = serial;
isPortOutInit = true;
}
#endif
void TCPserver::initme()
{
server->begin();
//关闭小包合并包功能,不会延时发送数据
server->setNoDelay(true);
}
void TCPserver::loop()
{
uint8_t i;
//检测是否有新的client请求进来
// myserial->print("asdffsd");
if (server->hasClient())
{
for (i = 0; i < MAX_SRV_CLIENTS; i++)
{
//释放旧无效或者断开的client
if (!serverClients[i] || !serverClients[i].connected())
{
if (serverClients[i])
{
serverClients[i].stop();
}
//分配最新的client
serverClients[i] = server->available();
if (isPortOutInit)
{
myserial->print("New client: ");
myserial->print(i);
/* code */
}
break;
}
}
//当达到最大连接数 无法释放无效的client需要拒绝连接
if (i == MAX_SRV_CLIENTS)
{
WiFiClient serverClient = server->available();
serverClient.stop();
if (isPortOutInit)
{
myserial->print("Connection rejected ");
}
}
}
//检测client发过来的数据
for (i = 0; i < MAX_SRV_CLIENTS; i++)
{
if (serverClients[i] && serverClients[i].connected())
{
if (serverClients[i].available())
{
// get data from the telnet client and push it to the UART
String str = "";
while (serverClients[i].available())
{
//发送到串口调试器
if (isPortOutInit)
{
str = str + String((char)serverClients[i].read());
// myserial->write(serverClients[i].read());
/* code */
}
}
}
}
}
if (isPortOutInit)
{
if (myserial->available())
{
//把串口调试器发过来的数据 发送给client
size_t len = myserial->available();
uint8_t sbuf[len];
myserial->readBytes(sbuf, len);
// push UART data to all connected telnet clients
for (i = 0; i < MAX_SRV_CLIENTS; i++)
{
if (serverClients[i] && serverClients[i].connected())
{
serverClients[i].write(sbuf, len);
vTaskDelay(1);
}
}
}
}
}
void TCPserver::SendDataToClinet(String str, int clinetid)
{
// myserial->print("Connection rejected ");
if (clinetid == -1)
{
int i;
for (i = 0; i < MAX_SRV_CLIENTS; i++)
{
if (serverClients[i] && serverClients[i].connected())
{
serverClients[i].println(str);
vTaskDelay(1);
}
}
/* code */
}
else
{
if (serverClients[clinetid] && serverClients[clinetid].connected())
{
serverClients[clinetid].println(str);
vTaskDelay(1);
}
}
}
void TCPserver::SendDataToClinet(char *str, int clinetid)
{
// push UART data to all connected telnet clients
myserial->print("Connection rejected ");
if (clinetid == -1)
{
int i;
for (i = 0; i < MAX_SRV_CLIENTS; i++)
{
if (serverClients[i] && serverClients[i].connected())
{
serverClients[i].write(str);
vTaskDelay(1);
}
}
/* code */
}
else
{
if (serverClients[clinetid] && serverClients[clinetid].connected())
{
serverClients[clinetid].write(str);
vTaskDelay(1);
}
}
}
TCPserver::~TCPserver()
{
delete server;
}

49
src/TCPserver.h Normal file
View File

@ -0,0 +1,49 @@
#ifndef TCPSERVER_H
#define TCPSERVER_H
#include<HardwareSerial.h>
#ifdef ESP8266
#include <ESP8266WiFi.h>
#else
#include<WiFi.h>
#endif
#define MAX_SRV_CLIENTS 2
class TCPserver
{
private:
/* data */
//创建server 端口号是23
WiFiServer *server;
//管理clients
WiFiClient serverClients[MAX_SRV_CLIENTS];
bool isPortOutInit;
public:
#if ARDUINO_USB_CDC_ON_BOOT && !ARDUINO_USB_MODE //Serial used for USB CDC
USBCDC *myserial;
TCPserver(USBCDC *serial,int port);
#elif ARDUINO_USB_CDC_ON_BOOT && ARDUINO_USB_MODE
HWCDC *myserial;
TCPserver(HWCDC *serial,int port);
#else
HardwareSerial *myserial;
TCPserver(HardwareSerial *serial,int port);
#endif
TCPserver(int port);
void initme();
~TCPserver();
void SendDataToClinet(String str,int clinetid=-1);
void SendDataToClinet(char *str,int clinetid=-1);
void loop();
};
#endif

38
src/beep.cpp Normal file
View File

@ -0,0 +1,38 @@
#include "beep.h"
uint8_t chan;
uint8_t bit_num;
void beep_init(uint8_t beep_chan, uint32_t beep_freq, uint8_t beep_bit_num)
{
chan = beep_chan;
bit_num = beep_bit_num;
ledcSetup(chan, beep_freq , bit_num);
ledcAttachPin(BEEP_PIN, chan);
ledcWrite(chan, 0);
}
void beep_run( uint32_t freq,uint32_t duty)
{
ledcSetup(chan, freq , bit_num);
ledcWrite(chan, duty);
}
void beep_stop()
{
ledcWrite(chan, 0);
}
// beep_init(39,0,2000,10);
// while (1)
// {
// beep_run(2000,512);
// vTaskDelay(1000);
// beep_stop();
// vTaskDelay(1000);
// }
//开机成功长响3秒
//光谱仪故障一直滴滴声
//温度异常报警快速滴滴声
//其他功能异常慢速滴滴声

11
src/beep.h Normal file
View File

@ -0,0 +1,11 @@
#ifndef _BEEP_H_
#define _BEEP_H_
#include <Arduino.h>
#define BEEP_PIN 39
void beep_stop();
void beep_run( uint32_t freq,uint32_t duty);
void beep_init(uint8_t beep_chan, uint32_t beep_freq, uint8_t beep_bit_num);
#endif

34
src/comon.h Normal file
View File

@ -0,0 +1,34 @@
#include<Arduino.h>
// struct STRSensorInfo
// {
// std::string SensorName;
// long maxValue;
// long BandNum;
// std::string WavelenthStr;
// float *wavelenthlist;
// //double *wavelenth;
// bool isSensorInit;
// std::string serialnumber;
// float a1,a2,a3,a4;
// };
struct STRSensorInfo
{
String SensorName;
long maxValue;
long BandNum;
String WavelenthStr;
float *wavelenthlist;
//double *wavelenth;
bool isSensorInit;
String serialnumber;
float a1,a2,a3,a4;
};
typedef void (*PRINTFUNC)(std::string );

200
src/ds1302.cpp Normal file
View File

@ -0,0 +1,200 @@
/** Ds1302.cpp
*
* Ds1302 class.
*
* @version 1.0.3
* @author Rafa Couto <caligari@treboada.net>
* @license GNU Affero General Public License v3.0
* @see https://github.com/Treboada/Ds1302
*
*/
#include "ds1302.h"
#include <Arduino.h>
#define REG_SECONDS 0x80
#define REG_MINUTES 0x82
#define REG_HOUR 0x84
#define REG_DATE 0x86
#define REG_MONTH 0x88
#define REG_DAY 0x8A
#define REG_YEAR 0x8C
#define REG_WP 0x8E
#define REG_BURST 0xBE
Ds1302::Ds1302(uint8_t pin_ena, uint8_t pin_clk, uint8_t pin_dat)
{
_pin_ena = pin_ena;
_pin_clk = pin_clk;
_pin_dat = pin_dat;
_dat_direction = INPUT;
}
void Ds1302::init()
{
pinMode(_pin_ena, OUTPUT);
pinMode(_pin_clk, OUTPUT);
pinMode(_pin_dat, _dat_direction);
digitalWrite(_pin_ena, LOW);
digitalWrite(_pin_clk, LOW);
}
bool Ds1302::isHalted()
{
_prepareRead(REG_SECONDS);
uint8_t seconds = _readByte();
_end();
return (seconds & 0b10000000);
}
void Ds1302::getDateTime(DateTime* dt)
{
_prepareRead(REG_BURST);
dt->second = _bcd2dec(_readByte() & 0b01111111);
dt->minute = _bcd2dec(_readByte() & 0b01111111);
dt->hour = _bcd2dec(_readByte() & 0b00111111);
dt->day = _bcd2dec(_readByte() & 0b00111111);
dt->month = _bcd2dec(_readByte() & 0b00011111);
dt->dow = _bcd2dec(_readByte() & 0b00000111);
dt->year = _bcd2dec(_readByte() & 0b11111111);
_end();
}
void Ds1302::setDateTime(DateTime* dt)
{
_prepareWrite(REG_WP);
_writeByte(0b00000000);
_end();
_prepareWrite(REG_BURST);
_writeByte(_dec2bcd(dt->second % 60 ));
_writeByte(_dec2bcd(dt->minute % 60 ));
_writeByte(_dec2bcd(dt->hour % 24 ));
_writeByte(_dec2bcd(dt->day % 32 ));
_writeByte(_dec2bcd(dt->month % 13 ));
_writeByte(_dec2bcd(dt->dow % 8 ));
_writeByte(_dec2bcd(dt->year % 100));
_writeByte(0b10000000);
_end();
}
void Ds1302::halt()
{
_setHaltFlag(true);
}
void Ds1302::start()
{
_setHaltFlag(false);
}
void Ds1302::_setHaltFlag(bool stopped)
{
uint8_t regs[8];
_prepareRead(REG_BURST);
for (int b = 0; b < 8; b++) regs[b] = _readByte();
_end();
if (stopped) regs[0] |= 0b10000000; else regs[0] &= ~0b10000000;
regs[7] = 0b10000000;
_prepareWrite(REG_WP);
_writeByte(0b00000000);
_end();
_prepareWrite(REG_BURST);
for (int b = 0; b < 8; b++) _writeByte(regs[b]);
_end();
}
void Ds1302::_prepareRead(uint8_t address)
{
_setDirection(OUTPUT);
digitalWrite(_pin_ena, HIGH);
uint8_t command = 0b10000001 | address;
_writeByte(command);
_setDirection(INPUT);
}
void Ds1302::_prepareWrite(uint8_t address)
{
_setDirection(OUTPUT);
digitalWrite(_pin_ena, HIGH);
uint8_t command = 0b10000000 | address;
_writeByte(command);
}
void Ds1302::_end()
{
digitalWrite(_pin_ena, LOW);
}
uint8_t Ds1302::_readByte()
{
uint8_t byte = 0;
for(uint8_t b = 0; b < 8; b++)
{
if (digitalRead(_pin_dat) == HIGH) byte |= 0x01 << b;
_nextBit();
}
return byte;
}
void Ds1302::_writeByte(uint8_t value)
{
for(uint8_t b = 0; b < 8; b++)
{
digitalWrite(_pin_dat, (value & 0x01) ? HIGH : LOW);
_nextBit();
value >>= 1;
}
}
void Ds1302::_nextBit()
{
digitalWrite(_pin_clk, HIGH);
delayMicroseconds(1);
digitalWrite(_pin_clk, LOW);
delayMicroseconds(1);
}
void Ds1302::_setDirection(int direction)
{
if (_dat_direction != direction)
{
_dat_direction = direction;
pinMode(_pin_dat, direction);
}
}
uint8_t Ds1302::_dec2bcd(uint8_t dec)
{
return ((dec / 10 * 16) + (dec % 10));
}
uint8_t Ds1302::_bcd2dec(uint8_t bcd)
{
return ((bcd / 16 * 10) + (bcd % 16));
}

120
src/ds1302.h Normal file
View File

@ -0,0 +1,120 @@
/** Ds1302.h
*
* Ds1302 class.
*
* @version 1.0.3
* @author Rafa Couto <caligari@treboada.net>
* @license GNU Affero General Public License v3.0
* @see https://github.com/Treboada/Ds1302
*
*/
#ifndef _DS_1302_H
#define _DS_1302_H
#include <stdint.h>
class Ds1302
{
public:
typedef struct {
uint8_t year;
uint8_t month;
uint8_t day;
uint8_t hour;
uint8_t minute;
uint8_t second;
uint8_t dow;
} DateTime;
/**
* Months of year
*/
enum MONTH : uint8_t {
MONTH_JAN = 1,
MONTH_FEB = 2,
MONTH_MAR = 3,
MONTH_APR = 4,
MONTH_MAY = 5,
MONTH_JUN = 6,
MONTH_JUL = 7,
MONTH_AUG = 8,
MONTH_SEP = 9,
MONTH_OCT = 10,
MONTH_NOV = 11,
MONTH_DEC = 12
};
/**
* Days of week
*/
enum DOW : uint8_t {
DOW_MON = 1,
DOW_TUE = 2,
DOW_WED = 3,
DOW_THU = 4,
DOW_FRI = 5,
DOW_SAT = 6,
DOW_SUN = 7
};
/**
* Constructor (pin configuration).
*/
Ds1302(uint8_t pin_ena, uint8_t pin_clk, uint8_t pin_dat);
/**
* Initializes the DW1302 chip.
*/
void init();
/**
* Returns when the oscillator is disabled.
*/
bool isHalted();
/**
* Stops the oscillator.
*/
void halt();
/**
* Starts the oscillator.
*/
void start();
/**
* Returns the current date and time.
*/
void getDateTime(DateTime* dt);
/**
* Sets the current date and time.
*/
void setDateTime(DateTime* dt);
private:
uint8_t _pin_ena;
uint8_t _pin_clk;
uint8_t _pin_dat;
void _prepareRead(uint8_t address);
void _prepareWrite(uint8_t address);
void _end();
int _dat_direction;
void _setDirection(int direction);
uint8_t _readByte();
void _writeByte(uint8_t value);
void _nextBit();
uint8_t _dec2bcd(uint8_t dec);
uint8_t _bcd2dec(uint8_t bcd);
void _setHaltFlag(bool stopped);
};
#endif // _DS_1302_H

20
src/jiaresi.cpp Normal file
View File

@ -0,0 +1,20 @@
#include "jiaresi.h"
#include "log.h"
// 控制4组加热丝加热
// status 1:开始加热 0:停止加热
void jiaresi(unsigned char address ,enum jiare_status status)
{
if(status == start_jiare)
{
my74hc595_setpin(address , 1);
}
else
{
my74hc595_setpin(address, 0);
}
}

19
src/jiaresi.h Normal file
View File

@ -0,0 +1,19 @@
#ifndef _jiaresi_H_
#define _jiaresi_H_
#include "Arduino.h"
#include "my74hc595.h"
enum jiare_status
{
stop_jiare,
start_jiare
};
void jiaresi(unsigned char address ,enum jiare_status status);
#endif

73
src/log.cpp Normal file
View File

@ -0,0 +1,73 @@
#include "log.h"
/*
w+以纯文本方式读写而wb+是以二进制方式进行读写。
mode说明
w 打开只写文件若文件存在则文件长度清为0即该文件内容会消失。若文件不存在则建立该文件。
w+ 打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。
wb 只写方式打开或新建一个二进制文件,只允许写数据。
wb+ 读写方式打开或建立一个二进制文件,允许读和写。
r 打开只读文件,该文件必须存在,否则报错。
r+ 打开可读写的文件,该文件必须存在,否则报错。
rb+ 读写方式打开一个二进制文件,只允许读写数据。
a 以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。(EOF符保留)
a+ 以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。 (原来的EOF符不保留)
ab+ 读写打开一个二进制文件,允许读或在文件末追加数据。
加入b 字符用来告诉函数库打开的文件为二进制文件,而非纯文字文件。
*/
// SoftwareSerial wb485Serial(wb485PORT_RX,wb485PORT_TX,false);
// void log_init()
// {
// }
SoftwareSerial U0_Serial(44,43,false);
void log_init()
{
U0_Serial.begin(19200);
}
void write_log(String path,String write_data,unsigned char level)
{
if(level <15) {
U0_Serial.println(write_data);
}
if (level == 20)
{
File file;
file = SD_MMC.open(path,"ab+");
file.println(write_data);
file.flush();
file.close();
}
}
void write_log(uint8_t *data,uint32_t size)
{
U0_Serial.write(data,size);
}
void save_data(String path,String write_data)
{
File file;
file = SD_MMC.open(path,"w+");
file.println(write_data);
file.flush();
file.close();
}

28
src/log.h Normal file
View File

@ -0,0 +1,28 @@
#ifndef _LOG_H_
#define _LOG_H_
#include "SDmanger.h"
#include <SoftwareSerial.h>
#define log_path "/log/log.log"
#define gp_log "/gp.log"
#define log_level 10
#define log_level_1 0 //打印到串口
#define log_level_2 5 //写入文件
#define log_level_3 10 //打印到串口和写入文件
void log_init();
void write_log(String path,String write_data,unsigned char level);
void save_data(String path,String write_data);
void write_log(uint8_t *data,uint32_t size);
// void my_println(String data,int level);
#endif

2650
src/main.cpp Normal file

File diff suppressed because it is too large Load Diff

72
src/my74hc595.cpp Normal file
View File

@ -0,0 +1,72 @@
#include "my74hc595.h"
#define SHCP 34
#define STCP 33
#define DS 35
int data=100;
unsigned int value[8] = {1, 1, 1, 1, 1, 1, 0, 0};
void writeto74()
{
digitalWrite(STCP, LOW);
// delay(1);
vTaskDelay(1);
for (int i = 0; i < 8; i++)
{
digitalWrite(SHCP, LOW);
// delay(1);
vTaskDelay(1);
digitalWrite(DS, value[i]);
// delay(1);
vTaskDelay(1);
digitalWrite(SHCP, HIGH);
}
// delay(1);
vTaskDelay(1);
digitalWrite(STCP, HIGH);
}
void updatepin()
{
writeto74();
}
bool my74hc595_setpin(int index, bool val)
{
if (index < 0 || index > 7)
{
return false;
}
value[index] = val;
updatepin();
return true;
}
void my74hc595_init(){
pinMode(SHCP, OUTPUT);
pinMode(STCP, OUTPUT);
pinMode(DS, OUTPUT);
updatepin();
tuigan(suo);
}
void my74hc595_setallpin(bool val)
{
for (size_t i = 0; i < 8; i++)
{
value[i] = val;
// my74hc595_setpin(i, value);
/* code */
}
updatepin();
}

14
src/my74hc595.h Normal file
View File

@ -0,0 +1,14 @@
#ifndef _MY74HC595_H
#define _MY74HC595_H
#include "Arduino.h"
#include "jiaresi.h"
#include "log.h"
#include "tuigan.h"
// void writeto74();
// void updatepin();
void my74hc595_init();
void my74hc595_setallpin(bool value);
bool my74hc595_setpin(int index, bool val);
void updatepin();
#endif

44
src/servo.cpp Normal file
View File

@ -0,0 +1,44 @@
#include "servo.h"
uint8_t channel;
float now_angle,servo_offset_angle = 5;
void servo_init(uint8_t servo_pin,uint8_t servo_channel)
{
int servo_freq = 50; // 频率(20ms周期)
int servo_resolution = 12; // 分辨率(8 ~ 16)
channel = servo_channel;
ledcSetup(servo_channel, servo_freq, servo_resolution);
ledcAttachPin(servo_pin, servo_channel);
servo_set_angle(0);
}
int calculatePWM(float degree)
{
if (degree < 0)
degree = 0;
if (degree > 360)
degree = 360;
return (degree / 360.0) * 410 + 103.0;
}
void servo_set_angle(float angle)
{
now_angle = angle;
ledcWrite(channel, calculatePWM(angle + servo_offset_angle));
}
//获取舵机的角度
float servo_get_angle()
{
return now_angle;
}
/// @brief
/// @param dir 0 为正向 1 为反向
/// @param angle
void servo_offset(float angle)
{
servo_offset_angle = angle;
}

13
src/servo.h Normal file
View File

@ -0,0 +1,13 @@
#ifndef _SERVO_H_
#define _SERVO_H_
#include <Arduino.h>
void servo_init(uint8_t servo_pin,uint8_t servo_channel);
int calculatePWM(float degree);
void servo_set_angle( float angle );
float servo_get_angle();
void servo_offset(float angle);
#endif

123
src/slave.cpp Normal file
View File

@ -0,0 +1,123 @@
#include "slave.h"
double new_emissivity =0.95;
Adafruit_MLX90614 mlx = Adafruit_MLX90614();
TwoWire wireme(0);
u_char a[]={0x01,0x04,0x00,0x00,0x00 ,0x06,0x70,0x08};
u_char yuliang[]={0x02, 0x03, 0x00, 0x00 ,0x00, 0x01, 0x84, 0x39};
u_char ClearYL[]={0x02,0x06,0x00, 0x00 ,0x00 ,0x5A ,0X09 ,0Xc2};
u_char yuliangfuliangdu[]={0x02,0x03,0x00,0x02,0x00,0x02,0x65,0xf8};
u_char openGNRMC[]={0xF1,0xD9,0x06,0x01,0x03,0x00,0xF0,0x05,0x01,0x00,0x1A};
u_char gpsSaveConfig[]={0xF1,0xD9,0x06,0x09,0x08,0x00,0x00,0x00,0x00,0x00,0x2F,0x00,0x00,0x00,0x46,0xB7};
SoftwareSerial *my485Port;
void slave::init(int8_t MY485PORT_RX,int8_t MY485PORT_TX){
// put your setup code here, to run once:
//Wire.begin(4,5);
// Serial.println("slave init ...");
write_log(log_path,"slave init ...",10);
my485Port = new SoftwareSerial(MY485PORT_RX ,MY485PORT_TX,false);
my485Port->begin(9600, SWSERIAL_8N1, MY485PORT_RX, MY485PORT_TX, false);
///////////// 光谱电源控制,重启
pinMode(36,OUTPUT);
digitalWrite(36,LOW);
vTaskDelay(2000);
digitalWrite(36,HIGH);
// GPSSeiral.begin(115200, SWSERIAL_8N1, 2, 12, false);
wireme.setPins(7,8);
if (!mlx.begin(MLX90614_I2CADDR,&wireme)) {
// Serial.println("Error connecting to MLX sensor. Check wiring.");
write_log(log_path,"Error connecting to MLX sensor. Check wiring.",10);
//while (1);
};
mlx.writeEmissivity(new_emissivity); // this does the 0x0000 erase write
// Serial.println(sizeof(openGNRMC));
write_log(log_path,String(sizeof(openGNRMC)),10);
}
double slave::getMLX(){
double a = mlx.readObjectTempC();
return a;
// Serial.write((char*) &a,8);
}
void slave::getWehter(){
while (my485Port->read()!=-1);
my485Port->write(a,8);
vTaskDelay(90);
for (int j = 0; j <17 ; ++j) {
ret[j]=my485Port->read();
}
float VV=(ret[3]*256+ret[4])*1.0/100;
float DD=(ret[5]*256+ret[6])*1.0/10;
float TT=(ret[7]*256+ret[8])*1.0/100;
float HH=(ret[9]*256+ret[10])*1.0/100;
long PP=(ret[13]*256+ret[14])*256*256+(ret[11]*256+ret[12]);
#ifdef DEBG
String str_getWehter = "VV:"+String(VV)+" DD:"+String(DD)+" TT:"+String(TT)+" HH:"+String(HH)+" PP:"+String(PP);
// return str;
// Serial.println("VV:"+String(VV)+" DD:"+String(DD)+" TT:"+String(TT)+" HH:"+String(HH)+" PP:"+String(PP));
#endif
// Serial.write(ret,17);
}
float slave::getYuliang(){
while (my485Port->read()!=-1);
my485Port->write(yuliang,8);
vTaskDelay(90);
for (int j = 0; j <7; ++j) {
ret[j]=my485Port->read();
}
float Value=ret[3]*256+ret[4];
Value=Value/10;
// Serial.write(ret,7);
// Serial.print(Value);
// Serial.print("#");
return Value;
}
int32_t slave::getYuliangfuliang(){
while (my485Port->read()!=-1);
my485Port->write(yuliangfuliangdu,8);
vTaskDelay(90);
for (int j = 0; j <7; ++j) {
ret[j]=my485Port->read();
}
int32_t Value=(ret[3]*256+ret[4])*256*256+ret[5]*256+ret[6];
// Value=Value/10;
// Serial.write(ret,7);
// Serial.print(Value);
// Serial.print("#");
return Value;
}
/// 返回1表示ok
uint8_t slave::claeryuliang(){
while (my485Port->read()!=-1);
my485Port->write(ClearYL,8);
vTaskDelay(90);
for (int j = 0; j <8; ++j) {
ret[j]=my485Port->read();
}
// Serial.print("OK");
return 1;
}

30
src/slave.h Normal file
View File

@ -0,0 +1,30 @@
#ifndef _SLAVE_H_
#define _SLAVE_H_
#include <Arduino.h>
#include "SoftwareSerial.h"
#include "Wire.h"
#include <Adafruit_MLX90614.h>
//#define DEBUG_SERIAL Serial
#include <SPI.h>
#include "SparkFun_Ublox_Arduino_Library.h"
#include "log.h"
class slave
{
public:
u_char ret[17];
String str_getWehter;
void init(int8_t MYPORT_RX,int8_t MYPORT_TX);
double getMLX();
void getWehter();
float getYuliang();
int32_t getYuliangfuliang();
uint8_t claeryuliang();
};
#endif

28
src/tuigan.cpp Normal file
View File

@ -0,0 +1,28 @@
#include "tuigan.h"
#include "log.h"
// //status 0:伸 1:缩
uint8_t tuigan_sta;
void tuigan(enum tuigan_status status)
{
if(status == tui)
{
my74hc595_setpin(7, 0);
my74hc595_setpin(6, 1);
tuigan_sta = tui;
}
else
{
my74hc595_setpin(7, 1);
my74hc595_setpin(6, 0);
tuigan_sta = suo;
}
}
uint8_t get_tuigan_status()
{
return tuigan_sta;
}

17
src/tuigan.h Normal file
View File

@ -0,0 +1,17 @@
#ifndef _TUIGAN_H_
#define _TUIGAN_H_
#include "Arduino.h"
#include "my74hc595.h"
enum tuigan_status
{
tui,
suo
};
void tuigan(enum tuigan_status status);
uint8_t get_tuigan_status();
#endif

233
src/updatebyme.cpp Normal file
View File

@ -0,0 +1,233 @@
#include "updatebyme.h"
#include "SDmanger.h"
void UpDateClassByme::performUpdate(Stream &updateSource, size_t updateSize)
{
if (Update.begin(updateSize))
{
Serial.println("Writes : ");
size_t written = Update.writeStream(updateSource);
if (written == updateSize)
{
Serial.println("Writes : " + String(written) + " successfully");
}
else
{
Serial.println("Written only : " + String(written) + "/" + String(updateSize) + ". Retry?");
}
if (Update.end())
{
Serial.println("OTA finished!");
if (Update.isFinished())
{
Serial.println("Restart ESP device!");
abort();
}
else
{
Serial.println("OTA not fiished");
}
}
else
{
Serial.println("Error occured #: " + String(Update.getError()));
}
}
else
{
Serial.println("Cannot beggin update");
}
}
size_t UpDateClassByme::DownloadFirmwareForurl(String version)
{
String url="/weather/firmware/esp32/firmware_"+version+".bin";
int err = http->get(url.c_str());
if (err != 0)
{
Serial.println(F("Date failed to connect"));
vTaskDelay(10000);
return 0;
}
int status = http->responseStatusCode();
if (!status)
{
vTaskDelay(10000);
return 0;
}
Serial.print(F("Response status code: "));
Serial.println(status);
// SerialMon.println(F("Response Headers:"));
size_t count=0;
while (http->headerAvailable())
{
String headerName = http->readHeaderName();
String headerValue = http->readHeaderValue();
Serial.println("Date: " + headerName + " : " + headerValue);
if (headerName=="Content-Length")
{
count=headerValue.toInt();
/* code */
}
}
Serial.println("lenth is "+String(count));
if (http->isResponseChunked())
{
Serial.println(F("Date The response is chunked"));
}
char *str=new char[1000];
int lent=count/1000;
File file;
file = SD_MMC.open("/update.bin", "wb");
for (size_t i = 0; i < lent; i++)
{
http->readBytes(str,1000);
file.write((const byte *)str,1000);
Serial.print("download ");
Serial.println(String(i*100/lent));
/* code */
}
http->readBytes(str,count%1000);
file.write((const byte *)str,count%1000);
file.flush();
file.close();
//performUpdate(*http,cout);
// http->readBytes
Serial.println("adfasdfsadfsdfsd");
//Serial.write(str,cout);
//Serial.println(body.length());
http->stop();
return count;
// return body;
}
void UpDateClassByme::initme(String Version)
{
CurrentVersion=Version;
}
void UpDateClassByme::updateversion()
{
String Targetversion=GetValueFromNet("/weather/php/upVserion.php",StationID+":"+CurrentVersion);
}
bool UpDateClassByme::CheckAndUpdate()
{
String Targetversion=GetValueFromNet("/weather/php/GetVserion.php",StationID);
if ( Targetversion=="0"||Targetversion==CurrentVersion||Targetversion=="")
{
return true;
}
Serial.println("targetvesion is:"+Targetversion);
//size_t countdownload1=375584;
size_t countdownload1=DownloadFirmwareForurl(Targetversion);
if (countdownload1<10000)
{
return false;
}
Serial.println("count download is:"+String(countdownload1));
String MD5=GetValueFromNet("/weather/php/GetMD5Value.php",Targetversion);
if (MD5=="0")
{
return false;
}
// updater.setMD5(MD5);
MD5Builder md5my;
File file;
file = SD_MMC.open("/update.bin", "rb");
md5my.begin();
md5my.addStream(file,countdownload1);
md5my.calculate();
String md5com=md5my.toString();
Serial.println("md5 comput is:"+md5my.toString());
Serial.println("md5 should is:"+MD5);
file.close();
if (MD5==md5com)
{
file = SD_MMC.open("/update.bin", "rb");
performUpdate(file,countdownload1);
return true;
/* code */
}
return true;
}
UpDateClassByme::UpDateClassByme(HttpClient *httptm)
{
http=httptm;
StationID="000";
}
String UpDateClassByme::GetValueFromNet(String url,String Key)
{
http->beginRequest();
http->post(url.c_str());
http->sendHeader(HTTP_HEADER_CONTENT_LENGTH, Key.length());
http->endRequest();
int err = http->write((const byte *)Key.c_str(), Key.length());
Serial.print("send date size");
Serial.println(err);
if (err == 0)
{
http->stop();
return "-1";
}
int status = http->responseStatusCode();
if (!status)
{
http->stop();
return "-1";
}
int length = http->contentLength();
if (length == 0)
{
http->stop();
return "-1";
}
String body = http->responseBody();
Serial.println("body:"+body);
http->stop();
return body;
}

23
src/updatebyme.h Normal file
View File

@ -0,0 +1,23 @@
#ifndef UPDATEBYME_H
#define UPDATEBYME_H
#include<Update.h>
#include <HTTPClient.h>
class UpDateClassByme{
public:
UpdateClass updater;
UpDateClassByme(HttpClient *httptm);
void performUpdate(Stream &updateSource, size_t updateSize);
HttpClient *http;
size_t DownloadFirmwareForurl(String version);
String CurrentVersion;
void initme(String Version);
bool CheckAndUpdate();
String StationID;
String GetValueFromNet(String url,String Key);
void updateversion();
};
#endif

41
src/wifidebug.cpp Normal file
View File

@ -0,0 +1,41 @@
#include <wifidebug.h>
#include<TCPserver.h>
#ifdef DebugCalibration
const char *ssid = "SmartForCalibration";
const char *password = "123456789";
IPAddress local_IP(192, 168, 1,2);
IPAddress gateway(192, 168, 1, 2);
IPAddress subnet(255, 255, 255, 0);
TCPserver *tcpserver;
void beginWIFI(){
tcpserver=new TCPserver(23);
WiFi.mode( WIFI_MODE_AP );
Serial.println("init webserver ok 33333");
WiFi.softAPConfig(local_IP, gateway, subnet);
boolean result = WiFi.softAP(ssid, password);
tcpserver->loop();
}
void tcploop(){
tcpserver->loop();
}
void printbytcpserver(String str)
{
tcpserver->SendDataToClinet(str);
tcpserver->loop();
// Serial.println(str);
}
#endif
#ifndef DebugCalibration
void beginWIFI(){}
void printbytcpserver(String str){}
void tcploop(){}
#endif

16
src/wifidebug.h Normal file
View File

@ -0,0 +1,16 @@
#include"Arduino.h"
#include"Define.h"
#ifdef DebugCalibration
#include"WiFi.h"
#endif
void beginWIFI();
void printbytcpserver(String str);
void tcploop();