Вот если честно - Вы ожидаете, что кто-то будет эти сотни строк у себя в голове прокручивать, чтобы понять, где стек пропарывает кучу?
я подозреваю, что когда String инициируется строкой с нечетным числом кавычек, в памяти начинается бардак. а твое мнение?
У меня нет никакого мнения, ибо программная проблема может быть усугублена неудачно подобранной библиотекой и кривым монтажом. При таком объеме кода и уровне подготовки автора можно полгода переписываться, в итоге обнаружив высохший конденсатор в БП. Без сборки макета только случайно отыщется баг.
И при нечетном числе кавычек, равно как и скобок, компилятор вывалится в ошибку.
Именно так и сделано. Я не знаю почему при переносе кода на форум эти кавычки "портятся".
С не прикрытыми кавычками компилятор ошибки выдаёт.
ОК, тогда начните с того, что добавьте макррос F() во все строчки длиной более 5-7 символов и посмотрите,насколько станет больше свободной памяти.
В остальном я согласен с Садман41 - к сожалению, вы себя так зарекомендовали, что я категорически не доверяю вашим спсобностям программировать, поэтому ошибка (и далеко не одна) может быть где угодно, вообще на ровном месте
Вот если честно - Вы ожидаете, что кто-то будет эти сотни строк у себя в голове прокручивать, чтобы понять, где стек пропарывает кучу?
я подозреваю, что когда String инициируется строкой с нечетным числом кавычек, в памяти начинается бардак. а твое мнение?
У меня нет никакого мнения, ибо программная проблема может быть усугублена неудачно подобранной библиотекой и кривым монтажом. При таком объеме кода и уровне подготовки автора можно полгода переписываться, в итоге обнаружив высохший конденсатор в БП. Без сборки макета только случайно отыщется баг. И при печатном числе кавычек, равно как и скобок, компилятор вывалился в ошибку.
Все (!) соединения на пайке, каждый модуль шунтирован электролитом и керамикой, БП трансформаторный с линейным стабилизатором (не импульсный преобразователь). Осциллограф показывает идеальную форму питания, равно как и форму импульсов на SPI. Уровни импульсов тоже 5 и 3,2 вольта.
Именно так и сделано. Я не знаю почему при переносе кода на форум эти кавычки "портятся".
С не прикрытыми кавычками компилятор ошибки выдаёт.
ОК, тогда начните с того, что добавьте макррос F() во все строчки длиной более 5-7 символов и посмотрите,насколько станет больше свободной памяти.
В остальном я согласен с Садман41 - к сожалению, вы себя так зарекомендовали, что я категорически не доверяю вашим спсобностям программировать, поэтому ошибка (и далеко не одна) может быть где угодно, вообще на ровном месте
Я код и так сократил - повырезал всё не участвующее. Остались только части связанные с этими тремя модулями.
Лично я бы в такой ситуации, при наличии подозрений на железо, сделал бы скетч, в котором работа со всей периферией была активной, но простой - типа постоянного чтения\установки статусов. Если проблема действительно в сочетании комплектующих - новый скетч повиснет так же быстро.
Евгений, автор все равно не знает ответа. Давайте я за него.
Мне кажется что строки 116-118 написана по аналогии со строкой 115. То есть, собственно это и есть определение переменных типа String. А что, разве тут ошибка? Скобки, конечно, лишние, а больше никаких проблем не вижу.
Используются эти переменные в строках 397 - 408... в блоке отправки СМС, ныне закомментированном
Напрасно. Вопрос-то был на самом деле такой: "стоит ли напрягаться и пытаться тебе помогать - или тебе только готовый скетч поможет?". Я надеялся получить ясный ответ от ТС :-(
Вопрос-то был на самом деле такой: "стоит ли напрягаться и пытаться тебе помогать - или тебе только готовый скетч поможет?"
о том, что ТС полный дуп и "программирование не его" - я ему в ветке уже раза три написал. Я уже скорее не ему помогаю, мне просто любопытно, сколько же еще невообразимых ляпов он насажал в этом, нехитром вообще-то, коде...
Вот этот скетч с участием модулей SD и W5500 проработал всю ночь. При подключении модуля LoRa виснет. Сам модуль на SX1278 у меня старый, состояние его не известно - откопал с каких-то прежних пректов. RA-01 я благополучно спалил (их было два у меня - один стоит в банном модуле на DUE, у другого случилась коза по питанию). Сейчас из Китая жду новые, скоро должны быть. Может модуль этот старый больной?....
#include <SD.h>
#include <RH_RF95.h>
#include <Ethernet2.h>
#include <SPI.h>
// ------------------------- сеть ---------------------------------
byte mac[] = {0x2C, 0xF7, 0xF1, 0x08, 0x00, 0x9A};
IPAddress ip(192, 168, 1, 6);
EthernetServer server(756);
// ------------------------- LoRa ---------------------------------
RH_RF95 rf95(48, 2); // (SS, interrupt) внимательно с выводом прерывания на Ардуине!
uint32_t data[5]; // Создаём массив для приёма данных - 32 разряда, тк передатчик DUE
//------------------------- температура --------------------------
bool frchtd = false; // флаг разрешения чтения с дисплея "сброса"
bool newdata = false;
bool Century = false;
bool h12;
bool PM;
bool td = false; // флаг разрешения обработки данных датчика температуры в доме
bool fwdt = true; // флаг WDT
bool fsd = true; // флаг однократности вывода "данные устарели"
byte m, s, h, d, M; // переменные даты и времени
int Y = 2000;
bool fscht; // флаг разрешения суммирования при чтении с дисплея
bool BanTM = false; // флаг наличия данных из бани
bool Zu = false; // флаг печати значка SD-карты на дисплей
bool fp = false; // флаг разрешения сброса раз в сутки
bool fa = true; // флаг для однократности сработывания аварии
int celsius1, celsius2, celsius3; // температура в доме
float celsgis = 100; // промежуточная темп. для прохождения гистерезиса
int toutside = 0; // температура на улице с датчика влажности
int tPred; // переменная для проверки перехода с одного разряда на два и обратно при печати ул. температуры на дисплей
int p; // давление
int hum; // влажность на улице
int ch; // переменная для вычитывания буфера Nextion
int val; // строка из дисплея
int i;
float tuprm; // считанное значение уличной температуры
float huprm; // считанное значение уличной влажности
float dvl; // считанное значение атм. давления
bool gisalarm;
float toutsidegis = 100; // переменная для гистерезиса
unsigned long mln = 300000; // период синхронизации с GPS (сначала ч/з 5 минут (считывание альманаха при перв вкл, потом раз в 7 сут. (604800000)
unsigned long sinhr; // переменная в мсек задающ. период синхронизации
unsigned long za; // переменная в мсек задающ. задержку на сработывание аварии (2 мин, искл. ложных срабатываний)
unsigned long zadavar; // переменная в мсек задающ. период синхронизации
unsigned long start; // переменная в мсек задающ. цикл считывания данных gps
unsigned long registr; // переменная в мсек для таймера регистратора
unsigned long dvt = 3000; // период измерения давл. вл. и температуры (нач. 5 сек, потом раз в минуту)
unsigned long dvtperiod; // переменная в мсек для таймера измерен. давл.вл и у.темп.
unsigned long loraperiod; // переменная таймера проверки приёма LoRa
unsigned long swi = millis(); // перенная для смены фона на сайте ТМ данных
unsigned long treg = 290000; // период записи регистратора 5 мин (переменная на 10 сек меньше - догоняет остаток от деления =0)
unsigned long tperiod; // переменная в мсек для таймера обработки измерен. темп. в доме
unsigned long nadisplei; // переменная в мсек для таймера вывода на дисплей
unsigned long disp = 50; // период таймера вывода на дисплей, нач. 1 сек, потом 10 сек.
unsigned long olddata; // переменная
unsigned long pwdt; // переменная для WDT
unsigned long time, date; // переменные для считыв. даты и времени для вычисления "пустой" даты
float gis = 0.2; // гистерезис температуры и влажности
float pgis, hgis; // вспомогательная переменная для гистерезиса влажн. и давления
String pch = ""; // переменная для вывода на дисплей
String SMSOUT = ""; // текстовая переменная "номер для смс"
int db1; // темпеатура парной
int db2; // темпеатура комната бани
int db3; // темпеатура т. пола бани
int db4; // нагрев (0 - нет, 1 - нагрев)
int db5; // CRC с LoRa
int d1; // темпеатура выход котла К-->
int d2; // темпеатура вход котла (обратка) K<--
int d5; // темпеатура выход на ТП
int d6; // темпеатура вход с ТП (обратка)
int d7; // темпеатура бойлера
int d8; // давление системы водоснабжения
int d9; // давление системы отопления
int d81, d82, d91, d92; // промеж. параметры для отобр. гидро давления в СМС
int d10; // темпеатура в котельной
int d11; // темпеатура в гараже
int d12; // темпеатура скважины
int d13; // расход фильтра Мех.
int d14; // расход фильтра Ca Mg.
int d15; // расход фильтра Fe.
int ttt;
//File myFile;
// ------------------------------------------------------ setup --------------------------------------------------------------
void setup() {
Serial.begin(9600);
Serial1.begin(9600); // порт GPS
Serial2.begin(9600); // порт Nextion
Serial3.begin(9600); // порт SIM800
pinMode(48, OUTPUT); // CS LoRa
pinMode(49, OUTPUT); // CS W5500
pinMode(47, OUTPUT); // CS SD
pinMode(53, OUTPUT); // штатный CS не используется
//pinMode(33, OUTPUT); // выход на WDT
digitalWrite(47, HIGH);
digitalWrite(48, HIGH);
digitalWrite(49, HIGH);
digitalWrite(53, HIGH);
//digitalWrite(33, LOW);
SPI.begin;
//SPI.setClockDivider(SPI_CLOCK_DIV16);
Ethernet.begin(mac, ip);
server.begin();
SD.begin(47); // инициализация модуля SD карты
rf95.init(); // инициализация SX1278
rf95.setTxPower(5, false); // мощность 5 - 23, максимальная мощность (при 23) 100мВт (шаги с 5 по 23 не подряд! смотреть в библиотеке)
//void clearRxBuf();
Serial.print(F("server is at "));
Serial.println(Ethernet.localIP());
}
// ==========================================================================================================================
// ============================================================ L O O P =====================================================
void loop() {
ttt++;
if (ttt > 1000) {
Serial.println(millis());
ttt = 0;
}
// -------------------------------------------- LoRa ------------------------------------------------------------
/*
if (rf95.available()) {
rf95.recv((uint8_t*)data, sizeof(data));
}
*/
// -------------------------------------------------- SD карта ------------------------------------------------------------------------------
SDcard();
// -------------------------------------------------- Сеть ------------------------------------------------------------------
html();
} // -------------------------- конец LOOP ------------------------------
// --------------------------------------------------------------------
//================================================================================================================================
//================================================================================================================================
//=================================== Пишем страницу html ============================================
void html()
{
EthernetClient client = server.available();
if (client) {
client.println(F("HTTP/1.1 200 OK"));
client.println(F("Content-Type: text/html"));
client.println(F("Connection: close")); // the connection will be closed after completion of the response
client.println(F("Refresh: 15")); // обновление страницы через 60 сек
client.println();
client.println(F("<!DOCTYPE HTML>"));
client.println("<html>"); //------------------------------------- Пишем страницу ------------------------------------
client.println("<head>");
client.println(F("<meta charset=\"UTF-8\">")); // Установка кодировки
client.println(F("<title>п.Залесье, ул.Осенняя, д.00</title>"));
client.println("</head>");
if (millis() - swi < 60000) { //1800000 3600000 5400000 7200000 9000000 10800000 12600000 14400000
client.println(F("<body background=https://wmpics.pics/di-TW62.jpg><font color=\"WHITE\">")); // из мурманска в Питер
}
if (millis() - swi > 60000 && millis() - swi < 120000) {
client.println(F("<body background=https://wmpics.pics/di-EAI35.jpg><font color=\"WHITE\">")); // разлив Ишима
}
if (millis() - swi > 120000 && millis() - swi < 180000) {
client.println(F("<body background=https://wmpics.pics/di-M3D9.jpg><font color=\"WHITE\">")); // полуостров ночью
}
if (millis() - swi > 180000 && millis() - swi < 240000) {
client.println(F("<body background=https://wmpics.pics/di-7QFR2.jpg><font color=\"WHITE\">")); // Санрайз 2
}
if (millis() - swi > 240000 && millis() - swi < 300000) {
client.println(F("<body background=https://wmpics.pics/di-5QQV.jpg><font color=\"WHITE\">")); // Санрайз
}
if (millis() - swi > 300000 && millis() - swi < 360000) {
client.println(F("<body background=https://wmpics.pics/di-T3D0.jpg><font color=\"WHITE\">")); // в открытом море
}
if (millis() - swi > 360000 && millis() - swi < 420000) {
client.println(F("<body background=https://wmpics.pics/di-9GCF.jpg><font color=\"WHITE\">")); // колокольня в Калязине
}
if (millis() - swi > 420000 && millis() - swi < 480000) {
client.println(F("<body background=https://wmpics.pics/di-I4U1.jpg>")); // ромашковое поле
}
if (millis() - swi > 480000) {
swi = millis();
}
client.println(F("<div style=\"position: absolute; top: 42px; left: 90px\">")); // блок Котельная
client.println(F("<h1>Котельная:</h1>"));
client.println(F("<h2>Котёл подача: ")); client.println(d1); client.println("°"); client.println("<br />");
client.println(F("Котёл возврат: ")); client.println(d2); client.println("°"); client.println("<br />");
client.println(F("Тёплый пол подача:")); client.println(d5); client.println("<br />");
client.println(F("Тёплый пол возврат:")); client.println(d6); client.println("°"); client.println("<br />");
client.println(F("Бойлер:")); client.println(d7); client.println("°"); client.println("<br />");
//client.println(F("Давление отопления:")); client.println(d9p); client.println("Bar."); client.println("<br />");
client.println(F("Давление водоснабж.:")); client.println("Bar."); client.println("<br />");
client.println("</h2></div>");
client.println(F("<div style=\"position: absolute; top: 42px; left: 500px\">")); // блок Температурные параметры
client.println(F("<h1>Температурные параметры:</h1>"));
client.println(F("<h2>Температура на улице: ")); client.println(toutside); client.println("°"); client.println("<br />");
client.println(F("Влажность: ")); client.println(hum); client.println("%"); client.println("<br />");
client.println(F("Атмосф. давление:")); client.println(p); client.println(F("мм.рт.ст.")); client.println("<br /><br />");
client.println(F("Дом:")); client.println(celsius1); client.println("°"); client.println("<br />");
client.println(F("Вход:")); client.println(celsius2); client.println("°"); client.println("<br />");
client.println(F("Гараж:")); client.println(d11); client.println("°"); client.println("<br />");
client.println(F("Котельная:")); client.println(d10); client.println("°"); client.println("<br />");
client.println(F("Скважина:")); client.println(d12); client.println("°"); client.println("</div>");
client.println(F("<div style=\"position: absolute; top: 42px; left: 980px\">")); // блок Баня
client.println(F("<h1>Баня:</h1>"));
if (BanTM) {
client.println(F("<h2>Парная: ")); client.println(db1); client.println("°"); client.println("<br />");
client.println(F("Комната: ")); client.println(db2); client.println("°"); client.println("<br />");
client.println(F("Тёплый пол:")); client.println(db3); client.println("°"); client.println("<br />");
if (db4 != 0) {
client.println(F("<p><font color=\"red\">Нагрев включен</font></p>"));
}
else {
client.println(F("<br />Нагрев выключен"));
}
}
else {
client.println(F("<h2>Нет данных</h2>"));
}
client.println("</div>");
client.println(F("<div style=\"position: absolute; top: 42px; left: 1230px\">")); // блок Расход фильтров
client.println(F("<h1>Фильтры:</h1>"));
client.println(F("<h2>Мех.: ")); client.println(F(" ")); client.println(d12); client.println("%"); client.println("<br />");
client.println(F("Ca Mg: ")); client.println(" "); client.println(d14); client.println("%"); client.println("<br />");
client.println(F("Fe:")); client.println(F(" ")); client.println(d15); client.println("%"); client.println("<br />");
client.println("</div>");
/*
if (frchtd) {
client.println(F("<div style=\"position: absolute; top: 420px; left: 400px\">")); // Авария
client.println(F("<h1><p><blink><font color=\"red\">АВАРИЯ! АВАРИЯ! АВАРИЯ! АВАРИЯ! АВАРИЯ!</font></blink></p></h1>")); client.println("</div>");
}
*/
client.println("</html>"); //------------------------- Закончили страницу -------------------------------
delay(50);
client.stop();
Serial.println(millis());
}
}
// -------------------------------------------------- SD карта ------------------------------------------------------------------------------
void SDcard()
{
//if ((millis() - registr) > treg && m % 5 == 0) { // таймер для записи регистратора на 5 мин и кратно 5 мин.
if ((millis() - registr) > 10000) {
String logStringData = ""; // формирование строки с данными
String Bm = ""; // переменная для минут меньше 10, чтобы минуты на дисплее были с нулём
if (m < 10) {
Bm = "0" + String(m);
}
else {
Bm = String(m);
}
String Bh = ""; // переменная для часов меньше 10, чтобы часы на дисплее были с нулём
if (h < 10) {
Bh = "0" + String(h);
}
else {
Bh = String(h);
}
// формируем строку с данными
logStringData = "; Темп. скв. jhlkuytjhgkjhfuyrtedoytpiojhkljho876rtytgfljh";
//Serial.println(logStringData);
String DirectName = "20" + String(Y) + "/" + String(M); // Создаём имя папки из месяца и года
String logStringName = DirectName + "/" + String(d) + ".txt"; // формируем текстовый файл на один день максимум 12 знаков в названии файла
//Serial.println (logStringName);
if (SD.mkdir(DirectName)) { // создаём на SD указанную территорию, может включать в себя вложенные папки, разделенные прямым слешем "/"
// Открываем файл, Если файла с таким именем не будет, ардуино создаст его.
File dataFile = SD.open(logStringName, FILE_WRITE);
// Если все хорошо, то записываем строку:
if (dataFile) {
dataFile.println(logStringData); // в файл записываем строку данных с переводом строки
dataFile.close(); // закрываем файл
//SendDataP("page0.p1.pic", 3); // ЗЕЛЁНЫЙ значёк
Serial.println(F("Запись прошла на SD"));
Zu = true; // флаг для печати нужного значка в цикле печати
}
else {
//SendDataP("page0.p1.pic", 4); // КРАСНЫЙ значёк
Serial.println(F("Ошибка записи на SD!"));
Zu = false; // флаг для печати нужного значка в цикле печати
}
registr = millis();
}
}
}
я подозреваю, что когда String инициируется строкой с нечетным числом кавычек, в памяти начинается бардак. а твое мнение?
на самом деле в коде вот так, просто когда вы вставляете в форум, часть строки вырезается
и тут просто дофига не прикрытых кавычек.
Нужно абсолютно все кавычки внутри строки оформить так, как записано "WHITE":
Именно так и сделано. Я не знаю почему при переносе кода на форум эти кавычки "портятся".
С не прикрытыми кавычками компилятор ошибки выдаёт.
я подозреваю, что когда String инициируется строкой с нечетным числом кавычек, в памяти начинается бардак. а твое мнение?
У меня нет никакого мнения, ибо программная проблема может быть усугублена неудачно подобранной библиотекой и кривым монтажом. При таком объеме кода и уровне подготовки автора можно полгода переписываться, в итоге обнаружив высохший конденсатор в БП. Без сборки макета только случайно отыщется баг.
И при нечетном числе кавычек, равно как и скобок, компилятор вывалится в ошибку.
Именно так и сделано. Я не знаю почему при переносе кода на форум эти кавычки "портятся".
С не прикрытыми кавычками компилятор ошибки выдаёт.
ОК, тогда начните с того, что добавьте макррос F() во все строчки длиной более 5-7 символов и посмотрите,насколько станет больше свободной памяти.
В остальном я согласен с Садман41 - к сожалению, вы себя так зарекомендовали, что я категорически не доверяю вашим спсобностям программировать, поэтому ошибка (и далеко не одна) может быть где угодно, вообще на ровном месте
я подозреваю, что когда String инициируется строкой с нечетным числом кавычек, в памяти начинается бардак. а твое мнение?
Все (!) соединения на пайке, каждый модуль шунтирован электролитом и керамикой, БП трансформаторный с линейным стабилизатором (не импульсный преобразователь). Осциллограф показывает идеальную форму питания, равно как и форму импульсов на SPI. Уровни импульсов тоже 5 и 3,2 вольта.
Именно так и сделано. Я не знаю почему при переносе кода на форум эти кавычки "портятся".
С не прикрытыми кавычками компилятор ошибки выдаёт.
ОК, тогда начните с того, что добавьте макррос F() во все строчки длиной более 5-7 символов и посмотрите,насколько станет больше свободной памяти.
В остальном я согласен с Садман41 - к сожалению, вы себя так зарекомендовали, что я категорически не доверяю вашим спсобностям программировать, поэтому ошибка (и далеко не одна) может быть где угодно, вообще на ровном месте
Я код и так сократил - повырезал всё не участвующее. Остались только части связанные с этими тремя модулями.
С макросами так и сделал уже.
С макросами так и сделал уже.
насколько прибавилось памяти?
Прибавилось прилично - было свободно 1607 байт, сейчас 3287
Добил остальные принты - свободно стало 4174
Лично я бы в такой ситуации, при наличии подозрений на железо, сделал бы скетч, в котором работа со всей периферией была активной, но простой - типа постоянного чтения\установки статусов. Если проблема действительно в сочетании комплектующих - новый скетч повиснет так же быстро.
точно огромный HTML с картинками надо бы выкинуть.
Да, так и сделаю, но это уже завтра, спасибо.
точно огромный HTML с картинками надо бы выкинуть.
Выкидывал! - та же хрень...
Сейчас с освободившимся ОЗУ ещё раз убрал HTML (печатает одну надпись на странице без картинок) - посмотрю как будет
Нет, виснет. Заметил - если в скетче есть Serial.print то работает дольше, если скетч маслает без задержек, то "конец" наступает гораздо быстрее......
Я код и так сократил - повырезал всё не участвующее. Остались только части связанные с этими тремя модулями.
С макросами так и сделал уже.
И где он? Новый код?
Вот...
А что написано в строках №№ 116-118?
И где определены используемые там переменные?
В блоке "SIM800" для отправки смс с телеметрией.
Евгений, убегаю на работу, буду ближе к вечеру.
Не понял ответа, в каком блоке, у него номера строк есть? И первая часть вопроса осталась без ответа - что там вообще написано?
Евгений, автор все равно не знает ответа. Давайте я за него.
Мне кажется что строки 116-118 написана по аналогии со строкой 115. То есть, собственно это и есть определение переменных типа String. А что, разве тут ошибка? Скобки, конечно, лишние, а больше никаких проблем не вижу.
Используются эти переменные в строках 397 - 408... в блоке отправки СМС, ныне закомментированном
Вопрос-то был на самом деле такой: "стоит ли напрягаться и пытаться тебе помогать - или тебе только готовый скетч поможет?"
о том, что ТС полный дуп и "программирование не его" - я ему в ветке уже раза три написал. Я уже скорее не ему помогаю, мне просто любопытно, сколько же еще невообразимых ляпов он насажал в этом, нехитром вообще-то, коде...
Не понял ответа, в каком блоке, у него номера строк есть? И первая часть вопроса осталась без ответа - что там вообще написано?
Используются в строках 397-416, 418
Понятно, значит вопрос о том, "что именно там написано" Вы проигнорировали уже во второй раз. Ладно, хозяин - барин.
Присвоение идёт в этих же строках - 397-416
Вы про то что при объявлении не указано что в них?
String s1 = "", s2 = "", s3 = "", s4 = "", s5 = "", s6 = "", s7 = "", s8 = "", s9 = "", s10 = "", s11 = "", s12 = "", s13 = "", s14 = "", s15 = "", s16 = "";
Так правильно?
Вот этот скетч с участием модулей SD и W5500 проработал всю ночь. При подключении модуля LoRa виснет. Сам модуль на SX1278 у меня старый, состояние его не известно - откопал с каких-то прежних пректов. RA-01 я благополучно спалил (их было два у меня - один стоит в банном модуле на DUE, у другого случилась коза по питанию). Сейчас из Китая жду новые, скоро должны быть. Может модуль этот старый больной?....
Может модуль этот старый больной?....
Не обманывай себя, Маша, ты беременна...