This commit is contained in:
xin
2025-11-11 11:15:20 +08:00
parent ba2edfbe8f
commit bb1d4515c9
13 changed files with 679 additions and 117 deletions

View File

@ -30,13 +30,14 @@
[env:esp32-s3-devkitc-1] [env:esp32-s3-devkitc-1]
; platformio/espressif32@^6.4.0 ; platformio/espressif32@^6.4.0
platform = espressif32 @ 6.8.0 ; platform = espressif32
platform = https://github.com/pioarduino/platform-espressif32/releases/download/53.03.11/platform-espressif32.zip
board = esp32-s3-devkitc-1 board = esp32-s3-devkitc-1
framework = arduino framework = arduino
platform_packages = platform_packages =
toolchain-riscv32-esp @ 8.4.0+2021r2-patch5 ; toolchain-riscv32-esp @ 8.4.0+2021r2-patch5
; framework-arduinoespressif32 @ 2.0.6+sha.099b432 ; framework-arduinoespressif32 @ https://github.com/espressif/arduino-esp32#master
; board_upload.flash_size=4MB ; board_upload.flash_size=4MB
board_upload.flash_size=4MB board_upload.flash_size=4MB
board_upload.maximum_size=327680 board_upload.maximum_size=327680
@ -59,10 +60,12 @@ board_build.flash_mode = dio
build_flags: build_flags:
-DVERSION=${this.custom_prog_version} -DVERSION=${this.custom_prog_version}
-DARDUINO_USB_CDC_ON_BOOT=1 -DARDUINO_USB_CDC_ON_BOOT=1
; -DCONFIG_SOC_SDMMC_HOST_SUPPORTED=y,
; -DCONFIG_TINYUSB_MSC_ENABLED=y
;-DDINBIAO ;-DDINBIAO
extra_scripts = pre:extra_script.py extra_scripts = pre:extra_script.py
custom_prog_version = V3.1DDY custom_prog_version = V3.2
debug_tool.upload_protocol = esp-builtin debug_tool.upload_protocol = esp-builtin
monitor_speed = 115200 ; 你当前是 921600若改回 115200 请同时调整 monitor_speed = 115200 ; 你当前是 921600若改回 115200 请同时调整
monitor_filters = esp32_exception_decoder monitor_filters = esp32_exception_decoder

View File

@ -3,7 +3,8 @@
#define STRINGIFY(x) #x #define STRINGIFY(x) #x
#define TOSTRING(x) STRINGIFY(x) #define TOSTRING(x) STRINGIFY(x)
// #define ARDUINO_USB_MODE 0 // #define ARDUINO_USB_MODE 0
#include <freertos/FreeRTOS.h>
#include <freertos/event_groups.h>
//#define DebugCalibration //#define DebugCalibration
//#define DINBIAO //#define DINBIAO
@ -14,6 +15,11 @@
#define Curentvsion TOSTRING(VERSION) #define Curentvsion TOSTRING(VERSION)
#endif #endif
#define STOP_WORK_BIT (1<<0)
#define StART_WORK_BIT (1<<1)
#define START_MSC_BIT (1<<2)
extern EventGroupHandle_t Eventgroup;
#endif #endif

View File

@ -1,7 +1,7 @@
#include"Myhttpserver.h" #include"Myhttpserver.h"
myHttpServer * myhttpserver; myHttpServer * myhttpserver;
#include <log.h>
#include <updatebyme.h>
String myHttpServer::getnetData() String myHttpServer::getnetData()
{ {
if (!isinit) if (!isinit)
@ -83,7 +83,8 @@ bool myHttpServer::UpdateData(String path, char *str, size_t lenth, String Conte
{ {
return false; return false;
} }
Serial.println("start put data to "+path); // Serial.println("start put data to "+path);
write_log_def(10,"start put data to "+path);
http1->beginRequest(); http1->beginRequest();
http1->post(path); http1->post(path);
if (Contenttype != "") if (Contenttype != "")
@ -97,8 +98,9 @@ bool myHttpServer::UpdateData(String path, char *str, size_t lenth, String Conte
http1->endRequest(); http1->endRequest();
int err = http1->write((const byte *)str, lenth); int err = http1->write((const byte *)str, lenth);
delay(100); delay(100);
Serial.print("send date size"); // Serial.print("send date size");
Serial.println(err); // Serial.println(err);
write_log_def(10,"send date size"+String(err));
/* /*
for (size_t i = 0; i < lenth; i++) for (size_t i = 0; i < lenth; i++)
@ -138,7 +140,8 @@ bool myHttpServer::UpdateData(String path, char *str, size_t lenth, String Conte
} }
String body = http1->responseBody(); String body = http1->responseBody();
Serial.println("body:"+body); // Serial.println("body:"+body);
write_log_def(10,"body:"+body);
if (body != "ok") if (body != "ok")
{ {
http1->stop(); http1->stop();
@ -160,17 +163,67 @@ void myHttpServer::ReuploadData(String path, String webpath, String content )
Vector<String> files; Vector<String> files;
String vec[20]; //每次处理20个 String vec[20]; //每次处理20个
files.setStorage(vec); files.setStorage(vec);
while (!sdcard::ListDir(path.c_str(), files)) sdcard::lock();
bool hasmore = !sdcard::ListDir(path.c_str(), files);
sdcard::unlock();
while (hasmore)
{ {
sdcard::lock();
if (files.size() != 0) if (files.size() != 0)
{ {
Serial.println("find " + String(files.size()) + "file");
// Serial.println("find " + String(files.size()) + "file");
write_log_def(10,"find " + String(files.size()) + "file");
for (size_t i = 0; i < files.size(); i++) for (size_t i = 0; i < files.size(); i++)
{ {
//判断是否时md5文件 如果是则跳过
if (files.at(0).endsWith(".md5"))
{
continue;
}
//判断filename.md5是否存在 如果存在则读取md5并计算文件的md5进行对比
if (!sdcard::fileexists((files.at(i) + ".md5").c_str()))
{
continue;
}
String md5value=sdcard::ReadFileToString((files.at(i) + ".md5").c_str());
if (md5value=="")
{
continue;
/* code */
}
//计算文件的md5
File nowfile = SD_MMC.open(files.at(i).c_str(), "rb"); File nowfile = SD_MMC.open(files.at(i).c_str(), "rb");
size_t size = nowfile.size(); size_t size = nowfile.size();
char *arr = new char[size]; char *arr = new char[size];
nowfile.readBytes(arr, size); nowfile.readBytes(arr, size);
MD5Builder md5my;
md5my.begin();
md5my.add((uint8_t *)arr, size);
md5my.calculate();
String md5string = md5my.toString();
if (md5string != md5value)
{
// Serial.println("file md5 not match ,skip this file"+files.at(i));
write_log_def(10,"file md5 not match ,skip this file"+files.at(i));
delete[] arr;
sdcard::deleteFolderOrFile(files.at(i).c_str());
continue;
/* code */
}
bool flagsucc = UpdateData(webpath, arr, size, content); bool flagsucc = UpdateData(webpath, arr, size, content);
if (!flagsucc) if (!flagsucc)
{ {
@ -183,11 +236,16 @@ void myHttpServer::ReuploadData(String path, String webpath, String content )
/* code */ /* code */
} }
} }
hasmore = !sdcard::ListDir(path.c_str(), files);
sdcard::unlock();
vTaskDelay(1); vTaskDelay(1);
} }
if (files.size() != 0) if (files.size() != 0)
{ {
Serial.println("find " + String(files.size()) + "file not enough 20"); sdcard::lock();
// Serial.println("find " + String(files.size()) + "file not enough 20");
write_log_def(10,"find " + String(files.size()) + "file not enough 20");
for (size_t i = 0; i < files.size(); i++) for (size_t i = 0; i < files.size(); i++)
{ {
vTaskDelay(1); vTaskDelay(1);
@ -195,7 +253,9 @@ void myHttpServer::ReuploadData(String path, String webpath, String content )
size_t size = nowfile.size(); size_t size = nowfile.size();
char *arr = new char[size]; char *arr = new char[size];
nowfile.readBytes(arr, size); nowfile.readBytes(arr, size);
Serial.println("run here now");
write_log_def(10,"run here now 123");
vTaskDelay(1);
bool flagsucc = UpdateData(webpath, arr, size, content); bool flagsucc = UpdateData(webpath, arr, size, content);
if (!flagsucc) if (!flagsucc)
{ {
@ -207,21 +267,26 @@ void myHttpServer::ReuploadData(String path, String webpath, String content )
sdcard::deleteFolderOrFile(files.at(i).c_str()); sdcard::deleteFolderOrFile(files.at(i).c_str());
/* code */ /* code */
} }
sdcard::unlock();
} }
vTaskDelay(1); vTaskDelay(1);
} }
void Reuploaddata1(void *) //重新上传数据 void Reuploaddata1(void *) //重新上传数据
{ {
myhttpserver->ReuploadData("/down", Http_Sepctral_Path); myhttpserver->ReuploadData("/down", Http_Sepctral_Path);
myhttpserver->ReuploadData("/up", Http_Sepctral_Path); myhttpserver->ReuploadData("/up", Http_Sepctral_Path);
myhttpserver->ReuploadData("/other", Http_Wind_Path, "application/json"); myhttpserver->ReuploadData("/other", Http_Wind_Path, "application/json");
} }
void Reuploaddata2() //重新上传数据 void Reuploaddata2() //重新上传数据
{ {
// sdcard::lock();
myhttpserver->ReuploadData("/down", Http_Sepctral_Path); myhttpserver->ReuploadData("/down", Http_Sepctral_Path);
myhttpserver->ReuploadData("/up", Http_Sepctral_Path); myhttpserver->ReuploadData("/up", Http_Sepctral_Path);
myhttpserver->ReuploadData("/other", Http_Wind_Path, "application/json"); myhttpserver->ReuploadData("/other", Http_Wind_Path, "application/json");
// sdcard::unlock();
} }
void myHttpServer::setup1(Client &client,char * serveradd) void myHttpServer::setup1(Client &client,char * serveradd)
@ -232,5 +297,6 @@ void myHttpServer::setup1(Client &client,char * serveradd)
isinit = true; isinit = true;
log_path = "/httplog.txt"; log_path = "/httplog.txt";
myhttpserver= this; myhttpserver= this;
Serial.println("start httpserver 2332213"+String(http1->iServerName)); // Serial.println("start httpserver 2332213"+String(http1->iServerName));
write_log_def(10,"start httpserver: "+String(http1->iServerName));
} }

