Указатели и оператор разыменования - срабатывает watch dogs, ESP8266
- Войдите на сайт для отправки комментариев
Ср, 15/04/2020 - 23:47
Нарыл куски кода в интернетах, скрестил адресные светодиоды (аналог WS2812) с MQTT. Планы были по MQTT переключать разные режимы, сделать некое сигнализируещее цветовое табло. Вот творение:
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
//++++++++++++++++++++++++++++++
#include <Adafruit_NeoPixel.h>
#define LED_PIN 5
#define LED_COUNT 12
#define NUMPIXELS 12 //
Adafruit_NeoPixel strip(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel pixels(NUMPIXELS, LED_PIN, NEO_GRB + NEO_KHZ800);
//++++++++++++++++++++++++++++++
#define wifi_ssid "111"
#define wifi_password "#12345678#"
#define mqtt_server "192.168.1.15"
#define mqtt_port 1885
#define mqtt_user "Sup"
#define mqtt_password "2222"
#define mqtt_client_name "Soooo"
#define GPIO4 4
int msgString = 0;
int *msgString_ptr = &msgString;
WiFiClient espClient;
PubSubClient client(espClient);
void callback(char *command_01, byte *payload, unsigned int length)
{
char buff_p[length];
for (int i = 0; i < length; i++)
{
//Serial.println((char)payload[i]);
buff_p[i] = (char)payload[i];
}
buff_p[length] = '\0';
String msg_p = String(buff_p);
int msgString = msg_p.toInt(); // to Int
*msgString_ptr = msgString;
Serial.println(msgString);
}
void BlinkRED(){
if (msgString == 1)
{
digitalWrite(GPIO4, HIGH);
pixels.clear();
pixels.setPixelColor(0, pixels.Color(0, 255, 0)); //RED
pixels.setPixelColor(1, pixels.Color(0, 255, 0));
pixels.setPixelColor(2, pixels.Color(0, 255, 0));
pixels.setPixelColor(3, pixels.Color(0, 255, 0));
pixels.setPixelColor(4, pixels.Color(0, 255, 0));
pixels.setPixelColor(5, pixels.Color(0, 255, 0));
pixels.setPixelColor(6, pixels.Color(0, 255, 0)); //RED
pixels.setPixelColor(7, pixels.Color(0, 255, 0));
pixels.setPixelColor(8, pixels.Color(0, 255, 0));
pixels.setPixelColor(9, pixels.Color(0, 255, 0));
pixels.setPixelColor(10, pixels.Color(0, 255, 0));
pixels.setPixelColor(11, pixels.Color(0, 255, 0));
pixels.show();
delay(50);
pixels.clear();
pixels.show();
delay(50);
}
}
void BlinkGREEN(){
if (msgString == 2)
{
digitalWrite(GPIO4, HIGH);
pixels.setPixelColor(0, pixels.Color(255, 0, 0)); //RED
pixels.setPixelColor(1, pixels.Color(255, 0, 0));
pixels.setPixelColor(2, pixels.Color(255, 0, 0));
pixels.setPixelColor(3, pixels.Color(255, 0, 0));
pixels.setPixelColor(4, pixels.Color(255, 0, 0));
pixels.setPixelColor(5, pixels.Color(255, 0, 0));
pixels.setPixelColor(6, pixels.Color(255, 0, 0)); //RED
pixels.setPixelColor(7, pixels.Color(255, 0, 0));
pixels.setPixelColor(8, pixels.Color(255, 0, 0));
pixels.setPixelColor(9, pixels.Color(255, 0, 0));
pixels.setPixelColor(10, pixels.Color(255, 0, 0));
pixels.setPixelColor(11, pixels.Color(255, 0, 0));
pixels.show();
}
}
void ledOff(){
if (msgString == 0)
{
pixels.clear();
pixels.show();
digitalWrite(GPIO4, LOW);
}
}
//=================================================================================
//=================================================================================
void setup(void)
{
Serial.begin(115200);
pinMode(GPIO4, OUTPUT);
client.setCallback(callback);
/////////////////////////////////////////////////////
setup_wifi();
client.setServer(mqtt_server, mqtt_port);
/////////////////////////////////////////////////////
//++++++++++++++++++++++++++++++
strip.begin(); // INITIALIZE NeoPixel strip object (REQUIRED)
strip.show(); // Turn OFF all pixels ASAP
strip.setBrightness(10); // Set BRIGHTNESS to about 1/5 (max = 255)
pixels.begin(); // INITIALIZE NeoPixel strip object (REQUIRED)
//++++++++++++++++++++++++++++++
}
void setup_wifi() {
delay(10);
// We start by connecting to a WiFi network
Serial.println();
Serial.print("Connecting to ");
Serial.println(wifi_ssid);
WiFi.begin(wifi_ssid, wifi_password);
while (WiFi.status() != WL_CONNECTED) {
// blink_red();
delay(480);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
}
//////////////////////////////////////////////////////////////////////////////////////
void reconnect() {
// Loop until we're reconnected
while (!client.connected()) {
Serial.println("Attempting MQTT connection.....");
if (client.connect(mqtt_client_name, mqtt_user, mqtt_password)) {
Serial.println("MQTT connected");
client.subscribe("SetAlarm/command_01");
} else {
Serial.print("Connect failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
// Wait 5 seconds before retrying
// blink_red();
delay(200);
//blink_red();
delay(4760);
}
}
}
void loop(void)
{
if (!client.connected()) {
reconnect();
}
client.loop();
BlinkRED();
ledOff();
BlinkGREEN();
}
И даже всё работает, при отправке команды в топик SetAlarm/command_01 единицы, диоды мерцают красным, когда двойку - горят зелёным, ноль выключает...
Но есть непонятная проблема. Хаотично и непонятно отчего и как ESP12S "вылетает" в перезагрузку. Иногда просто зависает и не восстанавливает рабочий режим. Изредка отваливается MQTT, она постоянно пытается подключиться, но не подключается, при этом лог сервера вообще не видит никакой активности и никаких запросов на подключение.
Лог в консоли огромен и поток шеснадцатеричных данных ниочем не скажет, поэтому приведу сразу расшифровку этого мракобесия:
Decoding stack results 0x4020c5b1: memp_free at core/memp.c line 447 0x401001dc: ets_post(uint8, ETSSignal, ETSParam) at C:\Users\��\Desktop\arduino-1.8.12_MQTT ard\portable\packages\esp8266\hardware\esp8266\2.6.1\cores\esp8266\core_esp8266_main.cpp line 159 0x401001dc: ets_post(uint8, ETSSignal, ETSParam) at C:\Users\��\Desktop\arduino-1.8.12_MQTT ard\portable\packages\esp8266\hardware\esp8266\2.6.1\cores\esp8266\core_esp8266_main.cpp line 159 0x4020be51: glue2esp_linkoutput at glue-esp/lwip-esp.c line 301 0x4020c0ed: new_linkoutput at glue-lwip/lwip-git.c line 265 0x4020c4f8: ethernet_output at netif/ethernet.c line 312 0x4020be51: glue2esp_linkoutput at glue-esp/lwip-esp.c line 301 0x40213a58: etharp_output_to_arp_index at core/ipv4/etharp.c line 770 0x4020c0de: new_linkoutput at glue-lwip/lwip-git.c line 260 0x40213cac: etharp_output_LWIP2 at core/ipv4/etharp.c line 885 0x402154a0: ip4_output_if_opt_src at core/ipv4/ip4.c line 1764 0x4020be51: glue2esp_linkoutput at glue-esp/lwip-esp.c line 301 0x40100728: umm_free_core(void*) at C:\Users\��\Desktop\arduino-1.8.12_MQTT ard\portable\packages\esp8266\hardware\esp8266\2.6.1\cores\esp8266\umm_malloc\umm_malloc.cpp line 316 0x401009b3: free(void*) at C:\Users\��\Desktop\arduino-1.8.12_MQTT ard\portable\packages\esp8266\hardware\esp8266\2.6.1\cores\esp8266\umm_malloc\umm_malloc.cpp line 362 0x40215f98: mem_malloc at core/mem.c line 210 0x40215fb8: mem_free at core/mem.c line 237 0x4020fdce: pbuf_free_LWIP2 at core/pbuf.c line 786 0x40210b5f: tcp_output_control_segment at core/tcp_out.c line 1956 0x40100728: umm_free_core(void*) at C:\Users\��\Desktop\arduino-1.8.12_MQTT ard\portable\packages\esp8266\hardware\esp8266\2.6.1\cores\esp8266\umm_malloc\umm_malloc.cpp line 316 0x401009b3: free(void*) at C:\Users\��\Desktop\arduino-1.8.12_MQTT ard\portable\packages\esp8266\hardware\esp8266\2.6.1\cores\esp8266\umm_malloc\umm_malloc.cpp line 362 0x40211308: tcp_rst at core/tcp_out.c line 2011 0x40215fb8: mem_free at core/mem.c line 237 0x4020c5b1: memp_free at core/memp.c line 447 0x4020c6b0: tcp_free at core/tcp.c line 217 0x40100728: umm_free_core(void*) at C:\Users\��\Desktop\arduino-1.8.12_MQTT ard\portable\packages\esp8266\hardware\esp8266\2.6.1\cores\esp8266\umm_malloc\umm_malloc.cpp line 316 0x401009b3: free(void*) at C:\Users\��\Desktop\arduino-1.8.12_MQTT ard\portable\packages\esp8266\hardware\esp8266\2.6.1\cores\esp8266\umm_malloc\umm_malloc.cpp line 362 0x4020bd09: operator delete(void*) at /workdir/repo/gcc/libstdc++-v3/libsupc++/del_op.cc line 48 0x40204e31: uart_write(uart_t*, char const*, size_t) at C:\Users\��\Desktop\arduino-1.8.12_MQTT ard\portable\packages\esp8266\hardware\esp8266\2.6.1\cores\esp8266\uart.cpp line 509 0x40202952: WiFiClient::connect(IPAddress, unsigned short) at C:\Users\��\Desktop\arduino-1.8.12_MQTT ard\portable\packages\esp8266\hardware\esp8266\2.6.1\libraries\ESP8266WiFi\src\WiFiClient.cpp line 173 0x402035c0: HardwareSerial::write(unsigned char const*, unsigned int) at C:\Users\��\Desktop\arduino-1.8.12_MQTT ard\portable\packages\esp8266\hardware\esp8266\2.6.1\cores\esp8266/HardwareSerial.h line 159 0x402035cc: HardwareSerial::write(unsigned char const*, unsigned int) at C:\Users\��\Desktop\arduino-1.8.12_MQTT ard\portable\packages\esp8266\hardware\esp8266\2.6.1\cores\esp8266/HardwareSerial.h line 160 0x402035c0: HardwareSerial::write(unsigned char const*, unsigned int) at C:\Users\��\Desktop\arduino-1.8.12_MQTT ard\portable\packages\esp8266\hardware\esp8266\2.6.1\cores\esp8266/HardwareSerial.h line 159 0x40203899: Print::write(char const*) at C:\Users\��\Desktop\arduino-1.8.12_MQTT ard\portable\packages\esp8266\hardware\esp8266\2.6.1\cores\esp8266/Print.h line 60 0x402039a5: Print::printNumber(unsigned long, unsigned char) at C:\Users\��\Desktop\arduino-1.8.12_MQTT ard\portable\packages\esp8266\hardware\esp8266\2.6.1\cores\esp8266\Print.cpp line 260 0x40205a24: PubSubClient::connected() at C:\Users\��\Desktop\arduino-1.8.12_MQTT ard\portable\sketchbook\libraries\PubSubClient\src\PubSubClient.cpp line 606 0x40204e31: uart_write(uart_t*, char const*, size_t) at C:\Users\��\Desktop\arduino-1.8.12_MQTT ard\portable\packages\esp8266\hardware\esp8266\2.6.1\cores\esp8266\uart.cpp line 509 0x40204e31: uart_write(uart_t*, char const*, size_t) at C:\Users\��\Desktop\arduino-1.8.12_MQTT ard\portable\packages\esp8266\hardware\esp8266\2.6.1\cores\esp8266\uart.cpp line 509 0x40203fc0: esp_yield() at C:\Users\��\Desktop\arduino-1.8.12_MQTT ard\portable\packages\esp8266\hardware\esp8266\2.6.1\cores\esp8266\core_esp8266_main.cpp line 100 0x4020457f: __delay(unsigned long) at C:\Users\��\Desktop\arduino-1.8.12_MQTT ard\portable\packages\esp8266\hardware\esp8266\2.6.1\cores\esp8266\core_esp8266_wiring.cpp line 54 0x40201406: reconnect() at C:\Users\Ыц\Desktop\arduino-1.8.12_MQTT ard\!__fw\New_progekt_mqtt_s_nulya_04/New_progekt_mqtt_s_nulya_04.ino line 152 0x4020142a: loop() at C:\Users\Ыц\Desktop\arduino-1.8.12_MQTT ard\!__fw\New_progekt_mqtt_s_nulya_04/New_progekt_mqtt_s_nulya_04.ino line 162 0x402040f0: loop_wrapper() at C:\Users\��\Desktop\arduino-1.8.12_MQTT ard\portable\packages\esp8266\hardware\esp8266\2.6.1\cores\esp8266\core_esp8266_main.cpp line 179
И для удобства в графическом виде:

Я пробовал разные версии ядра ESP8266, разные версии IDE. Я пробовал залить это в другую железуку, в ESP07S, ошибка аналогична.
А теперь вероятная причина - скорее всего это из-за использования конструкции
int msgString = 0;
int *msgString_ptr = &msgString;
Когда я убрал этот метод, а код из void BlinkRED(), void BlinkGREEN(), void ledOff() поместил в цикл void callback(), то в течение двух суток всё работало без проблем вообще. Никаких вылетов, реконнектов и прочего. Конечно, есть вероятность что просто так совпало, но мне не верится, слишком долго продержалось, обычно проблемы возникают или сразу, или через 10\30\60 минут и повторяются с хаотичной периодичностью.
Я лазил по тем файлам, что в репорте обозначены, но в них разобраться мне не под силу.
Библиотеки стандартные, установлены из Arduino IDE
Adafruit_NeoPixel v.1.3.5 https://github.com/adafruit/Adafruit_NeoPixel
Правильно ли я работаю с указателями? Какие способы есть передать значение переменной из одного цикла в другой, сделать локальную переменную глобальной? Или как это вообще делается? Всё взять и засунуть в void callback() как-то не удобно, там будет оочень много кода, который к тому же должен вызываться и из других мест и циклов.
Кто видит где ошибка в коде?
Картинка лога: https://sun9-43.userapi.com/c206516/v206516600/ec18c/o0cJFMGkJAQ.jpg
С указателями ты работаешь не правильно, но проблема не в этом. Указатель в этом коде не делает ничего и его можно спокойно удалять.
С указателями ты работаешь не правильно, но проблема не в этом. Указатель в этом коде не делает ничего и его можно спокойно удалять.
Ну как так не делает? Ещё как делает. Коряво, может быть, но всё же работает. А именно, с помощью него, я из функции меняю значение переменной, а другая функция это значение может получить. Или есть способ проще, которым я могу из одной функции (а внутри функции у нас переменные ЛОКАЛЬНЫЕ и мы можем их хранит и менять только в пределах этой функции) передать значение в другую? Растолкуйте.
Ну другими словами как я могу из
voidcallbackзапустить на выполнение кодvoidBlinkRED()?А именно, с помощью него, я из функции меняю значение переменной, а другая функция это значение может получить.
Нет. В коде буквально ничего не изменится, если удалить все строчки, упоминающие этот указатель.
Нет. В коде буквально ничего не изменится, если удалить все строчки, упоминающие этот указатель.
Так. Я вот прям сейчас взял код из первого поста, прям именно то, что я выложил. Вставил в IDE, залил. Код прекрасно работает (ну заисключением указанных проблем). Ну конечно учётные данные я ввел реальные на WiFi и MQTT.
И далее я удалил из кода лишь строку № 038
И код перестал работать.
Итого, уважаемый rkit, либо вы меня тролите, а я потерял около 15 минут, либо не компетентны, либо не верно оценили код, хотя учитывая с какой настойчивостью вы ответили этот вариант я опускаю.
37 строку замени на
msgString = msg_p.toInt()37 строку замени на
msgString = msg_p.toInt()Сделал. Залил. Работает. Это просто вы доглядели, или оно могло вызывать сбой? Пока сбоев нет. Оставлю до утра, потом гляну логи. А вдруг помогло...
P.S. Нет. Снова вылет, только короткий репорт:
И снова...
Причём делать ничего не нужно. Просто включил, и через какое-то время начинает падать.
Sirocco,
Вы "распахиваете" память. При распашке памяти внешние симптомы проблемы могут быть какие угодно и может казаться, что виноваты вещи, которые не при делах вовсе.
Давайте устранять ошибки по мере их нахождения (найдя одну - устранять, перепроверять, а уж потом искать другие).
Итак, первая ошибка работы с памятью совершенно очевидна. В строке №35 Вы пишете за границу массива. Массив, объявленный как в строке №29 имеет элементы с 0-го по length-1, а Вы куда пишете?
Исправляйте. Если проблема не уйдёт, выкладывайте текущий код и пишите как на этот раз проявляется.
Знаете как просто и безопасно исправить?
P.S. И, да, rkit прав в том, что если Вы удалите из своего кода строки №№ 22 и 38 а строку №37 перепишете как msgString = msg_p.toInt(); то в программе абсолютно ничего не изменится - вообще ничего. Сделайте это сразу, зачем плодить лишние действия, которые Вы, к тому же, неуверенно понимаете? Ещё раз повторяю - это не исправит ошибок и не внесёт новых - просто ничего не изменится.
P.S. И, да, rkit прав в том, что если Вы удалите из своего кода строки №№ 22 и 38 а строку №37 перепишете как msgString = msg_p.toInt(); то в программе абсолютно ничего не изменится - вообще ничего. Сделайте это сразу, зачем плодить лишние действия, которые Вы, к тому же, неуверенно понимаете? Ещё раз повторяю - это не исправит ошибок и не внесёт новых - просто ничего не изменится.
Да, чёрт побери. Так и есть.
Знаете как просто и безопасно исправить?
Нет. Но буду гуглить...
Нет. Но буду гуглить...
не знаете как поправить размер массива?
не знаете как поправить размер массива?
Дык откуда. Я ж так и написал, стырил два кода, скрестил... вот и получилось.
Нет. Но буду гуглить...
Проще в строке №30 вместо length написать length+1.
(это мне не гугл, а импортозамещающая Алиса подсказала :-)
Делал так
И так
И так
Как правильно? Но в любом случае от вылетов не помогло.
Делал так
И так
И так
Фига-се?
Т.е. Вы тычетесь методом тыка вообще не понимая, что делаете?
Делайте так, как Вам сказано:
в строке №30 вместо length написать length+1.
Если проблема не уйдёт, выкладывайте текущий код и пишите как на этот раз проявляется.
Sirocco, а попытаться хоть чуть-чуть понять, как это работает - понималки не хватает? ии лень?
Фига-се?
Т.е. Вы тычетесь методом тыка вообще не понимая, что делаете?
Нет, блин. Мне просто весело, сижу развлекаюсь методом тыка.
Вы вообще серьёзно это? Вы думаете все люди во всех профессиях спецы? Или думаете, что я вот прям сейчас всё брошу и засяду за изучение программирования, прям с самых основ, перечитаю кучу статей, изучу книги? Правда? Я спрашиваю, чтоб мне указали на ошибку, я спрашиваю как её решить. Если б я понимал что делаю, поверьте, ваши советы мне были бы не нужны. Вот только не надо ради когото (это я о себе) идти и гуглить, изучать проблему, и т.д. Я спрашиваю только тех людей, которые знают что делать, или предполагают, хотя бы. Я полагаю, (сужу по себе) что им не сложно будет ответить, да даже кусок кода написать. Какая в этом проблема, если всё знаешь? А если не знаешь, или просто жуть как трудно, то вас никто не принуждает. Не нервничайте, не тратьте время, ступайте себе дальше, займитесь чем-то полезным.
Sirocco, а попытаться хоть чуть-чуть понять, как это работает - понималки не хватает? ии лень?
Предлагаю либо по делу, либо никак. К моему вопросу это не относится. Для "бла бла бла" есть лавочка возле подъеза или разделы типа "курилка" и "флейм".
Sirocco, а нафига вы тогда за это взялись? Что-то программировать, сидеть, тратить кучу времени? Если вам не интересен процесс - купите готовое.
Думаю. если вы будете настаивать на том. что вам самому ни в чем разбираться не нужно и кто-то, "кому не в лом", должен вам написать код - вы выбрали неправильный форум. Тут вам, скорее всего, не обломится...
Предлагаю либо по делу, либо никак.
нет уж. извините. буду писать то. что считаю нужным.
В качестве ответа - предлагаю вам не указывать мне, что мне делать.
Да делайте что хотите, кого бы оно волновало. Я просто предложил. Вы в праве отказаться.
Да делайте что хотите, кого бы оно волновало. Я просто предложил. Вы в праве отказаться.
спасибо.
Тогда предложу еще прочесть учебник по языку Си - хотя бы первые 5-6 глав. Поможет вам освоить работу с массивами. строками и указателями. ссылка есть в "Песочнице"
Sirocco, остыньте чуть-чуть.
Я Вас попросил сделать две простейшие вещи - заменить length на lenth+1 и, если не поможет, то выложить получившийся скетч. Вы это сделали? Нет! Так чего шумите? Делайте.
Я спрашиваю, чтоб мне указали на ошибку
Я Вам на неё указал. И сказал как именно её исправить. И сказал, что делать дальше, если проблемы останутся. Вы этого не сделали! Вам это было "жуть как трудно"? Вместо этого выкатываете какие-то обидки.
думаете, что я вот прям сейчас всё брошу и засяду за изучение программирования, прям с самых основ,
Если честно, я именно так и думал. Я думал, что Ардуино - это Ваше хобби и Вы хотите научиться. А Вы, оказывается, просто хотите нахаляву получить готовый результат? Тогда, извините за беспокойство - это без меня как-нибудь - готовые результаты я не раздаю. Попробуйте к Деду Морозу обратиться.
Всего хорошего!
Тогда предложу еще прочесть учебник по языку Си - хотя бы первые 5-6 глав. Поможет вам освоить работу с массивами. строками и указателями. ссылка есть в "Песочнице"
Спасибо, может быть, когда-нибудь, но не в этом десятилетии. Сейчас и здесь я жду готового решения от тех, кто его знает. А не советов и материалов для обучения. И это вполне нормально. Но программисты, почему-то другие люди, гордыливые, считают себя выше всех. Когда жена на форуме спрашивает какой-то рецепт, никто никогда не предложит ей пойти в кулинарное училище, закончить его и не задавать таких "тупых" вопросов. Когда я спрашиваю какой кран лучше выбрать и как правильно поставить, на форуме сантехников, ни один мне не напишет - иди учись на сантехника. И то же самое, выбирая на форуме стиральный порошок или клей для обоев никто и никогда мне не скажет идти изучить химию , изучить состав и т.д. Люди просто дадут совет и поделятся знаниями. Но программисты народ удивительный. По делу советов - 0.0, только рекомендации и отсылки. У вас пенис от этого чтоль отрастает? Или самооценка? Ну тогда продолжайте. Удачи.
выбирая на форуме стиральный порошок или клей для обоев никто и никогда мне не скажет идти изучить химию , изучить состав и т.д.
если вы спросите, какую ардуину вам выбрать для конкретного проекта - вы тоже пполучите ответ. А сейчас, продолжая вашу аналогию - вы спрашиваете не "какой клей выбрать?" - а "как мне сварить свой клей?" - при этом отказываетесь изучать химию...
ну флаг в руки
Я Вас попросил сделать две простейшие вещи - заменить length на lenth+1 и, если не поможет, то выложить получившийся скетч. Вы это сделали? Нет! Так чего шумите? Делайте.
Единственное, чего не сделал, так это не выложил скетч весь целиком? Он тогда нужен был? В остальном я вам ответил, что не помогло. Не помогло именно так, как просили сделать. И я ещё предпринял попытки "на угад" которые тоже не принесли успеха. Что-то не ясно? Вроде всё написал http://arduino.ru/forum/programmirovanie/ukazateli-i-operator-razymenovaniya-srabatyvaet-watch-dogs-esp8266#comment-530338
Единственное, чего не сделал, так это не выложил скетч весь целиком? Он тогда нужен был? В остальном я вам ответил, что не помогло.
в той конкретной ошибке, про которую речь - это НЕ МОГЛО НЕ ПОМОЧЬ. Но есть вариант что исправляя одну ошибку, вы налепили новых. Поэтому нужен весь код.
Не хотите - не выкладывайте. вытягивать его из вас никто не будет.
Единственное, чего не сделал, так это не выложил скетч весь целиком?
Кто Вам помешал? В этом я виноват? Или коронавирус?
Он тогда нужен был?
ДА! Если бы не был нужен, я бы не просил его выкладывать!
Впрочем, уже проехали, я с Вами попрощался, если Вы не заметили.
И так, после флуда вернусь к теме, продолжу диалог (или монолог, как получится). Исправил код по рекомендациям выше. Удалил указатели. Получается проблема не в них вовсе. Заметил что чаще ошибка вываливается в момент отправки данных по MQTT, когда с сервера отправляю в ESP. Но далеко не всегда, может просто в простое находится и "упасть".
Код сейчас:
#include <ESP8266WiFi.h> #include <PubSubClient.h> //++++++++++++++++++++++++++++++ #include <Adafruit_NeoPixel.h> #define LED_PIN 5 #define LED_COUNT 12 #define NUMPIXELS 12 // Adafruit_NeoPixel strip(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800); Adafruit_NeoPixel pixels(NUMPIXELS, LED_PIN, NEO_GRB + NEO_KHZ800); //++++++++++++++++++++++++++++++ #define wifi_ssid "***" #define wifi_password "***" #define mqtt_server "192.168.1.155" #define mqtt_port 1885 #define mqtt_user "***" #define mqtt_password "***" #define mqtt_client_name "Sonka" //Имя клиента, отображаемое в mqtt сервере. #define GPIO4 4 int msgString = 0; WiFiClient espClient; PubSubClient client(espClient); void callback(char *command_01, byte *payload, unsigned int length) { char buff_p[length]; for (int i = 0; i < length+1; i++) { buff_p[i] = (char)payload[i]; } buff_p[length] = '\0'; String msg_p = String(buff_p); msgString = msg_p.toInt(); // to Int Serial.println(msgString); } void BlinkRED(){ if (msgString == 1) { digitalWrite(GPIO4, HIGH); pixels.clear(); pixels.setPixelColor(0, pixels.Color(0, 255, 0)); //RED pixels.setPixelColor(1, pixels.Color(0, 255, 0)); pixels.setPixelColor(2, pixels.Color(0, 255, 0)); pixels.setPixelColor(3, pixels.Color(0, 255, 0)); pixels.setPixelColor(4, pixels.Color(0, 255, 0)); pixels.setPixelColor(5, pixels.Color(0, 255, 0)); pixels.setPixelColor(6, pixels.Color(0, 255, 0)); //RED pixels.setPixelColor(7, pixels.Color(0, 255, 0)); pixels.setPixelColor(8, pixels.Color(0, 255, 0)); pixels.setPixelColor(9, pixels.Color(0, 255, 0)); pixels.setPixelColor(10, pixels.Color(0, 255, 0)); pixels.setPixelColor(11, pixels.Color(0, 255, 0)); pixels.show(); delay(50); pixels.clear(); pixels.show(); delay(50); } } void BlinkGREEN(){ if (msgString == 2) { digitalWrite(GPIO4, HIGH); pixels.setPixelColor(0, pixels.Color(255, 0, 0)); //RED pixels.setPixelColor(1, pixels.Color(255, 0, 0)); pixels.setPixelColor(2, pixels.Color(255, 0, 0)); pixels.setPixelColor(3, pixels.Color(255, 0, 0)); pixels.setPixelColor(4, pixels.Color(255, 0, 0)); pixels.setPixelColor(5, pixels.Color(255, 0, 0)); pixels.setPixelColor(6, pixels.Color(255, 0, 0)); //RED pixels.setPixelColor(7, pixels.Color(255, 0, 0)); pixels.setPixelColor(8, pixels.Color(255, 0, 0)); pixels.setPixelColor(9, pixels.Color(255, 0, 0)); pixels.setPixelColor(10, pixels.Color(255, 0, 0)); pixels.setPixelColor(11, pixels.Color(255, 0, 0)); pixels.show(); } } void ledOff(){ if (msgString == 0) { pixels.clear(); pixels.show(); digitalWrite(GPIO4, LOW); } } //================================================================================= //================================================================================= void setup(void) { Serial.begin(115200); pinMode(GPIO4, OUTPUT); client.setCallback(callback); ///////////////////////////////////////////////////// setup_wifi(); client.setServer(mqtt_server, mqtt_port); ///////////////////////////////////////////////////// //++++++++++++++++++++++++++++++ strip.begin(); // INITIALIZE NeoPixel strip object (REQUIRED) strip.show(); // Turn OFF all pixels ASAP strip.setBrightness(10); // Set BRIGHTNESS to about 1/5 (max = 255) pixels.begin(); // INITIALIZE NeoPixel strip object (REQUIRED) //++++++++++++++++++++++++++++++ } void setup_wifi() { delay(10); // We start by connecting to a WiFi network Serial.println(); Serial.print("Connecting to "); Serial.println(wifi_ssid); WiFi.begin(wifi_ssid, wifi_password); while (WiFi.status() != WL_CONNECTED) { // blink_red(); delay(480); Serial.print("."); } Serial.println(""); Serial.println("WiFi connected"); Serial.print("IP address: "); Serial.println(WiFi.localIP()); } ////////////////////////////////////////////////////////////////////////////////////// void reconnect() { // Loop until we're reconnected while (!client.connected()) { Serial.println("Attempting MQTT connection....."); if (client.connect(mqtt_client_name, mqtt_user, mqtt_password)) { Serial.println("MQTT connected"); client.subscribe("SetAlarm/command_01"); } else { Serial.print("Connect failed, rc="); Serial.print(client.state()); Serial.println(" try again in 5 seconds"); // Wait 5 seconds before retrying // blink_red(); delay(200); //blink_red(); delay(4760); } } } void loop(void) { if (!client.connected()) { reconnect(); } client.loop(); BlinkRED(); ledOff(); BlinkGREEN(); }Но сейчас(без указателей) гораздо реже отваливается. Можно больше часа ждать.
Sirocco .... ну я же говорил.
и где вы поправили?
Смысл правки был в том. чтоб не писать за границу массива... для этого надо увеличить массив. А вы... увеличили данные. Теперь ваш код распахивает память дважды
Да, так он слона не продаст. Придти, обозвать всех п@дорасами, и буквально требовать ответа. Что у таких людей в голове? Так-то понятно - каша из г@вна и обиженности на несправедливую жизнь. И все им должны, как правило.
Вот и программисты - тоже должны, потому что горделивые пидорасы.
и где вы поправили?
Это на самом деле мой косяк. Там в первом посте массив создаётся в строке 29, а я не туда глянул и написал 30. Описка, конечно, но ТС же не понимает ни буквы в написанном.
Но, всё равно поезд ушёл, я в этой теме больше не работаю.
Sirocco .... ну я же говорил.
Говорили именно Вы? А где то ваше сообщение, в котором говорили?
Я вижу только совет этого товарища
поправить строку 30. Что у нас там было в строке 30? Лень листать? Я покажу:
так как я удалил лишний код, строки съехали. Но вот как теперь выглядит та строка
И что я сделал не так? Послушал не компетентного человека? Так я не программист, я не в состоянии оценить его компетентность.
А, ну так понятно - это Алиса строчку перепутала!
И что я сделал не так? Послушал не компетентного человека? Так я не программист, я не в состоянии оценить его компетентность.
надо свою голову на плечах иметь.
Я вижу только совет этого товарища ... оправить строку 30.
И что я сделал не так?
Не выложил код как тебя просили. Если бы ты это сделал - человек сразу бы заметил опечатку и поправил бы. Ты же этого нихрена не сделал, а полез в бутылку в #16. А виноваты, разумеется, программисты.
Это на самом деле мой косяк.
Фигня вопрос :) Зато очень грамотная подстава получилась :) особенно с учетом того, что
но при этом уверен, что он ни в чем и не должен разбираться, может всех поливать грязью, а ему на его оскорбления все бросятся помогать
Не выложил код как тебя просили. Если бы ты это сделал - человек сразу бы заметил опечатку и поправил бы. Ты же этого нихрена не сделал, а полез в бутылку в #16. А виноваты, разумеется, программисты.
Не выложил? А это что?
Он, этот "программист", не заметил ошибку в двух строчках. В 166 строках шансов вообще не было бы.
А вам бы не с середины стоило врываться, а хотя бы вникнув в тему.
Что-то анекдот про долбоёба на встречке вспомнился. Sirocco, ты не поверишь - тут их тысячи!
Не выложил? А это что?
это не код, а обрывки. Любой из этих кодов может быть как правильным. так и ошибочным - в зависимости от того, что идет дальше.
Если вы нифига не понимаете в этих строчках - то либо четко выполняйте указания. либо ищите другое место для вопросов.
И так... Собака лает - караван идёт. Изменил код следующим образом.
#include <ESP8266WiFi.h> #include <PubSubClient.h> //++++++++++++++++++++++++++++++ #include <Adafruit_NeoPixel.h> #define LED_PIN 5 #define LED_COUNT 12 #define NUMPIXELS 12 // Adafruit_NeoPixel strip(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800); Adafruit_NeoPixel pixels(NUMPIXELS, LED_PIN, NEO_GRB + NEO_KHZ800); //++++++++++++++++++++++++++++++ #define wifi_ssid "***" #define wifi_password "***" #define mqtt_server "192.168.1.155" #define mqtt_port 1885 #define mqtt_user "***" #define mqtt_password "***" #define mqtt_client_name "Sonka" //Имя клиента, отображаемое в mqtt сервере. #define GPIO4 4 int msgString = 0; WiFiClient espClient; PubSubClient client(espClient); void callback(char *command_01, byte *payload, unsigned int length) { char buff_p[length+1]; for (int i = 0; i < length; i++) { buff_p[i] = (char)payload[i]; } buff_p[length] = '\0'; String msg_p = String(buff_p); msgString = msg_p.toInt(); // to Int Serial.println(msgString); } void BlinkRED(){ if (msgString == 1) { digitalWrite(GPIO4, HIGH); pixels.clear(); pixels.setPixelColor(0, pixels.Color(0, 255, 0)); //RED pixels.setPixelColor(1, pixels.Color(0, 255, 0)); pixels.setPixelColor(2, pixels.Color(0, 255, 0)); pixels.setPixelColor(3, pixels.Color(0, 255, 0)); pixels.setPixelColor(4, pixels.Color(0, 255, 0)); pixels.setPixelColor(5, pixels.Color(0, 255, 0)); pixels.setPixelColor(6, pixels.Color(0, 255, 0)); //RED pixels.setPixelColor(7, pixels.Color(0, 255, 0)); pixels.setPixelColor(8, pixels.Color(0, 255, 0)); pixels.setPixelColor(9, pixels.Color(0, 255, 0)); pixels.setPixelColor(10, pixels.Color(0, 255, 0)); pixels.setPixelColor(11, pixels.Color(0, 255, 0)); pixels.show(); delay(50); pixels.clear(); pixels.show(); delay(50); } } void BlinkGREEN(){ if (msgString == 2) { digitalWrite(GPIO4, HIGH); pixels.setPixelColor(0, pixels.Color(255, 0, 0)); //RED pixels.setPixelColor(1, pixels.Color(255, 0, 0)); pixels.setPixelColor(2, pixels.Color(255, 0, 0)); pixels.setPixelColor(3, pixels.Color(255, 0, 0)); pixels.setPixelColor(4, pixels.Color(255, 0, 0)); pixels.setPixelColor(5, pixels.Color(255, 0, 0)); pixels.setPixelColor(6, pixels.Color(255, 0, 0)); //RED pixels.setPixelColor(7, pixels.Color(255, 0, 0)); pixels.setPixelColor(8, pixels.Color(255, 0, 0)); pixels.setPixelColor(9, pixels.Color(255, 0, 0)); pixels.setPixelColor(10, pixels.Color(255, 0, 0)); pixels.setPixelColor(11, pixels.Color(255, 0, 0)); pixels.show(); } } void ledOff(){ if (msgString == 0) { pixels.clear(); pixels.show(); digitalWrite(GPIO4, LOW); } } //================================================================================= //================================================================================= void setup(void) { Serial.begin(115200); pinMode(GPIO4, OUTPUT); client.setCallback(callback); ///////////////////////////////////////////////////// setup_wifi(); client.setServer(mqtt_server, mqtt_port); ///////////////////////////////////////////////////// //++++++++++++++++++++++++++++++ strip.begin(); // INITIALIZE NeoPixel strip object (REQUIRED) strip.show(); // Turn OFF all pixels ASAP strip.setBrightness(10); // Set BRIGHTNESS to about 1/5 (max = 255) pixels.begin(); // INITIALIZE NeoPixel strip object (REQUIRED) //++++++++++++++++++++++++++++++ } void setup_wifi() { delay(10); // We start by connecting to a WiFi network Serial.println(); Serial.print("Connecting to "); Serial.println(wifi_ssid); WiFi.begin(wifi_ssid, wifi_password); while (WiFi.status() != WL_CONNECTED) { // blink_red(); delay(480); Serial.print("."); } Serial.println(""); Serial.println("WiFi connected"); Serial.print("IP address: "); Serial.println(WiFi.localIP()); } ////////////////////////////////////////////////////////////////////////////////////// void reconnect() { // Loop until we're reconnected while (!client.connected()) { Serial.println("Attempting MQTT connection....."); if (client.connect(mqtt_client_name, mqtt_user, mqtt_password)) { Serial.println("MQTT connected"); client.subscribe("SetAlarm/command_01"); } else { Serial.print("Connect failed, rc="); Serial.print(client.state()); Serial.println(" try again in 5 seconds"); // Wait 5 seconds before retrying // blink_red(); delay(200); //blink_red(); delay(4760); } } } void loop(void) { if (!client.connected()) { reconnect(); } client.loop(); BlinkRED(); ledOff(); BlinkGREEN(); }Ничего не поменялось, вылеты продолжаются. Если взглянуть на коды других людей, то там примерно тоже самое, что у меня было изначально. Это куски выхваченные из кода MQTT. Думается мне, что проблема не совсем там. У всех же работает. Ну или все игнорят проблему, ведь после самосброса всё продолжает работать почти всегда.
Не выложил? А это что?
Блин, ты ведь так ничего и не понял. Тебя - дурака просили выложить код целиком.
А теперь что, ... теперь попробуй на вот этом ресурсе - там тебе наверняка помогут. Здесь уже вряд ли.
посмотрел историю по нику - человек много лет типа "увлекается ардуино" - куча таких же тугих постов по элементарным вопросам, а времени прочесть учебник за 7 лет так и не нашлось
Злые вы. Тока мы с котом добрые седня. :-)
Это куски выхваченные из кода MQTT. Думается мне, что проблема не совсем там. У всех же работает.
а не приходит в голову, что люди, у которых работает - писали свой код с пониманием, а не "выхватывали куски " из чужих скетчей?
Шли бы вы ... далеко.
Злые вы. Тока мы с котом добрые седня. :-)
помоги ему :)
Тока мы с котом добрые седня. :-)
Дед, так это же находка! Вот возьмитесь с котом и напишите код для ТС!
Не, у мня ноута нет, купить ненашто, а на планшете писать неудобно. А к компу на 3й эташ я не пойду, там холодно, не топют. :-)
Кста. Я очень трепетно отношусь к русскому языку, и к его лучшему представителю,, - букве йо. Поэтому, очень легко понять, когда я пишу с планшета, у него нет буквы йо., тока `е`. Не додумали, диафрагмоглазые. :-)
Ну а если я пишу с планшета, 146% я плюшевый почти вхлам.
Не, у мня ноута нет, купить ненашто,
пусть тебе Сирокко купит, он же не "ох**ший программист", а добрый сантехник (или кто там он), готов помочь каждому..
Не, мне уже никто не поможет, да и незачем. Я уже матерьял отработанный, мне на моем кладбище уже прогулы ставят. :-) ждут не даждуца.