Esp8266 и pcf8574

inspiritus
Offline
Зарегистрирован: 17.12.2012

Доброго времени суток всем.

исследую я тут эту парочку и такая вот странная весчь:

еспэшка в варианте NODE MCU, PCF  на питании еэспешки 3.3, scl/sda - 5/4 пины есп (D1/D2 nodemcu), на одном канале pcf светодиод на питание (через 470 ом), который мигает. 

работает некоторое всегда разное время, потом прекращает. Может всю ночь мигать, может через минуту перестать.

сброс не помогает. Иногда выньсунь есп из платы реанимирует, иногда просто полежать. 
PCF  менял, есп менял, дурдом какой то. С наной кучу всего работающего не первый год сделал, а тут вот такая вот хренотень. 
чтотто я уже и не пойму куда копать :(

rkit
Offline
Зарегистрирован: 23.11.2016

i2c сигналы пощупай, когда зависнет

svm
Offline
Зарегистрирован: 06.11.2016

Если на беспаячной макетке, то это нормально. Если все нормально собрано, то скорее всего программный глюк.

У меня связка ESP12E и 8574  в автоматике самогонного аппарата уже месяц на прогоне стоят, сбоев не было. Библиотека  pcf8574_esp.h На макетке сбои были, но в основном отваливался от роутера

inspiritus
Offline
Зарегистрирован: 17.12.2012

На пайке все, добавил i2c олед, сейчас продержалость чуть более 15000 циклов с периодом 200 мс.

ресет не помог, нет scl, висит в плюсе и подергивается на 0.2 в. Если ноду вынуть из колодки то scl норм, если сразу воткнуть обратно, то все стартует и работает как надо. 
попробовать штоле на других ногах i2c запустить ? 
хмм а можешь библиотекой поделиться? Я какую то нашел в инете , возможно кривая…

 

inspiritus
Offline
Зарегистрирован: 17.12.2012

Алгоритм запуска после зависа таков : вынуть, запустить от юсб, посмотреть на ногах шупом сигналы, выключить воткнуть в плату подать питание- работает.

если просто подать юсб но осциллографом не смотреть, то не работает? 
ноги штоле поджареные?

щас другую ноду прошью 

svm
Offline
Зарегистрирован: 06.11.2016

inspiritus пишет:

На пайке все, добавил i2c олед, сейчас продержалость чуть более 15000 циклов с периодом 200 мс.

ресет не помог, нет scl, висит в плюсе и подергивается на 0.2 в. Если ноду вынуть из колодки то scl норм, если сразу воткнуть обратно, то все стартует и работает как надо. 
попробовать штоле на других ногах i2c запустить ? 
хмм а можешь библиотекой поделиться? Я какую то нашел в инете , возможно кривая…

 

https://yadi.sk/d/ksV8LpdFF9Q41A    У меня эта

inspiritus
Offline
Зарегистрирован: 17.12.2012

спасибо за ссылку

на старой библе пока 25000 ok

исследую новую библиотеку. не могу понять, как там пины расширителя инициализируются. ДОлжно же быть что то вроде 

pcf8574.pinMode(P0, OUTPUT);

но в примере для esp такого нет. или оно работает по пину в зависимости от того что с ним делается - читается или пишется...оно конечно может быть, только как тогда пуллапы включаются

четто не взлетела библиотека, вернулся к старой добавил только принудительное выключение вайфая пока он не используется.

svm
Offline
Зарегистрирован: 06.11.2016

Схемотехника этой микросхемы и алгоритм работы с ней немного специфичны. Чтобы прочитать состояние порта, сначала нужно записать в него 1. В принципе за это должна отвечать библиотека, но иногда она это не делала и даннные чтения не всегда были корректны. Поэтому я для перестраховки перед каждым чтением произвожу в порт запись 1. Вот одна из вкладок, где видно это например в 25 строке. Первые 3 канала используются для чтения датчиков безопасности, остальные для управления клапанами.


#include "adc.h"
#include <pcf8574_esp.h> 
Adafruit_ADS1115 ads;
#include <Wire.h>
TwoWire testWire;
PCF857x pcf8574(0x26, &testWire);

void adcInit() {
	pcf8574.begin();
 	ads.begin();
	ads.setGain(GAIN_ONE);

delay(5);
}
// чтение всех внешних каналов АЦП
void adcLoop() {
		uint16_t data;
	if (millis() - adcTimeRead >= 1000) {
		adcTimeRead = millis();
// ********************************* чтение регистров pcf8574 ****************************************
		pcf8574.write(0,1);data =pcf8574.read(0);            //бесконтактный датчик  уровня
    if (data ==0) { adcIn[0].data = data; adcIn[0].allert = true; }
    else { adcIn[0].data = 1; adcIn[0].allert = false; }
    
    pcf8574.write(1,1); data =pcf8574.read(1);                        //датчик  этанола
    if (data ==0) { adcIn[1].data = data; adcIn[1].allert = true; }
    else { adcIn[1].data = 1; adcIn[1].allert = false; }

		pcf8574.write(2,1);data =pcf8574.read(2);                         //датчик протечки
    if (data ==0) { adcIn[2].data = data; adcIn[2].allert = true; }
    else { adcIn[2].data = 1; adcIn[2].allert = false; }

    adcIn[3].data = 1; adcIn[3].allert = false;                       //датчик давления в кубе  (в  разработке)
/*   
    pcf8574.write(4,1);data =pcf8574.read(4);                         //датчик давления в кубе  (в  разработке)
      if (data ==0) { adcIn[3].data = data; adcIn[3].allert = true; }
      else { adcIn[3].data = 1; adcIn[3].allert = false; }

		Serial.print("AIN0: "); Serial.println(adcIn[0].data);
		Serial.print("AIN1: "); Serial.println(adcIn[1].data);
		Serial.print("AIN2: "); Serial.println(adcIn[2].data);
		Serial.print("AIN3: "); Serial.println(adcIn[3].data);
		Serial.println(" ");
*/
		// Замер напряжения сети
		uint16_t minVoltage = 1024;
		uint16_t maxVoltage = 0;
		uint16_t adcRez;
		unsigned long timeAdc = millis() + 40;
		while (timeAdc > millis()) {
			adcRez = analogRead(0);
			if (minVoltage > adcRez) minVoltage = adcRez;
			if (maxVoltage < adcRez) maxVoltage = adcRez;
		}
		//Voltage = (maxVoltage - minVoltage) >> 2; // для MCP602
		Voltage = maxVoltage - minVoltage; // для LM358
		if (Voltage < 50) Voltage = 230; // модуль zmpt101 отсутствует
		float deltaPercent = 100 - (Voltage / 2.3);

		// вычислим коррекцию для ТЭНа
		if (power.heaterPower == 100) power.heaterPowerCorr = 100;
		else if (power.heaterPower > 0) {
			deltaPercent /= (100 / power.heaterPower);
			if ((power.heaterPower + deltaPercent) <= 100 && (power.heaterPower + deltaPercent) >= 0) power.heaterPowerCorr = uint8_t(power.heaterPower + deltaPercent);
			else if ((power.heaterPower + deltaPercent) > 100) power.heaterPowerCorr = 100;
			else if ((power.heaterPower + deltaPercent) < 0) power.heaterPowerCorr = 0;
		}
		else power.heaterPowerCorr = 0;
	}
}
//******************************** Перехват управления силовым блоком *****************************************
void BZZ()                   // Активная пищалка с внутренним генератором
{pcf8574.write(3,1);}

void NO_BZZ()
{pcf8574.write(3,0);}
//************************************    Клапана     ************************************************
void Set_Out(byte ch, uint16_t Pon, uint16_t Poff)
{ byte pin_ch=0;
  
  if (ch == PWM_CH1) pin_ch=4;      // клапан отбора голов
  if (ch == PWM_CH2) pin_ch=5;      // клапан отбора  тела
  if (ch == PWM_CH3) pin_ch=6;      // клапан подачи  воды  охлаждения
  if (ch == PWM_CH4) pin_ch=7;      // на слив  с «Польского  буфера».
  if (pin_ch > 0)
  {
    if (Poff < 4000)    pcf8574.write(pin_ch,0);
    if (Poff > 4000)    pcf8574.write(pin_ch,1);
  } 
  }
inspiritus
Offline
Зарегистрирован: 17.12.2012

Похоже нашел проблему. Надеюсь.

уже давно не облуживаю дипы перед пайкой, как в древние времена с советскими микросхемами. Похоже с китаем это не прокатило. При рассмотрении паек со стороны корпуса обнаружил впуклый мениск припоя воруг некоторых ног, в частности scl. При пропайке мениск оставался, пока не пошкрябал ногу жалом. Чем они там покрывают их интересно :(

поставил на прогон , наблюдаю

тотесть в этой библиотеке специального инита на вход или выход нет.

svm
Offline
Зарегистрирован: 06.11.2016

inspiritus пишет:

Похоже нашел проблему. Надеюсь.

уже давно не облуживаю дипы перед пайкой, как в древние времена с советскими микросхемами. Похоже с китаем это не прокатило. При рассмотрении паек со стороны корпуса обнаружил впуклый мениск припоя воруг некоторых ног, в частности scl. При пропайке мениск оставался, пока не пошкрябал ногу жалом. Чем они там покрывают их интересно :(

поставил на прогон , наблюдаю

тотесть в этой библиотеке специального инита на вход или выход нет.

Правильно говорят "электроника - это наука о контактах, чудес не бывает, бывают плохие контакты".

А насчет библиотеки, я особо не разбирался, но не увидел инициализации на вход или выход. И ощущение, что после каждого чтения, микросхема забывает, что вход на чтение. А может только показалось. Проще было перед каждым чтением записать в порт "1", для гарантии.

inspiritus
Offline
Зарегистрирован: 17.12.2012

46000 полет нормальный.

более 100000 ок

вцелом работает. Было одно подвисание олед-i2c дисплея за день, при этом pcf продолжала молотить.

Видимо гавеное покрытие ног и как следствие напропай. Причем одну pcf выкусил с этими же симптомами (из той же закупки) вторая так же себя повела. 
теперь возобновлю древнюю практику обязательного облуживания всего перед пайкой и пропай с обеих сторон платы с контролем под мощной лупой правильности обтекания припоя.

двое суток полет нормальный, щелкает релюшками 12в через uln.