• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Нужна помощь ESP8266 данные датчиков новой строкой.

Oleeeg

New member
1 webString=" Temperature: "+String(sensors.getTempCByIndex(0))+" C "+String(h,DEC)+":"+String(m,DEC)+":"+String(s,DEC)+" ";
2 server.send(200, "text/plain", webString);

Подскадите плиз, сейчас пользуюсь вот этой функцией, но нужно, чтобы на страничке хтмл значения накапливались и каждые 10 минут строчкой ниже появлялся новый замер, как это реализовать?

Нашел вот этот оператор, вроде как он может решить проблему, но не догоняю как им пользоваться endSendWithNewline(true);
 

olegmsn

New member
Это не тот оператор.

Надо сохранять строчки на сервере или на клиенте.

на сервере надо писать чтото типа
Код:
init {
webString = ""
}
loop{
  webString += " newline \r\n"
 server.send(200, "text/plain", webString)
}
На клиенте - надо просто в странице на джаваскрипте нарисовать массив и туда добавлять строки
 

Oleeeg

New member
Вы почти волшебник))

newline
Temperature: 30.06 C 0:0:50 newline
Temperature: 30.12 C 0:0:55 newline
Temperature: 30.50 C 0:1:26 newline
Temperature: 30.56 C 0:1:51 newline
Temperature: 30.62 C 0:1:59 newline
Temperature: 30.62 C 0:2:2 newline
Temperature: 30.62 C 0:2:5 newline
Temperature: 30.62 C 0:2:7 newline
Temperature: 30.62 C 0:2:10 newline
Temperature: 30.62 C 0:2:13 newline
Temperature: 30.62 C 0:2:16 newline
Temperature: 30.69 C 0:2:25 newline
Temperature: 30.69 C 0:2:28 newline
Temperature: 30.69 C 0:2:32 newline
Temperature: 29.00 C 0:2:52 newline
Temperature: 26.25 C 0:4:13 newline
Temperature: 26.19 C 0:4:15 newline
Temperature: 26.12 C 0:4:17 newline
Temperature: 26.12 C 0:4:20
 

Oleeeg

New member
Единственное.....он новую строку пишет при обновлении страницы....пока не совсем догоняю как это работает.....и что сделать, чтобы он добавлял эту строчку сам каждые 5 минут...
 

olegmsn

New member
А еще надо подумать о том, что переменная webString не резиновая.....
и через некоторое время оно упадет. Поэтому надо время от времени укорачивать переменную.
чето типа
Код:
if (webString.length() > 200 ) {
  webString = webString.substring(100);
}
хелп по substring тут:
Arduino - StringSubstring
 

Oleeeg

New member
А еще надо подумать о том, что переменная webString не резиновая.....
и через некоторое время оно упадет. Поэтому надо время от времени укорачивать переменную.
чето типа
Код:
if (webString.length() > 200 ) {
  webString = webString.substring(100);
}
хелп по substring тут:
Arduino - StringSubstring
то есть она запишет только определенное количество байт?
 

olegmsn

New member
по умолчанию да - там или память закончится или размер String.
 

Oleeeg

New member
по умолчанию да - там или память закончится или размер String.
Что флеш память закончится, я еще бы мог догадаться, но у есп 4 метра, даже если выделить 1 метр, то можно долго данные снимать,
а про ограничение памяти в string пока нигде информации не нашел, курю мануал с оф. сайта....
 

olegmsn

New member
4мб это флеш. переменные хранятся в оперативной памяти.
кучи у меня свободно гдето 30кб. стринги в куче выделяются
оно после компиляции пишет
Код:
Глобальные переменные используют 47 740 байт (58%) динамической памяти, оставляя 34 180 байт для локальных переменных. Максимум: 81 920 байт.
Посмотреть свободную память можно командой

Код:
ESP.getFreeHeap()
наверное дето можно увеличить размер... но там помоему не намного
 
Последнее редактирование:

Oleeeg

New member
4мб это флеш. переменные хранятся в оперативной памяти.
кучи у меня свободно гдето 30кб. стринги в куче выделяются
оно после компиляции пишет
Код:
Глобальные переменные используют 47 740 байт (58%) динамической памяти, оставляя 34 180 байт для локальных переменных. Максимум: 81 920 байт.
Посмотреть свободную память можно командой

Код:
ESP.getFreeHeap()
наверное дето можно увеличить размер... но там помоему не намного
В моем случае это не критично, я сделал 60 замеров, вес файла чуть больше 2,5кб, порядка трехсот-пятисот замеров хватит для решения задачи.
 

Oleeeg

New member
В моем случае это не критично, я сделал 60 замеров, вес файла чуть больше 2,5кб, порядка трехсот-пятисот замеров хватит для решения задачи.
Все равно, большое спасибо, это будет метод оперативного съема инфо, а для лог использую, пожалуй , сд карту, так как там чуть проще и более знакомо.....
Единственно было бы круто записывать все замеры на сд и выводить их в виде хтмл при подключении....
 

olegmsn

