Исторически
![Very Happy :D](./images/smilies/icon_e_biggrin.gif)
сложилось , что на странице графиков отображается и история событий в системе.
Для начала надо создать файлы на карте. Для этого на главной вкладке в самом начале добавляем два модуля
Код: Выделить всё
#define SD_MESSAGE_FEATURE
#define TLOG_FEATURE
Затем переменные для сообщений
Код: Выделить всё
// Durations
time_t prevEventElectroCycle;
time_t prevEventMegaLive;
time_t prevEventRequest;
//Alarm text
String AlarmLog = "";
//Log text
String DataLog = "";
// Переменная для текста сообщения
String MessText = "";
// Переменная для текста chart
String MesText = "";
// Переменная для типа сообщения
String Info = "информационное";
String Alarm = "аварийное";
Для отображения модуля в Dash панели
Код: Выделить всё
byte moduleMt1132 = NOT_COMPILLED;
byte moduleNrf24 = NOT_COMPILLED;
byte moduleTlog = NOT_COMPILLED;
В Setup инициализируем новые вкладки
В Loop
Во вкладке Abstract добавить
Код: Выделить всё
void printInitDone() {
timeStamp(); Serial.print(F("GLOBAL Init DONE (")); Serial.print(millis() / 1000); Serial.println(F("s)"));
Serial.println();
timeStamp(); Serial.print(F("AMS WORK ")); printFreeMem(); Serial.println();
MessText = "Перезапуск AMS";
MessLoger(String (MessText), String(Info));
}
// Abstract Works
теперь добавим новые вкладки в код
sd_messageКод: Выделить всё
/*
Modul Message ver 0.1
part of Arduino Mega Server project
Модуль архивных сообщений
для Ардуино Мега Сервер
*/
/* Создает запись в файле *.msg
* Необходимо передать функции:
* MessText - название сообщения
* MessType - тип сообщения
*/
void MessLoger(String MessText, String MessType){
// собираем Имя путь и имя файла
String MessName;
//MessName+="/Alarm/";
if(day()<10)
MessName+="0"+String(day(),DEC);
else
MessName+=String(day(),DEC);
if(month()<10)
MessName+="-0"+String(month(),DEC);
else
MessName+="-"+String(month(),DEC);
MessName+="-"+String(year()-2000,DEC);
//MessName+=".csv";
MessName+=".msg";
// File logfile = SD.open("/gotdata.css", "a", FILE_WRITE);
File file = SD.open(String (MessName), FILE_WRITE);
if(file){
if(day() < 10) {file.print('0');}
file.print(String (day()));
file.print("-");
if(month() < 10) {file.print('0');}
file.print(String (month()));
file.print("-");
file.print( String (year()));
file.print(",");
if(hour() < 10) {file.print('0');}
file.print( String (hour()));
file.print(":");
if(minute() < 10) {file.print('0');}
file.print(String (minute()));
file.print(":");
if(second() < 10) {file.print('0');}
file.print(String (second()));
file.print(",");
file.print( String (MessText));
file.print(",");
file.println( String (MessType));
file.close();
}
else{}
}
tlog
Код: Выделить всё
/*
Module TLOG DUE
part of Arduino Mega Server project
*/
/*
Модуль создаёт два файла :
1 "Gotdata.css" для страницы "Chart.htm". Автор идеи и кода Ledmax.
2 "/день-месяц-год/.log" для страницы "Graf.htm". Автор кода Ser009.
Страницу "Graf_1.htm" создал Alexsis_76.
*/
#ifdef TLOG_FEATURE
void TlogInit() { // Инициализируем модуль
moduleTlog = MODULE_ENABLE; // Если модуль активен
started("TLog"); // Старт модуля
}
void TlogWorks(){
if(cycle5m){ // Каждые 5 минут записываем данные
// собираем Имя путь и имя файла
String Mess1Name;
//MessName+="/Alarm/";
if(day()<10)
Mess1Name+="0"+String(day(),DEC);
else
Mess1Name+=String(day(),DEC);
if(month()<10)
Mess1Name+="-0"+String(month(),DEC);
else
Mess1Name+="-"+String(month(),DEC);
Mess1Name+="-"+String(year()-2000,DEC);
Mess1Name+=".log";
File dataFile = SD.open(String (Mess1Name), FILE_WRITE); // Открываем файл для записи логов страницы "Graf.htm"
if (dataFile) { // Если удалось открыть файл
dataFile.println(logString()); // Записываем строку логов в файл
dataFile.close(); // Закрываем файл
}else // Если не удалось открыть файл
Serial.println("Can't open file"); // Выводим сообщение об ошибке
}
//================================================================================================
if(cycle5m){ // Каждые 5 минут записываем данные
File dataFile = SD.open("gotdata.css", FILE_WRITE); // Открываем файл для записи логов для страницы "Chart.htm"
if (dataFile) { // Если удалось открыть файл
dataFile.println(logString()); // Записываем строку логов в файл
dataFile.close(); // Закрываем файл
}else // Если не удалось открыть файл
Serial.println("Can't open file"); // Выводим сообщение об ошибке
}
}
String logString() { // Функция для генерации логов
String dataString = String (year()) + "-" + String (month()) + "-" + String (day()) + " " + String (hour()) + ":" + String (minute()) + ":" + String (second())+ " " + ","
+ String (current_temp[0]) + "," + String (current_temp[1]) + "," + String (current_temp[2]) + "," + String (dht.readHumidity()) + "," + String (dht.readTemperature())+ " " + ","
+ String (temp) + "," + String (hum) + "," + String (pres); // Помещаем дату и температуру в новую строку логов ( можно добавить еще данных. 6 штук работают уверенно )
Serial.println(dataString); // Выводим строку логов на монитор серийного порта
return(dataString); // Возвращаем полученные значения в место вызова функции
}
#endif // DATALOG_FEATURE
После этого в сериал порту должна появиться запись о создании файла и добавлении данных каждые 5 минут.
Код: Выделить всё
2018-11-20 21:16:12 ,0.00,0.00,0.00, nan, nan , nan, nan, nan
Так как датчики не подключены, записываются нулевые или пустые данные.
Если это увидели, поздравляю - файл создан и пошла запись в лог.
Теперь браузеру надо объяснить, что у нас появились новые типы файлов. За это отвечает вкладка server_ajax . Добавляем по смыслу
Код: Выделить всё
void sendCssAnswer (EthernetClient cl) {cl.println(makeAnswer(F("text/css")));}
void sendCsvAnswer (EthernetClient cl) {cl.println(makeAnswer(F("text/csv")));}
void sendLogAnswer (EthernetClient cl) {cl.println(makeAnswer(F("text/log")));}
void sendMsgAnswer (EthernetClient cl) {cl.println(makeAnswer(F("text/msg")));}
void sendTxtAnswer (EthernetClient cl) {cl.println(makeAnswer(F("text/plain")));}
void sendSvgAnswer (EthernetClient cl) {cl.println(makeAnswer(F("image/svg")));}
и чтобы не было ошибки
Код: Выделить всё
else if (StrContains(HTTP_req, ".xml")) {if (openWebFile()) {sendXmlAnswer(cl);} else {sendErrorAnswer("", cl);}}
else if (StrContains(HTTP_req, ".csv")) {if (openWebFile()) {sendCsvAnswer(cl);} else {sendErrorAnswer("", cl);}}
else if (StrContains(HTTP_req, ".log")) {if (openWebFile()) {sendLogAnswer(cl);} else {sendErrorAnswer("", cl);}}
else if (StrContains(HTTP_req, ".msg")) {if (openWebFile()) {sendMsgAnswer(cl);} else {sendErrorAnswer("", cl);}}
else if (StrContains(HTTP_req, ".svg")) {if (openWebFile()) {sendSvgAnswer(cl);} else {sendErrorAnswer("", cl);}}
новый модуль
Код: Выделить всё
s += makeTag(F("mNrf24"), "", String(moduleNrf24));
---------------------------------------------------------------------------
s += makeTag(F("mTlog"), "", String(moduleTlog));
На этом со скетчем вроде бы всё
![Surprised :o](./images/smilies/icon_e_surprised.gif)
( если ничего не забыл ). Можно перейти непосредственно к файлам.
Первым делом в текстовом редакторе создаем файл DESCR.TXT , где через запятую перечисляем названия наших графиков так , как потом на странице они будут называться . Пишите свои названия.
- Серверная,Кухня,Улица,Влажность DHT,Температура DHT,Температура BME,Влажность BME,Давление BME
Файлы из архива просто закиньте на SD карту. Во избежание ошибок записи лучше это сделать руками.
PS/ Уфф...Все это я делал на Due и ESP32. На Меге это работает , но очень долго загружается библиотека.
Огромное спасибо всем принимавшим участие в создании этого чуда !