View File

@ -7,9 +7,13 @@
#include "log.h" #include "log.h"
void Reuploaddata1(void *); void Reuploaddata1(void *);
void Reuploaddata2() ; void Reuploaddata2() ;
static String Http_Sepctral_Path="/DDY/weather/php/SpectralDataUp.php"; // static String Http_Sepctral_Path="/DDY/weather/php/SpectralDataUp.php";
static String Http_Wind_Path="/DDY/weather/php/WindsensorUp.php"; // static String Http_Wind_Path="/DDY/weather/php/WindsensorUp.php";
static String Http_Sepctral_Path="/weather/php/SpectralDataUp.php";
static String Http_Wind_Path="/weather/php/WindsensorUp.php";
static String Http_Log_Path="/weather/php/log.php"; static String Http_Log_Path="/weather/php/log.php";
static String Http_Sensorinfo_UP_Path="/weather/php/SensorInfoUp.php"; static String Http_Sensorinfo_UP_Path="/weather/php/SensorInfoUp.php";
static String Http_Station_GPS_INfo_Path="/weather/php/StationGPSinfo.php"; static String Http_Station_GPS_INfo_Path="/weather/php/StationGPSinfo.php";

View File

@ -1,10 +1,60 @@
#include"SDmanger.h" #include"SDmanger.h"
#include "esp_vfs_fat.h"
#include "sdmmc_cmd.h"
#include <Arduino.h>
File Comenfile; File Comenfile;
SemaphoreHandle_t sd_mutex = xSemaphoreCreateMutex();
void sdcard::lock() {
xSemaphoreTake(sd_mutex, portMAX_DELAY);
}
void sdcard::unlock() {
xSemaphoreGive(sd_mutex);
}
void sdcard::formatSDCard() {
// SD_MMC.end(); // 先卸载SD卡文件系统
Serial.println("Formatting SD card...");
esp_vfs_fat_mount_config_t mount_config = {
.format_if_mount_failed = true, // 不自动格式化
.max_files = 5,
.allocation_unit_size = 16 * 1024
};
sdmmc_card_t* card = nullptr;
card= SD_MMC.card();
//esp_err_t err = esp_vfs_fat_sdcard_format("/sdcard", card);
// 调用真正的格式化函数
esp_vfs_fat_mount_config_t fmt_config = mount_config; // 也可以调整 fmt_config 参数
esp_err_t err = esp_vfs_fat_sdcard_format_cfg("/sdcard", card, &fmt_config);
Serial.println("Formatting completed");
if (err == ESP_OK) {
Serial.println("SD card formatted successfully");
} else {
Serial.printf("Format failed: %s\n", esp_err_to_name(err));
}
}
#define sd_cmd 7
#define sd_clk 6
#define sd_dat0 5
#define sd_dat1 4
#define sd_dat2 16
#define sd_dat3 15
int sdcard::init_sdcard() int sdcard::init_sdcard()
{ {
SD_MMC.setPins(9,10,11,12,13,14); pinMode(48, OUTPUT);
int succ = SD_MMC.begin("/sdcard", true,true,150); digitalWrite(48, HIGH);
vTaskDelay(1000);
SD_MMC.setPins(9,10,11,12,13,14);
//格式化sd卡
//SD_MMC.setPins(sd_clk,sd_cmd,sd_dat0,sd_dat1,sd_dat2,sd_dat3);
int succ = SD_MMC.begin("/sdcard", false,true);
if (succ) { if (succ) {
Serial.printf("SD_MMC Begin: %d\n", succ); Serial.printf("SD_MMC Begin: %d\n", succ);
uint8_t cardType = SD_MMC.cardType(); uint8_t cardType = SD_MMC.cardType();
@ -32,6 +82,8 @@ int sdcard::init_sdcard()
return ESP_OK; return ESP_OK;
} }
void sdcard::mylistDir( const char * dirname, uint8_t levels) { void sdcard::mylistDir( const char * dirname, uint8_t levels) {
Serial.printf("Listing directory: %s\n", "/"); Serial.printf("Listing directory: %s\n", "/");
@ -64,13 +116,27 @@ int sdcard::init_sdcard()
Serial.print(" SIZE: "); Serial.print(" SIZE: ");
Serial.println(filex.size()); Serial.println(filex.size());
} }
filex.close();
filex = root.openNextFile(); filex = root.openNextFile();
} }
} }
bool sdcard::fileexists(const char * path)
{
File f = SD_MMC.open(path);
if (!f) {
f.close();
return false;
}
f.close();
return true;
}
bool sdcard::ListDir(const char * dirname,Vector <String> &stringlist) bool sdcard::ListDir(const char * dirname,Vector <String> &stringlist)
{ {
stringlist.clear(); stringlist.clear();
Serial.printf("Listing directory: %s\n", dirname); Serial.println("Listing directory: ");
String dir(dirname); String dir(dirname);
File root = SD_MMC.open(dirname); File root = SD_MMC.open(dirname);
if (!root) { if (!root) {
@ -98,9 +164,10 @@ bool sdcard::ListDir(const char * dirname,Vector <String> &stringlist)
} }
} }
filex.close();
filex = root.openNextFile(); filex = root.openNextFile();
} }
filex.close();
return true; return true;
} }
@ -241,6 +308,8 @@ bool sdcard::ListDir(const char * dirname,Vector <String> &stringlist)
return SD_MMC.mkdir(path); return SD_MMC.mkdir(path);
} }
namespace sdcard namespace sdcard
{ {
void openFileformWirte(String Path) void openFileformWirte(String Path)
@ -274,7 +343,23 @@ namespace sdcard
} }
} }
String ReadFileToString(const char * path)
{
String ret="";
File file=SD_MMC.open(path,"r");
if (!file)
{
return ret;
/* code */
}
while (file.available())
{
ret+=char(file.read());
/* code */
}
file.close();
return ret;
}
void closeCommenFile() void closeCommenFile()
{ {
if (Comenfile.available()) if (Comenfile.available())

View File

@ -22,7 +22,11 @@ namespace sdcard{
void WritetoFileCommen(String Str); void WritetoFileCommen(String Str);
void WritetoFileCommen(char *data,size_t lenth); void WritetoFileCommen(char *data,size_t lenth);
void closeCommenFile(); void closeCommenFile();
void lock();
void unlock();
String ReadFileToString(const char * path);
bool fileexists(const char * path);
void formatSDCard();
} }
#endif #endif

View File

@ -4,7 +4,7 @@
#include "wifidebug.h" #include "wifidebug.h"
#include <esp_task_wdt.h>
#include "SensorOptoSky.h" #include "SensorOptoSky.h"
bool SensorOptoSky::initSensor(int id ) bool SensorOptoSky::initSensor(int id )
{ {
@ -167,6 +167,7 @@ void SensorOptoSky::GetOneDate(int msc) {
memcpy(DATABUFF, IS1Sensor.result + 1, SensorInfo.BandNum * 2); memcpy(DATABUFF, IS1Sensor.result + 1, SensorInfo.BandNum * 2);
//memcpy(DATABUFF, IS1Sensor.result , SensorInfo.BandNum * 2); //memcpy(DATABUFF, IS1Sensor.result , SensorInfo.BandNum * 2);
shortLittletoBiG(DATABUFF, SensorInfo.BandNum); shortLittletoBiG(DATABUFF, SensorInfo.BandNum);
esp_task_wdt_reset(); //手动喂狗
} }
void SensorOptoSky::shortLittletoBiG(unsigned short *data, int lenth) { void SensorOptoSky::shortLittletoBiG(unsigned short *data, int lenth) {
@ -250,11 +251,17 @@ void SensorOptoSky::TakeOneJob() {
int shutter=OptSnenser(90); int shutter=OptSnenser(90);
shutterup=shutter; shutterup=shutter;
GetOneDate(shutter); GetOneDate(shutter);
//esp_task_wdt_reset(); //手动喂狗
memcpy(UpData,DATABUFF,SensorInfo.BandNum*2); memcpy(UpData,DATABUFF,SensorInfo.BandNum*2);
SetShutter(0); SetShutter(0);
GetOneDate(shutter); GetOneDate(shutter);
for (int i = 0; i < SensorInfo.BandNum; ++i) { for (int i = 0; i < SensorInfo.BandNum; ++i) {
UpData[i]=UpData[i]-DATABUFF[i]; int temp=UpData[i]-DATABUFF[i];
UpData[i]=temp>0?temp:0;
// UpData[i]=UpData[i]-DATABUFF[i];
} }
shutterup=shutter; shutterup=shutter;
Serial.println("Finish Up ------Green"); Serial.println("Finish Up ------Green");
@ -282,7 +289,9 @@ void SensorOptoSky::TakeOneJob() {
SetShutter(0); SetShutter(0);
GetOneDate(shutter); GetOneDate(shutter);
for (int i = 0; i < SensorInfo.BandNum; ++i) { for (int i = 0; i < SensorInfo.BandNum; ++i) {
DownData[i]=DownData[i]-DATABUFF[i]; int temp=DownData[i]-DATABUFF[i];
DownData[i]=temp>0?temp:0;
} }
shutterdown=shutter; shutterdown=shutter;
Serial.println("Down Finish ------Blue"); Serial.println("Down Finish ------Blue");

View File

@ -28,8 +28,90 @@ ab+ 读写打开一个二进制文件,允许读或在文件末追加数据。
加入b 字符用来告诉函数库打开的文件为二进制文件,而非纯文字文件。 加入b 字符用来告诉函数库打开的文件为二进制文件,而非纯文字文件。
*/ */
String pathforlog = "/log.txt";
dateandtime start_offset_datetime = {2024, 1, 1, 0, 0, 0}; // 设置起始时间为2024-01-01 00:00:00
uint64_t start_offset_mcu_time= 0; // 2024-01-01 00:00:00对应的Unix时间戳
void setpathforlog(String path)
{
pathforlog = path;
}
bool isLeapYear(int year) {
return (year % 400 == 0) || ((year % 4 == 0) && (year % 100 != 0));
}
int daysInMonth(int year, int month) {
static const int days[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
if (month == 2 && isLeapYear(year)) return 29;
return days[month - 1];
}
void tmaddseconds(dateandtime &tm, long long n) {
// 先加秒
tm.second += n;
// 秒转分钟
tm.minute += tm.second / 60;
tm.second %= 60;
// 分钟转小时
tm.hour += tm.minute / 60;
tm.minute %= 60;
// 小时转天
tm.day += tm.hour / 24;
tm.hour %= 24;
// 处理日/月/年的进位
while (true) {
int dim = daysInMonth(tm.year, tm.month);
if (tm.day <= dim) break;
tm.day -= dim;
tm.month++;
if (tm.month > 12) {
tm.month = 1;
tm.year++;
}
}
}
void setoffsettime(dateandtime tm)
{
start_offset_datetime = tm;
start_offset_mcu_time = millis();
}
void write_log_def(unsigned char level,String write_data)
{
write_log(pathforlog,level,write_data);
}
String two(int v) {
if (v < 10) return "0" + String(v);
return String(v);
}
String getlocaltime()
{
unsigned long uptime = millis();
long time_diff = uptime - start_offset_mcu_time;
long seconds = time_diff / 1000;
long milliseconds = time_diff % 1000;
dateandtime tm = start_offset_datetime;
tmaddseconds(tm, seconds);
String timestr=String(tm.year) + "-"+two(tm.month) +"-" + two(tm.day) + " " + two(tm.hour) + ":" + two(tm.minute) + ":" + two(tm.second);
return timestr;
}
void write_log(String path,unsigned char level,String write_data) void write_log(String path,unsigned char level,String write_data)
{ {
//return;
#ifdef ceshi #ifdef ceshi
Serial.println(write_data); Serial.println(write_data);
#endif #endif
@ -38,23 +120,23 @@ void write_log(String path,unsigned char level,String write_data)
//保存本地和同时上传云端小于10只保存本地 //保存本地和同时上传云端小于10只保存本地
} }
unsigned long uptime = millis(); unsigned long uptime = millis();
unsigned long seconds = uptime / 1000; long time_diff = uptime - start_offset_mcu_time;
unsigned long minutes = seconds / 60;
unsigned long hours = minutes / 60;
unsigned long days = hours / 24;
unsigned long years = days / 365;
seconds %= 60;
minutes %= 60;
hours %= 24;
days %= 365;
String timeString = String(years) + "-" + String(days) + "-" + String(hours) + ":" + String(minutes) + ":" + String(seconds); long seconds = time_diff / 1000;
long milliseconds = time_diff % 1000;
dateandtime tm = start_offset_datetime;
tmaddseconds(tm, seconds);
String timeString = String(tm.year) + "-"+two(tm.month) +"-" + two(tm.day) + " " + two(tm.hour) + ":" + two(tm.minute) + ":" + two(tm.second)+ "." + String(milliseconds);
write_data = timeString + ":" + write_data; write_data = timeString + ":" + write_data;
sdcard::lock();
File file; File file;
file = SD_MMC.open(path,"ab+"); file = SD_MMC.open(path,"ab+");
file.println(write_data); file.println(write_data);
file.flush(); file.flush();
file.close(); file.close();
sdcard::unlock();
} }

View File

@ -4,9 +4,20 @@
#define ceshi 1 #define ceshi 1
#include "SDmanger.h" #include "SDmanger.h"
struct dateandtime
{
int year;
int month;
int day;
int hour;
int minute;
int second;
};
void write_log(String path,unsigned char level,String write_data); void write_log(String path,unsigned char level,String write_data);
void setoffsettime(dateandtime tm);
void write_log_def(unsigned char level,String write_data);
void setpathforlog(String path);
String getlocaltime();
#endif #endif

View File

@ -1,11 +1,14 @@
#include"Define.h" #include"Define.h"
#include <GSMMannager.h> #include <GSMMannager.h>
// #include "msc.h"
#include<driver/periph_ctrl.h> #include<driver/periph_ctrl.h>
#include "SensorOptoSky.h" #include "SensorOptoSky.h"
#include <SoftwareSerial.h> #include <SoftwareSerial.h>
#include <Ticker.h> #include <Ticker.h>
#include <updatebyme.h> #include <updatebyme.h>
#include "mymsc.h"
//#include "MyWebServer.h" //#include "MyWebServer.h"
#include "SDmanger.h" #include "SDmanger.h"
//#include "HttpsOTAUpdate.h" //#include "HttpsOTAUpdate.h"
@ -15,15 +18,16 @@
#define beePin 39 #define beePin 39
#define BeeChain 0 #define BeeChain 0
#include <wifidebug.h> #include <wifidebug.h>
#include <serilaFS.h>
#define LOGGING #define LOGGING
//myPort将原来ESP8266对内通讯改为485对内的通讯 //myPort将原来ESP8266对内通讯改为485对内的通讯
// #define MYPORT_TX 45 // #define MYPORT_TX 45
// #define MYPORT_RX 46 // #define MYPORT_RX 46
#define WATCHDOG_TIMEOUT_SECONDS 600
int hassend = 0; int hassend = 0;
GSMMannger *gsmmanger; GSMMannger *gsmmanger;
UpDateClassByme *ProgrameUper; UpDateClassByme *ProgrameUper;
EventGroupHandle_t Eventgroup;
SensorOptoSky IS1Sensor; SensorOptoSky IS1Sensor;
myHttpServer *httpserver; myHttpServer *httpserver;
@ -63,29 +67,59 @@ String fenge(String str, String fen, int index)
return "-1"; return "-1";
return temps[index]; return temps[index];
} }
// void beebee(int timemill)
// {
// ledcAttachPin(beePin, BeeChain);
// ledcWrite(BeeChain, 125);
// vTaskDelay(timemill);
// ledcWrite(BeeChain, 0);
// vTaskDelay(timemill);
// ledcWrite(BeeChain, 125);
// vTaskDelay(timemill);
// ledcWrite(BeeChain, 0);
// ledcDetachPin(beePin);
// }
void beebee(int timemill) void beebee(int timemill)
{ {
ledcAttachPin(beePin, BeeChain); // === 替换 ledcAttachPin ===
ledcWrite(BeeChain, 125); // 旧: ledcAttachPin(beePin, BeeChain);
// 新: ledcAttach(pin, freq, resolution_bits);
// 假设频率仍然是 220Hz分辨率是 8位 (0-255)
// 注意:如果 BeeChain 被用作一个通道号,并且你希望显式地使用它,
// 新的 ledcAttach 函数并没有直接的 channel 参数。
// 但是,你可以通过 ledcSetChannelPin(BeeChain, beePin); 来实现类似目的。
// 最常见的用法是让 ledcAttach 自动选择通道。
// 如果 BeeChain 只是一个 "逻辑链" 或者通道号,现在我们直接用 beePin 和频率、分辨率
// ledcAttach(beePin, 220, 8); // 将 beePin 关联到 LEDC设置频率 220Hz8位分辨率
// 这会在内部自动分配一个空闲的 LEDC 通道给 beePin。
// === 替换 ledcWrite ===
// 旧: ledcWrite(BeeChain, 125);
// 新: ledcWrite(pin, duty);
ledcWrite(beePin, 125); // 在 beePin 上设置 125 的占空比 (~49%,因为 125/255)
vTaskDelay(timemill); // 使用实时操作系统任务延迟
ledcWrite(beePin, 0); // 在 beePin 上设置 0 的占空比 (关闭)
vTaskDelay(timemill); vTaskDelay(timemill);
ledcWrite(beePin, 125); // 在 beePin 上设置 125 的占空比 (打开)
ledcWrite(BeeChain, 0); vTaskDelay(timemill);
vTaskDelay(timemill); ledcWrite(beePin, 0); // 在 beePin 上设置 0 的占空比 (关闭)
// === 替换 ledcDetachPin ===
ledcWrite(BeeChain, 125); // 旧: ledcDetachPin(beePin);
vTaskDelay(timemill); // 新: ledcDetach(pin);
ledcDetach(beePin); // 从 LEDC 分离 beePin
ledcWrite(BeeChain, 0);
ledcDetachPin(beePin);
} }
String Datenow=""; String Datenow="";
void printbytcp(String str) void printbytcp(String str)
{ {
//tcpserver.SendDataToClinet(str); //tcpserver.SendDataToClinet(str);
Serial.println(str); // Serial.println(str);
// write_log(log_path,0,str);
str=Datenow+"#######"+str; str=Datenow+"#######"+str;
int lennn=str.length(); int lennn=str.length();
char *temp = new char[lennn]; char *temp = new char[lennn];
@ -97,13 +131,16 @@ void printbytcp(String str)
} }
void readmeichaung() void readmeichaung()
{ {
/////////////////////////////////now/////////////////////////// /////////////////////////////////now///////////////////////////
double temprature = myslave.getMLX(); double temprature = myslave.getMLX();
Serial.println("wendu"); // Serial.println("wendu");
Serial.println(temprature); // Serial.println(temprature);
Serial.println("hello word"); // Serial.println("hello word");
write_log(log_path,10,"temprature:" + String(temprature));
////////////////////////////////now//////////////////////////// ////////////////////////////////now////////////////////////////
myslave.getWehter(); myslave.getWehter();
memcpy(windret,myslave.ret,17); memcpy(windret,myslave.ret,17);
@ -112,24 +149,27 @@ void readmeichaung()
float TT = (windret[7] * 256 + windret[8]) * 1.0 / 100; float TT = (windret[7] * 256 + windret[8]) * 1.0 / 100;
float HH = (windret[9] * 256 + windret[10]) * 1.0 / 100; float HH = (windret[9] * 256 + windret[10]) * 1.0 / 100;
long PP = (windret[13] * 256 + windret[14]) * 256 * 256 + (windret[11] * 256 + windret[12]); long PP = (windret[13] * 256 + windret[14]) * 256 * 256 + (windret[11] * 256 + windret[12]);
Serial.println("VV:" + String(VV) + "DD:" + String(DD) + "TT:" + String(TT) + "HH:" + String(HH) + "PP:" + String(PP)); // Serial.println("VV:" + String(VV) + "DD:" + String(DD) + "TT:" + String(TT) + "HH:" + String(HH) + "PP:" + String(PP));
write_log(log_path,10,"VV:" + String(VV) + " DD:" + String(DD) + " TT:" + String(TT) + " HH:" + String(HH) + " PP:" + String(PP));
} }
String get_GPS(void) String get_GPS(void)
{ {
Serial.println("check GPS...");
write_log(log_path,10,"check GPS...");
gsmmanger->modem->sendAT(GF("+CGNSPWR?")); gsmmanger->modem->sendAT(GF("+CGNSPWR?"));
gsmmanger->modem->waitResponse("OK"); gsmmanger->modem->waitResponse("OK");
Serial.println("Open GPS...");
write_log(log_path,10,"Open GPS...");
gsmmanger->modem->sendAT(GF("+CGNSPWR=1")); gsmmanger->modem->sendAT(GF("+CGNSPWR=1"));
gsmmanger->modem->waitResponse("OK"); gsmmanger->modem->waitResponse("OK");
gsmmanger->modem->sendAT(GF("+CGNSAID=31,1,1,1")); gsmmanger->modem->sendAT(GF("+CGNSAID=31,1,1,1"));
gsmmanger->modem->waitResponse("OK"); gsmmanger->modem->waitResponse("OK");
Serial.println("get GNSS...");
gsmmanger->modem->sendAT(GF("+CGNSINF")); gsmmanger->modem->sendAT(GF("+CGNSINF"));
String gpsbac; String gpsbac;
@ -149,7 +189,8 @@ String get_GPS(void)
return "-1"; return "-1";
} }
Serial.println(gpsbac);
write_log(log_path,10,"gpsdate:"+Date); write_log(log_path,10,"gpsdate:"+Date);
return Date; return Date;
} }
@ -157,32 +198,87 @@ String get_GPS(void)
// { // {
// return gsmmanger->modem->getNetworkTime; // return gsmmanger->modem->getNetworkTime;
// } // }
#include "esp_task_wdt.h" // #include "esp_task_wdt.h"
// 用于存储 loop 任务的句柄(如果需要)
TaskHandle_t loopTaskHandle = NULL;
#include <esp_task_wdt.h>
#include <freertos/FreeRTOS.h>
#include <freertos/task.h>
void setup() void setup()
{ {
esp_task_wdt_init(20, true);
Serial.begin(115200);
//esp_task_wdt_init(20, true);
Serial.begin(460800);
Serial.println("start"); Serial.println("start");
//return; //return;
Serial.println(Curentvsion); Serial.println(Curentvsion);
sdcard::lock();
// vTaskDelay(5000);
sdcard::init_sdcard(); sdcard::init_sdcard();
String hasbeenformat = sdcard::ReadFileToString("/do_not_remove_and_edit_this_file");
if(hasbeenformat == ""){
sdcard::formatSDCard();
sdcard::WriteStringToFile("/do_not_remove_and_edit_this_file","do not remove and edit this file \n\
this file is used to tell the system that the sdcard has been formated,\
\nif you want to format the sdcard,please delete this file,\n\
the system will format the sdcard automatically next reboot.");
//重启
esp_restart();
}
// vTaskDelay(5000);
//sdcard::formatSDCard();
// while (1)
// {
// vTaskDelay(5000);
// Serial.println("restart");
// /* code */
// }
sdcard::testwriet(); sdcard::testwriet();
sdcard::Mkdir("/up"); sdcard::Mkdir("/up");
sdcard::Mkdir("/down"); sdcard::Mkdir("/down");
sdcard::Mkdir("/other"); sdcard::Mkdir("/other");
sdcard::Mkdir("/gps"); sdcard::Mkdir("/gps");
sdcard::Mkdir("/log"); sdcard::Mkdir("/log");
sdcard::unlock();
beginWIFI(); write_log(log_path,10,log_data);
// sdcard::mylistDir("/",2); // Serial.println(gsmmanger->GetDataAndTime());
Eventgroup = xEventGroupCreate();
if (Eventgroup == NULL)
{ {
Serial.println("create eventgroup failed");
/* code */
} }
xTaskCreatePinnedToCore(
TaskSerialFS, // Function that should be called
"TaskSerialFS", // Name of the task (for debugging)
1000*10, // Stack size (bytes)
NULL, // Parameter to pass
1, // Task priority
NULL, // Task handle
0); // run on core 0
beginWIFI();
// pinMode(21, OUTPUT); // pinMode(21, OUTPUT);
// digitalWrite(21, HIGH); // digitalWrite(21, HIGH);
pinMode(beePin, OUTPUT); pinMode(beePin, OUTPUT);
ledcSetup(BeeChain, 220, 8); // ledcSetup(BeeChain, 220, 8);
ledcAttachPin(beePin, 0); // ledcAttachPin(beePin, 0);
ledcAttach(beePin, 220, 8);
beebee(1000); beebee(1000);
myslave.init(46,45); myslave.init(46,45);
@ -202,6 +298,7 @@ esp_task_wdt_init(20, true);
#endif #endif
IsNetOK = gsmmanger->setpu(); IsNetOK = gsmmanger->setpu();
httpserver = new myHttpServer(); httpserver = new myHttpServer();
gsmmanger->client->setTimeout(20*1000); //设置客户端超时20秒
if (IsNetOK) if (IsNetOK)
{ {
@ -218,6 +315,17 @@ esp_task_wdt_init(20, true);
// Serial.println("start httpserver"+String(httpserver->http->iServerName)); // Serial.println("start httpserver"+String(httpserver->http->iServerName));
String Date = httpserver->getnetData(); String Date = httpserver->getnetData();
//String "1989-03-27 00:00:01";
dateandtime tmtemp;
tmtemp.year=Date.substring(0,4).toInt();
tmtemp.month=Date.substring(5,7).toInt();
tmtemp.day=Date.substring(8,10).toInt();
tmtemp.hour=Date.substring(11,13).toInt();
tmtemp.minute=Date.substring(14,16).toInt();
tmtemp.second=Date.substring(17,19).toInt();
setoffsettime(tmtemp);
if (Date=="error") if (Date=="error")
{ {
Serial.println("getnetData failed,esp_restart"); Serial.println("getnetData failed,esp_restart");
@ -228,6 +336,7 @@ esp_task_wdt_init(20, true);
Serial.println("date is :"+Date); Serial.println("date is :"+Date);
String tem = fenge(Date," ",0); String tem = fenge(Date," ",0);
log_path = "/log/"+tem+".log"; log_path = "/log/"+tem+".log";
setpathforlog(log_path);
log_data = Date+"\r\nSystem starts working."; log_data = Date+"\r\nSystem starts working.";
write_log(log_path,10,""); write_log(log_path,10,"");
write_log(log_path,10,log_data); write_log(log_path,10,log_data);
@ -260,7 +369,7 @@ esp_task_wdt_init(20, true);
vTaskDelay(1000); vTaskDelay(1000);
//////////////////////////////初始化http模块////////////////////////////////////////////// //////////////////////////////初始化http模块//////////////////////////////////////////////
//http = new HttpClient(*gsmmanger->client, "82.156.1.111"); //http = new HttpClient(*gsmmanger->client, "82.156.1.111");
if (IsNetOK) if (IsNetOK)
{ {
ProgrameUper = new UpDateClassByme(httpserver->http1); ProgrameUper = new UpDateClassByme(httpserver->http1);
} }
@ -269,37 +378,103 @@ esp_task_wdt_init(20, true);
IS1Sensor.initSensor(); IS1Sensor.initSensor();
String StationID = IS1Sensor.SensorInfo.serialnumber; String StationID = IS1Sensor.SensorInfo.serialnumber;
String SensorID = IS1Sensor.SensorInfo.SensorName; String SensorID = IS1Sensor.SensorInfo.SensorName;
if (IsNetOK)
{
ProgrameUper->initme(Curentvsion);
ProgrameUper->StationID=StationID;
ProgrameUper->CheckAndUpdate();
write_log(log_path,10,"Http Init Success.");
String Upheader = StationID + "##" + SensorID + "##" + String(IS1Sensor.SensorInfo.BandNum) + "##" + String(IS1Sensor.SensorInfo.a1,9) + ":" + String(IS1Sensor.SensorInfo.a2,9) + ":" + String(IS1Sensor.SensorInfo.a3,9) + ":" + String(IS1Sensor.SensorInfo.a4,9)+"##"+ProgrameUper->CurrentVersion;
Serial.println(Upheader);
httpserver->UpdateData(Http_Sensorinfo_UP_Path, (char *)Upheader.c_str(), Upheader.length());
}
ProgrameUper->initme(Curentvsion);
ProgrameUper->StationID=StationID;
ProgrameUper->CheckAndUpdate();
write_log(log_path,10,"Http Init Success.");
// ProgrameUper->DownloadFirmwareForurl(""); // ProgrameUper->DownloadFirmwareForurl("");
////////////////////////////上传IS1设备信息////////////////////////////////////////////// ////////////////////////////上传IS1设备信息//////////////////////////////////////////////
//////////////////////////////初始化IS1/////////////////////////////////////////////////// //////////////////////////////初始化IS1///////////////////////////////////////////////////
// String Date=getnetData(); // String Date=getnetData();
String Upheader = StationID + "##" + SensorID + "##" + String(IS1Sensor.SensorInfo.BandNum) + "##"
+ String(IS1Sensor.SensorInfo.a1,9) + ":" + String(IS1Sensor.SensorInfo.a2,9) + ":" + String(IS1Sensor.SensorInfo.a3,9) + ":" + String(IS1Sensor.SensorInfo.a4,9)+"##"+ProgrameUper->CurrentVersion;
Serial.println(Upheader);
httpserver->UpdateData(Http_Sensorinfo_UP_Path, (char *)Upheader.c_str(), Upheader.length());
write_log(log_path,10,"IS1 Init ...."); write_log(log_path,10,"IS1 Init ....");
/////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////
// //
httpserver-> http1->stop(); //httpserver-> http1->stop();
ticker.attach(60 * 60, Reuploaddata2);
// ticker.attach(10 * 60, Reuploaddata2);
write_log(log_path,10,"IS1 Init Success."); write_log(log_path,10,"IS1 Init Success.");
/////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////
log_data = "System Init Success"; log_data = "System Init Success";
write_log(log_path,10,log_data); write_log(log_path,10,"-------------------------------------------------system has been restart-----------------------------------------------------");
// Serial.println(gsmmanger->GetDataAndTime());
// --- 转换为毫秒 ---
const uint32_t WATCHDOG_TIMEOUT_MS = WATCHDOG_TIMEOUT_SECONDS * 1000;
// ------------------- 配置 TWDT -------------------
// 1. 定义配置结构体
esp_task_wdt_config_t twdt_config = {
.timeout_ms = WATCHDOG_TIMEOUT_MS, // 设置超时时间(毫秒)
// 监控核心 0 和核心 1 的空闲任务。
// 在 Arduino 环境中,通常 loop() 运行在核心 1 上 (如果启用了双核)
// 核心 0 处理 WiFi/蓝牙/网络栈。监控两者是系统级别的健壮做法。
// (1 << 0) | (1 << 1) == 0b11 == 3
.idle_core_mask = (1 << 0) | (1 << 1),
// 当 TWDT 超时时触发系统复位false而不是触发软件 panictrue
.trigger_panic = false,
};
esp_err_t err = esp_task_wdt_init(&twdt_config);
if (err != ESP_OK) {
Serial.printf("TWDT initialization failed: %s\n", esp_err_to_name(err));
// 如果 TWDT 初始化失败,可能需要重启或报警
return;
}
// 3. 将当前的 loop 任务(运行你的 getDateFromHttp 的任务)添加到 TWDT 监控列表
loopTaskHandle = xTaskGetCurrentTaskHandle();
if (esp_task_wdt_add(loopTaskHandle) != ESP_OK) {
Serial.println("Failed to add loop task to TWDT!");
} else {
Serial.printf("TWDT initialized and monitoring loop task for %d ms (%d s)\n",
WATCHDOG_TIMEOUT_MS, WATCHDOG_TIMEOUT_SECONDS);
}
} }
String lastdate=""; String lastdate="";
dateandtime temnow = {2025, 1, 1, 0, 0, 0};
void loop() void loop()
{ {
if (xEventGroupGetBits(Eventgroup) & STOP_WORK_BIT)
{
Serial.println("system stop work NOW!!");
xEventGroupClearBits(Eventgroup, STOP_WORK_BIT);
xEventGroupWaitBits(Eventgroup, StART_WORK_BIT, pdTRUE, pdFALSE, portMAX_DELAY);
Serial.println("system start work");
/* code */
}
if(xEventGroupGetBits(Eventgroup) & START_MSC_BIT)
{
Serial.println("start msc now");
xEventGroupClearBits(Eventgroup, START_MSC_BIT);
setupmsc();
while (1)
{
vTaskDelay(1000);
esp_task_wdt_reset(); //手动喂狗
/* code */
}
}
String Date; String Date;
/////////////////NOW///////////////////// /////////////////NOW/////////////////////
@ -310,13 +485,15 @@ void loop()
String yuliang = String(myslave.getYuliang()); String yuliang = String(myslave.getYuliang());
delay(1010); delay(1010);
Serial.println("yuliang "+yuliang); // Serial.println("yuliang "+yuliang);
write_log(log_path,10,"getYuliang :"+yuliang); write_log(log_path,10,"getYuliang :"+yuliang);
/////////////////NOW///////////////////// /////////////////NOW/////////////////////
String yuliangfz = String(myslave.getYuliang()); String yuliangfz = String(myslave.getYuliang());
delay(1010); delay(1010);
Serial.println("fuzhao " + yuliangfz); // Serial.println("fuzhao " + yuliangfz);
log_data ="fuzhao :"+yuliangfz; log_data ="fuzhao :"+yuliangfz;
write_log(log_path,10,log_data); write_log(log_path,10,log_data);
@ -328,43 +505,57 @@ void loop()
float TT = (windret[7] * 256 + windret[8]) * 1.0 / 100; float TT = (windret[7] * 256 + windret[8]) * 1.0 / 100;
float HH = (windret[9] * 256 + windret[10]) * 1.0 / 100; float HH = (windret[9] * 256 + windret[10]) * 1.0 / 100;
long PP = (windret[13] * 256 + windret[14]) * 256 * 256 + (windret[11] * 256 + windret[12]); long PP = (windret[13] * 256 + windret[14]) * 256 * 256 + (windret[11] * 256 + windret[12]);
Serial.println("VV:" + String(VV) + "DD:" + String(DD) + "TT:" + String(TT) + "HH:" + String(HH) + "PP:" + String(PP)); //Serial.println("VV:" + String(VV) + "DD:" + String(DD) + "TT:" + String(TT) + "HH:" + String(HH) + "PP:" + String(PP));
write_log(log_path,10,"VV:" + String(VV) + "DD:" + String(DD) + "TT:" + String(TT) + "HH:" + String(HH) + "PP:" + String(PP)); write_log(log_path,10,"VV:" + String(VV) + "DD:" + String(DD) + "TT:" + String(TT) + "HH:" + String(HH) + "PP:" + String(PP));
////////////////////////////NOW/////////////////////////// ////////////////////////////NOW///////////////////////////
String temprature =String(myslave.getMLX()); String temprature =String(myslave.getMLX());
Serial.println("wendu");
Serial.println(temprature);
log_data ="wendu :"+temprature; log_data ="wendu :"+temprature;
write_log(log_path,10,log_data); write_log(log_path,10,log_data);
////sim 循环 ////sim 循环
write_log(log_path,10,"start gsmmanger->loop()"); write_log(log_path,10,"start gsmmanger->loop()");
gsmmanger->loop(); if (IsNetOK)
{
gsmmanger->loop();
}
#ifdef DINBIAO #ifdef DINBIAO
String Datenow1= httpserver->getnetData(); String Datenow1= httpserver->getnetData();
Datenow =fenge(Datenow1, " ", 0) + "_" + fenge(fenge(Datenow1, " ", 1), ":", 0) + "_" + fenge(fenge(Datenow1, " ", 1), ":", 1) + "_" + fenge(fenge(Datenow1, " ", 1), ":", 2); Datenow =fenge(Datenow1, " ", 0) + "_" + fenge(fenge(Datenow1, " ", 1), ":", 0) + "_" + fenge(fenge(Datenow1, " ", 1), ":", 1) + "_" + fenge(fenge(Datenow1, " ", 1), ":", 2);
IS1Sensor.PrintFunc=printbytcp; IS1Sensor.PrintFunc=printbytcp;
#endif #endif
write_log(log_path,10,"start TakeOneJob()"); write_log(log_path,10,"start TakeOneJob()");
esp_task_wdt_reset(); //手动喂狗
IS1Sensor.TakeOneJob(); ////IS1采集一次 IS1Sensor.TakeOneJob(); ////IS1采集一次
String StationID = IS1Sensor.SensorInfo.serialnumber; String StationID = IS1Sensor.SensorInfo.serialnumber;
String SensorID = IS1Sensor.SensorInfo.SensorName; String SensorID = IS1Sensor.SensorInfo.SensorName;
esp_task_wdt_reset(); //手动喂狗
///////////////获取时间 ///////////////获取时间
////////通过GPS获取时间如果获取失败就通过4G访问网页获取。如果获取成功那就对GPS数据进行分割解析出时间。 ////////通过GPS获取时间如果获取失败就通过4G访问网页获取。如果获取成功那就对GPS数据进行分割解析出时间。
String gpsbac; String gpsbac;
for(int i = 0 ;i < 5 ; i++) for(int i = 0 ;i < 5 ; i++)
{ {
write_log(log_path,10,"start getnetData()"); write_log(log_path,10,"start getnetData()");
Date = httpserver->getnetData(); if (IsNetOK)
{
Date = httpserver->getnetData();
}else{
Date="error";
}
if(Date == "error") if(Date == "error")
{ {
write_log(log_path,10,"start get_GPS()"); write_log(log_path,10,"start get_GPS()");
Date = get_GPS(); Date = get_GPS();
if(Date != "-1") if(Date != "-1" & IsNetOK)
{ {
break; break;
if(hassend == 0) if(hassend == 0)
@ -380,7 +571,8 @@ void loop()
// sdcard::WriteStringToFile(nameoffile, temp, lennn); // sdcard::WriteStringToFile(nameoffile, temp, lennn);
} }
else{ else{
Serial.println("Finish Put StationGPSinfo Data");
write_log(log_path,10,"Finish Put StationGPSinfo Data");
} }
delete[] temp; delete[] temp;
@ -392,6 +584,7 @@ void loop()
} }
else else
{ {
Date=getlocaltime();
// break; // break;
} }
@ -408,14 +601,25 @@ void loop()
vTaskDelay(500); vTaskDelay(500);
} }
esp_task_wdt_reset(); //手动喂狗
temnow.year=Date.substring(0,4).toInt();
temnow.month=Date.substring(5,7).toInt();
temnow.day=Date.substring(8,10).toInt();
temnow.hour=Date.substring(11,13).toInt();
temnow.minute=Date.substring(14,16).toInt();
temnow.second=Date.substring(17,19).toInt();
setoffsettime(temnow);
write_log(log_path,10,"Date is : "+Date); write_log(log_path,10,"Date is : "+Date);
// delay(15000); // delay(15000);
if (fenge(Date, " ", 0)!=lastdate) if (fenge(Date, " ", 0)!=lastdate)
{ {
lastdate=fenge(Date, " ", 0); lastdate=fenge(Date, " ", 0);
log_path = "/log/"+lastdate+".log"; log_path = "/log/"+lastdate+".log";
setpathforlog(log_path);
myslave.claeryuliang(); myslave.claeryuliang();
ProgrameUper->CheckAndUpdate(); if(IsNetOK)
{ ProgrameUper->CheckAndUpdate();}
} }
@ -442,31 +646,51 @@ void loop()
{ {
//temp[Upheader.length()+i]=str[i]; //temp[Upheader.length()+i]=str[i];
} }
Serial.println("lenth of up data is "+String(lennn)); // Serial.println("lenth of up data is "+String(lennn));
write_log(log_path,10,"lenth of up data is "+String(lennn));
memcpy(temp + Upheader.length(), IS1Sensor.UpData,IS1Sensor.SensorInfo.BandNum * 2); memcpy(temp + Upheader.length(), IS1Sensor.UpData,IS1Sensor.SensorInfo.BandNum * 2);
bool flagsucc = httpserver->UpdateData(Http_Sepctral_Path, temp, lennn); bool flagsucc = httpserver->UpdateData(Http_Sepctral_Path, temp, lennn);
//输出前100个字节 字符 //输出前100个字节 字符
esp_task_wdt_reset(); //手动喂狗
// Serial.println("temp is :");
// Serial.write(temp, 100);
// write_log(log_path,10,"temp is :");
Serial.println("temp is :"); // for (int i = 0; i < 100 && i < lennn; i++)
Serial.write(temp, 100); // {
// Serial.print(temp[i], HEX);
// Serial.print(" ");
// }
String log_temp="temp is :";
for (int i = 0; i < 100 && i < lennn; i++) for (int i = 0; i < 100 && i < lennn; i++)
{ {
Serial.print(temp[i], HEX); log_temp+=String(temp[i], HEX)+" ";
Serial.print(" ");
} }
write_log(log_path,10,log_temp);
vTaskDelay(3000); vTaskDelay(3000);
if (!flagsucc) if (!flagsucc)
{ {
//计算md5并保存 为读取时判断数据是否正确
MD5Builder md5my;
md5my.begin();
md5my.add((uint8_t *)temp, lennn);
md5my.calculate();
String md5string = md5my.toString();
sdcard::lock();
sdcard::WriteStringToFile(Upname, temp, lennn); sdcard::WriteStringToFile(Upname, temp, lennn);
log_data ="Up_data upload failed,save to SD."; sdcard::WriteStringToFile(Upname + ".md5", (char *)md5string.c_str(), md5string.length());
sdcard::unlock();
log_data ="Up_data upload failed,save to SD. md5 is"+md5string;
write_log(log_path,10,log_data); write_log(log_path,10,log_data);
} }
else else
{ {
Serial.println("finish Put Up Data");
write_log(log_path,10,"finish Put Up Data");
log_data ="finish Put Up Data."; log_data ="finish Put Up Data.";
write_log(log_path,10,log_data); write_log(log_path,10,log_data);
} }
@ -475,7 +699,7 @@ void loop()
//////////////////////上传Down数据////////////////// //////////////////////上传Down数据//////////////////
write_log(log_path,10,"put dowm data"); write_log(log_path,0,"put dowm data");
lennn = IS1Sensor.SensorInfo.BandNum * 2 + Downheader.length(); lennn = IS1Sensor.SensorInfo.BandNum * 2 + Downheader.length();
temp = new char[lennn]; temp = new char[lennn];
memcpy(temp, Downheader.c_str(), Downheader.length()); memcpy(temp, Downheader.c_str(), Downheader.length());
@ -485,22 +709,38 @@ void loop()
{ {
// temp[Downheader.length()+i]=str[i]; // temp[Downheader.length()+i]=str[i];
} }
Serial.println("lenth of down data is "+String(lennn));
write_log(log_path,10,"lenth of down data is "+String(lennn));
memcpy(temp + Downheader.length(), IS1Sensor.DownData,IS1Sensor.SensorInfo.BandNum * 2); memcpy(temp + Downheader.length(), IS1Sensor.DownData,IS1Sensor.SensorInfo.BandNum * 2);
flagsucc = httpserver->UpdateData(Http_Sepctral_Path, temp, lennn); flagsucc = httpserver->UpdateData(Http_Sepctral_Path, temp, lennn);
esp_task_wdt_reset(); //手动喂狗
vTaskDelay(3000); vTaskDelay(3000);
//输出前100个 String log_temp1="down data is :";
Serial.println("temp is :"); for (int i = 0; i < 100 && i < lennn; i++)
Serial.write(temp, 100); {
log_temp1+=String(temp[i], HEX)+" ";
}
write_log(log_path,0,log_temp1);
if (!flagsucc) if (!flagsucc)
{ {
//计算md5并保存 为读取时判断数据是否正确
MD5Builder md5my;
md5my.begin();
md5my.add((uint8_t *)temp, lennn);
md5my.calculate();
String md5string = md5my.toString();
sdcard::lock();
sdcard::WriteStringToFile(Downname, temp, lennn); sdcard::WriteStringToFile(Downname, temp, lennn);
log_data ="Down_data upload failed,save to SD."; sdcard::unlock();
sdcard::WriteStringToFile(Downname + ".md5", (char *)md5string.c_str(), md5string.length());
log_data ="Down_data upload failed,save to SD. md5 is"+md5string;
write_log(log_path,10,log_data); write_log(log_path,10,log_data);
}else{ }else{
Serial.println("finish Put Down Data");
log_data ="finish Put Down Data."; log_data ="finish Put Down Data.";
write_log(log_path,10,log_data); write_log(log_path,10,log_data);
} }
@ -512,24 +752,73 @@ void loop()
memcpy(temp, senderID.c_str(), senderID.length()); memcpy(temp, senderID.c_str(), senderID.length());
memcpy(temp + senderID.length(), windret + 3, 12); memcpy(temp + senderID.length(), windret + 3, 12);
flagsucc = httpserver->UpdateData(Http_Wind_Path, temp, lennn, "application/json"); flagsucc = httpserver->UpdateData(Http_Wind_Path, temp, lennn, "application/json");
esp_task_wdt_reset(); //手动喂狗
vTaskDelay(3000); vTaskDelay(3000);
if (!flagsucc) if (!flagsucc)
{ {
// 计算md5并保存 为读取时判断数据是否正确
MD5Builder md5my;
md5my.begin();
md5my.add((uint8_t *)temp, lennn);
md5my.calculate();
String md5string = md5my.toString();
sdcard::lock();
sdcard::WriteStringToFile(othername, temp, lennn); sdcard::WriteStringToFile(othername, temp, lennn);
log_data ="put Other Data failed,save to SD."; sdcard::WriteStringToFile(othername + ".md5", (char *)md5string.c_str(), md5string.length());
sdcard::unlock();
log_data="other_data upload failed.save to sd";
write_log(log_path,10,log_data); write_log(log_path,10,log_data);
}else{ }else{
Serial.println("finish Put Other Data");
log_data ="finish Put Other Data."; log_data ="finish Put Other Data.";
write_log(log_path,10,log_data); write_log(log_path,10,log_data);
} }
delete[] temp; delete[] temp;
if (0)
{
String onelinestr="";
onelinestr="date:"+Date+",upshutter:"+String(IS1Sensor.shutterup)+",downshutter:"+String(IS1Sensor.shutterdown)+",StationID:"+StationID+"\n";
String fodernamer=fenge(Date, " ", 0);
sdcard::lock();
sdcard::Mkdir("/Data");
sdcard::Mkdir("/Data/"+fodernamer);
sdcard::unlock();
onelinestr+="UPDN,";
for (size_t i = 0; i < IS1Sensor.SensorInfo.BandNum; i++)
{
onelinestr+=String(IS1Sensor.UpData[i*2]*256+IS1Sensor.UpData[i*2+1]);
if (i!=IS1Sensor.SensorInfo.BandNum-1)
{
onelinestr+=",";
}
}
onelinestr+="\n";
onelinestr+="DOWNDN,";
for (size_t i = 0; i < IS1Sensor.SensorInfo.BandNum; i++)
{
onelinestr+=String(IS1Sensor.DownData[i*2]*256+IS1Sensor.DownData[i*2+1]);
if (i!=IS1Sensor.SensorInfo.BandNum-1)
{
onelinestr+=",";
}
}
onelinestr+="\n";
sdcard::lock();
sdcard::WriteStringToFile("/Data/"+fodernamer+"/"+datestring+".csv", (char *)onelinestr.c_str(), onelinestr.length());
sdcard::unlock();
}
//结束并等待一定时间 //结束并等待一定时间
// http->stop(); delay(100);return; // http->stop(); delay(100);return;
esp_task_wdt_reset(); //手动喂狗
delay(120000); delay(120000);
esp_task_wdt_reset(); //手动喂狗
#ifdef DINBIAO #ifdef DINBIAO
abort(); abort();
ESP.restart(); ESP.restart();

View File

@ -46,7 +46,7 @@ struct STRSensorInfo
#define GET_WAVELENGTH_CALIBRATION_COFF 0x55 #define GET_WAVELENGTH_CALIBRATION_COFF 0x55
#define GET_STAT_OF_LAMPOUT 0x60 #define GET_STAT_OF_LAMPOUT 0x60
#define SET_GPIO 0x61 #define SET_GPIO 0x61
#define byte u_char #define byte uint8_t

View File

@ -110,6 +110,7 @@ size_t UpDateClassByme::DownloadFirmwareForurl(String version)
void UpDateClassByme::initme(String Version) void UpDateClassByme::initme(String Version)
{ {
Serial.println("CurrentVersion is:"+Version);
CurrentVersion=Version; CurrentVersion=Version;
} }

View File

@ -115,7 +115,8 @@ void onRequest() {
} }
void onReceive(int len) { void onReceive(int len) {
Serial.printf("onReceive[%d]: ", len); //Serial.printf("onReceive[%d]: ", len);
Serial.println("onReceive:["+String(len)+"] ");
while (Wire.available()) { while (Wire.available()) {
Serial.write(Wire.read()); Serial.write(Wire.read());
} }
@ -124,7 +125,8 @@ void onReceive(int len) {
void onReceive111(size_t len) { void onReceive111(size_t len) {
Serial.printf("onReceive[%d]: "); // Serial.printf("onReceive[%d]: ");
Serial.println("onReceive111:["+String(len)+"] ");
while (Wire.available()) { while (Wire.available()) {
Serial.write(Wire.read()); Serial.write(Wire.read());
} }