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

На esp8266 сгорает ножка данных i2c через день, неделю, месяц

scherbatuk

New member
Прошу помощи разобраться в слудующем:

1696487870036.png

На esp8266 сгорает ножка данных i2c через день, неделю, месяц (как повезет). Я не знаю как отладить, в чем может быть дело.
Посоветовали купить осциллограф и проверить инициализацию пинов в arduino ide.
Как таковую инициализацию режима пинов я не делаю. Просто Wire.begin(pin1, pin2) и дальше Adafruit_INA219.h
дает мне показания напряжения\тока при обращении к веб-серверу.

Я искал внутри дебрей Wire библиотеки, зовет ли она для esp8266 pinMode(pull_up) или другие низкоуровневые ф-ции,
пока потерялся. Все глубоко Arduino IDE библиотек происходит.

Бывают статьи, что статическое электричество может убивать ее. Но устройство в закрытой пластиковой коробке, а коробка
в серверном ящике в который никто не лазяет и ничего не трогает.

Начинал с esp8266 witty. Спалил одну пару ножек данных, потом 2-ю, на 3-й попытке плата перестала прошиваться. 6 ножек убил.
Думал, может плата плохая, взял esp8266 в другом форм-факторе, в виде продолговатой, где ничего лишнего на пинах.
Сутки и сгорел один из D1/D2 что я пользовал для SDA/SCL. Проверяю кнопкой (принимает ли 0\1).

Читая статьи о защите пинов, попадается, что "вставьте пару диодов шотки на + и -" и т.п. Пока, как вы видите, токоограничивающий 1к
резистор не спасает.
 

CodeNameHawk

Moderator
Команда форума
Вы берете 3.3 в с модуля есп?
Попробуйте добавить отдельный стабилизатор 3.3 вольта на ina 219.
 
  • Like
Реакции: Atom

pvvx

Активный участник сообщества
Вы берете 3.3 в с модуля есп?
Попробуйте добавить отдельный стабилизатор 3.3 вольта на ina 219.
INA219 может работать и от 5В. ESP от этого не холодно, не жарко.

Читая статьи о защите пинов, попадается, что "вставьте пару диодов шотки на + и -" и т.п. Пока, как вы видите, токоограничивающий 1к
резистор не спасает.
99% что у вас проблемы с разводкой общего провода (GND).
При учете что 1% отведем на ляпы в пайке, монтаже (что-то коротит или отваливается).
 

pvvx

Активный участник сообщества
И сотые процента, на то провода с GPIO идут вплотную (или вокруг :) ) с дросселем какого DC-DC с открытым магнитопроводом. Тогда на этом провод могут наводиться хорошие токовые выбросы, способные пробить защитные диоды GPIO. Но тогда и INA219 должна дохнуть.
Других, из суммы с описанными выше, вариантов нет.
 

CodeNameHawk

Moderator
Команда форума
INA219 может работать и от 5В. ESP от этого не холодно, не жарко.
Идея в том, что может 3.3 в стабилизатор пробивается.
И сотые процента, на то провода с GPIO идут вплотную (или вокруг :) ) с дросселем какого DC-DC с открытым магнитопроводом.
Так я и попросил фото.

Сильно подозрительно, что через 1 ком выгарает вход, может перепутаны номиналы или просто сэкономили на резисторах.
Скетч и эл. схему как вы её проверяете.
Как с нагревом есп и током потребления, после пробоя.
 

scherbatuk

New member
Огромное спасибо, что столько человек оперативно отреагировало!
Прикладываю фото. Номинал всех резисторов проверял. 1ком резисторы в изоленте внутри, думал буду подбирать номинал, там вставлен в дюпоны просто. Изолента фиксирует дополнительно.
О земле. Тестор звенит от черной клеммы, где аккумулятор подсоединяет и аж до INA219 земли. Т.е. проходит: аккумулятор, 12->5 эта платка с индикатором, ESP8266, INA219.
Температуру я не мерял после пробоя, чип ESP8266 не трогал.
Как я проверяю схему? Никак, у меня опыта нет. Просто собрал, и работает. Когда сгорают пины, беру следующие живые.
Если кто-то научит, я буду благодарен. Уже есть осциллограф (увидел как по спаду данные идут по i2c - но что это мне дало? там 3 с чем-то вольт, не было 12в или такого чего-то). Я начинающий любитель в этом деле.