New member
на SD просто записывается файл, а веб сервер его просто выводит. тут не проблема.
проблема в том, что если в неудачный момент снять питание - информация на SD может улететь.
можно подпереть по питанию все это дело конденсатором/ионистором и мониторить когда пропало питание и при пропавшем не писать)
или поставить индустриальную флешку.... но там цена не гуманная....
 

VicSpectator

New member
А что будет, если запрашивать информацию по таймеру в javascript, то есть AJAX? С интервалом времени больше минуты я бы не рискнул, наверное.
ИМХО, наилучшим вариантом было бы завести массив с кольцевым режимом записи и выводить на страничку все элементы массива. И refrash настроить у странички.
 

Oleeeg

New member
Я потихоньку умнею)) Когда размер файла достигнет больше 30кб вся система нафиг рухнет...
Оказывается не так много нужно, чтобы система рухнула....

Код:
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
const char *ssid = "a";
const char *password = "88888888";
ESP8266WebServer server(80);
/*  http://192.168.4.1 in a web browser*/

#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 2
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
String webString = "";
#include <SPI.h>
#include <SD.h>
long id=1;
void setup() {
//инициализируем SD карту, если не удачно то выводим в USART ошибку инициализации
//если удачно, то выводим сообщение что все ОК
Serial.begin(115200);
Serial.println();
  Serial.print("Configuring access point...");
  WiFi.softAP(ssid, password);
  IPAddress myIP = WiFi.softAPIP();
  Serial.print("AP IP address: ");
  Serial.println(myIP);
  server.on("/", handleRoot);
  server.begin();
  Serial.println("HTTP server started");
  sensors.begin();
if (!SD.begin(15)) {
    Serial.println("SD не запущена !");
    return;
  }
  Serial.println("SD запущена успешно!");

File Logcsv = SD.open("logcsv.csv", FILE_WRITE );
  String Title = String(id)+ ","+ String("t1")+","+String("t2")+","+String("t3")+","+String("t4")+","+String("t5");
if (Logcsv)
{
  Logcsv.println(",,,,");
  Logcsv.println(Title);
  Logcsv.close();
  Serial.println(Title);
}
else
{
  Serial.println("Не могу записать данные в csv");
}
File Loghtm = SD.open("loghtm.htm", FILE_WRITE );
if (Loghtm)
{
  Loghtm.println(",,,,");
  Loghtm.println(Title);
  Loghtm.close();
  Serial.println(Title);
}
else
{
  Serial.println("Не могу записать данные в csv");
}
}
void loop()
{



  server.handleClient();
  sensors.requestTemperatures(); // Send the command to get temperatures 
}

void handleRoot()
{
int time=millis()/1000;
int h =(((time/60)/60)%60);
if (h<0){h=0;}
int s =(time%60);
int m =((time/60)%60);
if (m<0){m=0;}
File Logcsv = SD.open("logcsv.csv", FILE_WRITE );
String TempAll = String(id)+ ","+ String(sensors.getTempCByIndex(0))+","+String("t2")+","+String("t3")+","+String("t4")+","+String("t5") +String(h,DEC)+":"+String(m,DEC)+":"+String(s,DEC);
if (Logcsv)
{
  Logcsv.println(TempAll);
  Logcsv.close();
  Serial.println(TempAll);
}
else
{
  Serial.println("Не могу записать данные в csv");
}
File Loghtm = SD.open("loghtm.htm", FILE_WRITE );
if (Loghtm)
{
  Loghtm.println(TempAll);
  Serial.println(TempAll);
}
else
{
  Serial.println("Не могу записать данные в csv");
}
id++;
delay(2000);




// цикл для построчного чтения файла с SD карты и отправки данных в браузер

    while (Loghtm.available()) {  // пока не достигнем конца файла
      char buff = Loghtm.read();  //читаем символ из файла
     webString += buff;                  //добавляем прочитанный символ к строке
       server.send(200, "text/plain", webString);            // send to someones browser when asked
      Serial.print(webString);        
      }
     
     
  Loghtm.close();                 // закрываем файл на SD карте
  delay(2000);


}
Пока получил что-то вроде этого, но, если я правильно понимаю, то считывать инфу он будет каждый раз заново, что очень долго....
Второй момет, что оператива умрет через пару часов.....как быть
 

Oleeeg

New member
Еще никак не догоню как добавляют Client
Покурил азы HTTP и даже что-то понял

client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println();
client.println("<!DOCTYPE html>");
client.println("<html lang=\"ru\">");
client.println("<head>");
client.println("<meta charset=\"UTF-8\">");
client.println("<title>Home</title>");
client.println("</head>");
client.println("<body>");
client.println("Устройство:");
client.println("<br>");
client.println("<a href=\"?p=0\">Выкл</a>");
client.println(" <a href=\"?p=1\">Вкл</a>");
client.println("</body>");
client.println("</html>");

Но в моем коде, так как точка доступа могу пользоваться только командой send, а хочу client, но где-то в простой вещи не понимаю что нужно сделать....
 
Сверху Снизу