>INA219 может работать и от 5В. ESP от этого не холодно, не жарко.
Когда сгорела в первый раз, я INA219 питал 5в, потом стал 3.3в (подумал, может INA219 начала 5в мне отправлять на 3.3в вход ESP). Я тогда не знал что I2C при посылке на землю прижимает сигнал.
Второй раз сгорела, я прицепил подтягивающий резисторы 4.7ком (их не было вообще, не знал).
Третий, прицепил эти токо-ограничивающие на 1ком.

>сэкономили на резисторах.
поставить 2ком?

Скетч:

#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>
#include <Wire.h>
#include <Adafruit_INA219.h>
#ifndef STASSID
#define STASSID "xxx"
#define STAPSK "yyy"
#endif
const char* ssid = STASSID;
const char* password = STAPSK;
ESP8266WebServer server(80);
Adafruit_INA219 ina219;
//const int led = 15;
void SendIna219();
void handleRoot() {
SendIna219();
}
void handleNotFound() {
String message = "File Not Found\n\n";
message += "URI: ";
message += server.uri();
message += "\nMethod: ";
message += (server.method() == HTTP_GET) ? "GET" : "POST";
message += "\nArguments: ";
message += server.args();
message += "\n";
for (uint8_t i = 0; i < server.args(); i++) { message += " " + server.argName(i) + ": " + server.arg(i) + "\n"; }
server.send(404, "text/plain", message);
}
void setup(void) {
Serial.begin(115200);
Serial.print("Hello? ");
delay(500);

Wire.begin(14, 4);
if (! ina219.begin(&Wire)) {
Serial.println("Failed to find INA219 chip");
while (1) { delay(10); }
}

WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
Serial.println("");
// Wait for connection
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.print("Connected to ");
Serial.println(ssid);
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
if (MDNS.begin("esp8266")) { Serial.println("MDNS responder started"); }
server.on("/", handleRoot);
server.on("/inline", []() {
server.send(200, "text/plain", "this works as well");
});
server.on("/gif", []() {
static const uint8_t gif[] PROGMEM = {
0x47, 0x49, 0x46, 0x38, 0x37, 0x61, 0x10, 0x00, 0x10, 0x00, 0x80, 0x01,
0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x2c, 0x00, 0x00, 0x00, 0x00,
0x10, 0x00, 0x10, 0x00, 0x00, 0x02, 0x19, 0x8c, 0x8f, 0xa9, 0xcb, 0x9d,
0x00, 0x5f, 0x74, 0xb4, 0x56, 0xb0, 0xb0, 0xd2, 0xf2, 0x35, 0x1e, 0x4c,
0x0c, 0x24, 0x5a, 0xe6, 0x89, 0xa6, 0x4d, 0x01, 0x00, 0x3b
};
char gif_colored[sizeof(gif)];
memcpy_P(gif_colored, gif, sizeof(gif));
// Set the background to a random set of colors
gif_colored[16] = millis() % 256;
gif_colored[17] = millis() % 256;
gif_colored[18] = millis() % 256;
server.send(200, "image/gif", gif_colored, sizeof(gif_colored));
});
server.onNotFound(handleNotFound);
/////////////////////////////////////////////////////////
// Hook examples
server.addHook([](const String& method, const String& url, WiFiClient* client, ESP8266WebServer::ContentTypeFunction contentType) {
(void)method; // GET, PUT, ...
(void)url; // example: /root/myfile.html
(void)client; // the webserver tcp client connection
(void)contentType; // contentType(".html") => "text/html"
Serial.printf("A useless web hook has passed\n");
Serial.printf("(this hook is in 0x%08x area (401x=IRAM 402x=FLASH))\n", esp_get_program_counter());
return ESP8266WebServer::CLIENT_REQUEST_CAN_CONTINUE;
});
server.addHook([](const String&, const String& url, WiFiClient*, ESP8266WebServer::ContentTypeFunction) {
if (url.startsWith("/fail")) {
Serial.printf("An always failing web hook has been triggered\n");
return ESP8266WebServer::CLIENT_MUST_STOP;
}
return ESP8266WebServer::CLIENT_REQUEST_CAN_CONTINUE;
});
server.addHook([](const String&, const String& url, WiFiClient* client, ESP8266WebServer::ContentTypeFunction) {
if (url.startsWith("/dump")) {
Serial.printf("The dumper web hook is on the run\n");
// Here the request is not interpreted, so we cannot for sure
// swallow the exact amount matching the full request+content,
// hence the tcp connection cannot be handled anymore by the
// webserver.
#ifdef STREAMSEND_API
// we are lucky
client->sendAll(Serial, 500);
#else
auto last = millis();
while ((millis() - last) < 500) {
char buf[32];
size_t len = client->read((uint8_t*)buf, sizeof(buf));
if (len > 0) {
Serial.printf("(<%d> chars)", (int)len);
Serial.write(buf, len);
last = millis();
}
}
#endif
// Two choices: return MUST STOP and webserver will close it
// (we already have the example with '/fail' hook)
// or IS GIVEN and webserver will forget it
// trying with IS GIVEN and storing it on a dumb WiFiClient.
// check the client connection: it should not immediately be closed
// (make another '/dump' one to close the first)
Serial.printf("\nTelling server to forget this connection\n");
static WiFiClient forgetme = *client; // stop previous one if present and transfer client refcounter
return ESP8266WebServer::CLIENT_IS_GIVEN;
}
return ESP8266WebServer::CLIENT_REQUEST_CAN_CONTINUE;
});
// Hook examples
/////////////////////////////////////////////////////////
server.begin();
Serial.println("HTTP server started");
}
void loop(void) {
server.handleClient();
MDNS.update();
}

//server.send(200, "text/plain", "hello Natasha!\r\n");
void SendIna219()
{
float shuntvoltage = 0;

float busvoltage = 0;
float current_mA = 0;
float loadvoltage = 0;
float power_mW = 0;
float coeff = 1.0;
shuntvoltage = ina219.getShuntVoltage_mV();
busvoltage = ina219.getBusVoltage_V();
current_mA = ina219.getCurrent_mA();
power_mW = ina219.getPower_mW();
loadvoltage = busvoltage + (shuntvoltage / 1000);
char buf[1024] = { 0 };
char tmp[128];
if (current_mA < 0)
{
strcat(buf, "Status: 220v\r\n");
} else
{
strcat(buf, "Status: battery backup\r\n");
}
strcat(buf, "\r\n");
sprintf(tmp, "Bus Voltage: %.2f V\r\n", busvoltage);
strcat(buf, tmp);
sprintf(tmp, "Shunt Voltage: %.2f mV\r\n", shuntvoltage);
strcat(buf, tmp);
sprintf(tmp, "Load Voltage: %.2f V\r\n", loadvoltage);
strcat(buf, tmp);
sprintf(tmp, "Current: %.1f A\r\n", abs(current_mA / 1000.0));
strcat(buf, tmp);
sprintf(tmp, "Power: %.1f W\r\n", power_mW / 1000.0);
strcat(buf, tmp);
server.send(200, "text/plain", buf);
}
 

Вложения

pvvx

Активный участник сообщества
О земле. Тестор звенит от черной клеммы, где аккумулятор подсоединяет и аж до INA219 земли. Т.е. проходит: аккумулятор, 12->5 эта платка с индикатором, ESP8266, INA219.
Про общий провод идет разговор о его разводке, а не о проверки тестером сопротивлений проводов.
1. Обычно общий провод (GND) соединяется звездой, к одной точке. Общая точка часто делается на выходе общего или самого мощного источника питания.
Что не сказать о вашей схеме... где устроена петля между входами и выходами INA219 для приема бросков питания ESP и даже для внешних магнитных импульсов...

2. INA219 может делать замеры с частотой более 8 кГц и можно увидеть какие наводки в вашей схеме.

3. Программно GPIO не убить, если он не замкнут на питание или GND. Для исправления ситуации "Скетч" или другой код не нужен.
Ток питания ESP8266, если GPIO замкнут на + питания и в него выводится "0" увеличивается на 50 мА.
 

scherbatuk

New member
>1. Обычно общий провод (GND) соединяется звездой, к одной точке. Общая точка часто делается на выходе общего или самого мощного источника питания.
Для меня это означает, что нужно отсоединить землю INA219 и отдельным проводником подсоединить на землю приходящую на питание коробочки моей? Чтобы земля не проходила через все устройства, а сразу в INA219 шла?
Насчет магнитных импульсов. Коробочка стоит очень близко к wifi роутеру (20 см). Может ли он ее своими наводками влиять?

>2. INA219 может делать замеры с частотой более 8 кГц и можно увидеть какие наводки в вашей схеме.
Я пока собрал на столе, ипользуя второй набор mini-ups, батареи, делеко от роутера. Прилагаю фото. Сделал bat файл, что curl-ом зовет в мертвом цикле мой веб-сервер на ESP. Припаял два проводка к GND и SDA на ESP, чтобы удобно снаружи коробки осциллограф подключать.
Я ничего не вижу необычного. Пока не зову веб-сервер, напряжение около 3.3в на SDA. Когда опрашивается датчик, сигнал к нулю притягивается.
Минут 5 подержал под запросами мертвого цикла, потрогал ESP8266 - не горячая.

Вообще устройство стоит по-сути без передачи данных. Пока я пару раз в сутки не запрошу показания датчика, по SDA ничего ходить не должно вообще и там эти 3.3в.

Чуть позже подключу все то же в реальном ящике, около WIFI-роутера, может картина изменится?
 

Вложения

CodeNameHawk

Moderator
Команда форума
У вас все неплохо собрано,
Как проверяете, что есп пробилась?
Может просто перестает отвечать?
Надеюсь на служебные ноги не подключали не разобравшись? типа gpio0 gpio2
 
Последнее редактирование:

scherbatuk

New member
У вас все неплохо собрано,
Как проверяете, что есп пробилась?
Может просто перестает отвечать?
Проверяю так (вложил фото).

const int INPIN = D3;
pinMode(INPIN, INPUT);
pinMode(LED_BUILTIN, OUTPUT);
while(true)
{
Serial.println((String)"value=" + digitalRead(INPIN));
digitalWrite(LED_BUILTIN, digitalRead(INPIN));
delay(200);
}


Поключаю к пину, который хочу проверить кнопку, смотрю на LED на плате или отзывается. После того, что я назвал "пин сгорает", он не принимает сигнал. А на выход работает.
На этой новой плате, что 1 пин сгорел: SDA умер на D1, SCL живой на D2. Перевесил на SDA на D5. Сейчас там живет. Сгорело меньше чем за сутки.

Прошлая ESP witty, что перестала отвечать, я не помню к каким пинам подсоединялся (после сгорания 4-х пинов я еще 2 дожарил). Может быть какие-то важные для ее старта. Но мне ее реанимировать не важно, это пятый вопрос, они стоят копейки. Мне бы избавиться от сгорания пинов!
 

Вложения

scherbatuk

New member
Вы думаете, что по плате видно схему подключения?
Схема подключения в первом сообщении этого треда. Если вопрос по "как подключается кнопка для проверки пина" - я думал понятно. Красный +, черный -, желтый на вход пина. Обычная схема из интернета. К сути моего треда не относится (сгорание пина).
 

scherbatuk

New member
Если вам даже лень написать соответствие выводов - удачи.
Мне не лень, я не хочу быть испорченным телефоном. Мне нужна помощь.

Отвечаю на вопрос: D3 это GPIO0.

Но еще раз, я не использую D3. Этот маппинг ничем не поможет.
 

scherbatuk

New member
Использовал:
D1 для SDA - GPIO5 (сгорел)
сейчас
D2 для SCL - GPIO4 (продолжает работать)
D5 для SDA - GPIO14.
 
Сверху Снизу