ESP 8266 + 74hc595

znatachek
Offline
Зарегистрирован: 08.03.2019

ESP 8266 + 74hc595

Всё отлично работает по снизу.

Всё отлично работает, за исключением того, что при загрузке ESP8266 светодиоды рандомно зажигаются.

В одной из тем тут на форуме, участник andriano подсказал интересующемуся как такое избежать на Arduino UNO

Так вот какой резистор использовать в моём случае и от какого пина питать OE ?

znatachek
Offline
Зарегистрирован: 08.03.2019

Мде, картинки не загрузились, а изменить нельзя(
Сейчас поправлю...

UPDATE
Тема: ESP 8266 + 74hc595

Всё отлично работает по схеме.

За исключением того, что при загрузке ESP8266 светодиоды рандомно зажигаются.

 

В одной из тем тут на форуме, участник andriano подсказал интересующемуся как такое избежать на Arduino UNO

Так вот какой резистор использовать в моём случае и от какого пина питать OE ?

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

andriano попал :)

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

А чем Вас не устраивает процитированный Вами ответ?

znatachek
Offline
Зарегистрирован: 08.03.2019

andriano пишет:

А чем Вас не устраивает процитированный Вами ответ?

Не достаточно пока разбираюсь.
Не понимаю к какому пину на ESP8266 подключать OE

znatachek
Offline
Зарегистрирован: 08.03.2019

andriano Как то так имеется ввиду ?
Оранжевый вопросик (непонимание к какому пину на ESP8266)

Муж_Долговой
Муж_Долговой аватар
Offline
Зарегистрирован: 07.10.2018

Предлагаю оживить дискуссию.

У меня как раз рояль в кустах (На макетке 74НС595 с восьми диодами на выходах и NodeMCU ESP8266 рядом. Есть все резисторы и конденсаторы). Обязуюсь оперативно прверять все идеи.

Мне эта тема тоже интересна. 

Хотел её попробывать реализовать прямо в Сетапе.  прокрутить 0000 0000 цикл.

Вторым способом ОЕ подключить к встроенному синему диодику (он нуликом зажигается).

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

znatachek пишет:

andriano пишет:

А чем Вас не устраивает процитированный Вами ответ?

Не достаточно пока разбираюсь.
Не понимаю к какому пину на ESP8266 подключать OE

1. Это не ко мне. Книжки читайте. Какие именно - написано в прикрепленной теме в ПЕСОЧНИЦЕ.

2. К любому свободному. Естественно, в схеме и в коде должен фигурировать один и тот же пин.

Муж_Долговой
Муж_Долговой аватар
Offline
Зарегистрирован: 07.10.2018

Проверил одну идею.

Проблема решается просто.

Если в чердаке (или как там называется место над Сетапом) записать строку:

        int number595 = (B00000000); // Вместо (00000000) можно ставить нужный вам безопасный стартовый код. Хоть (10010011)

   ... то при загрузке выходы микросхемы так и загрузятся. Потом начинает работать согласно скетча. Проверил только что. Несколько раз перезагружал комп, выдёргивал питание ESP. Сброс на нём нажимал. Результат тот же. При загрузке все ноли (00000000). если их так установил.

ОЕ наглухо закопано в землю

Только у меня подключение ESP k 74HC595 не такое, как у автора темы.

int latchPin = D5;  
int clockPin = D8; 
int dataPin = D7; 
znatachek
Offline
Зарегистрирован: 08.03.2019

Муж_Долговой А где то этот number595 присваиваете регистру и как ?
У меня выходит только с так, как говорил andriano, а не получалось, потому что я зыбыл включить LOW на пине xD

Муж_Долговой
Муж_Долговой аватар
Offline
Зарегистрирован: 07.10.2018

Рассекреть свой скетч. На нём покажу. На пальцах не сумею ... русский язык мне не родной.

Вот здесь http://arduino.ru/forum/programmirovanie/uvelichenie-analogovykh-i-tsifrovykh-vkhodov я при очень большой помощи Sadman41 привёл реальный способ увеличения входов/выходов Ардуино ... ну и ESP 8266. Правда я тогда не знал про существование библиотеки для 595. Сам новичок. 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Муж_Долговой пишет:

Рассекреть свой скетч. На нём покажу. На пальцах не сумею ... русский язык мне не родной.

Нелогично. 

Какое отношение пальцы имеют к языку?

А если серьезно, то "рассекречивать" нужно не скетч, а схему.

А эксперимент из поста №8 поставлен неправильно: 

вот помести в скетч:

 int number595 = (10010011);

подключи к выходам светодиоды (достаточно хотя бы к D7, D4 или D0 на землю или один из оставшихся - в питание) и сразу в начале скетча обнули регистр, если использовал D7, D4 или D0 или запиши в него 0xFF, если подключал оставшиеся.

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

Делайте выводы.

 

Другой пример: с выхода МК два резистора - один в питание, другой на базу npn. в коллекторе - светодиод.

Нам нужно, чтобы контроллер выдавал "0", при котором светодиод не горит (предположим, он должен индицировать аварию).

Попытайтесь написать скетч, чтобы светодиод при включении МК не вспыхнул.

Муж_Долговой
Муж_Долговой аватар
Offline
Зарегистрирован: 07.10.2018

andriano пишет:

Муж_Долговой пишет:

Рассекреть свой скетч. На нём покажу. На пальцах не сумею ... русский язык мне не родной.

Нелогично. 

Какое отношение пальцы имеют к языку?

А если серьезно, то "рассекречивать" нужно не скетч, а схему.

А эксперимент из поста №8 поставлен неправильно: 

вот помести в скетч:

 int number595 = (10010011);

подключи к выходам светодиоды (достаточно хотя бы к D7, D4 или D0 на землю или один из оставшихся - в питание) и сразу в начале скетча обнули регистр, если использовал D7, D4 или D0 или запиши в него 0xFF, если подключал оставшиеся.

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

Делайте выводы.

 

Другой пример: с выхода МК два резистора - один в питание, другой на базу npn. в коллекторе - светодиод.

Нам нужно, чтобы контроллер выдавал "0", при котором светодиод не горит (предположим, он должен индицировать аварию).

Попытайтесь написать скетч, чтобы светодиод при включении МК не вспыхнул.

Диванный теоретик!!!!!

А без этой строки ESP запускаетс с состоянием регистров на момент предыдущего выключения.

Как написано ... так и протестировал!!!!!!!!!!!! Тебе видео заснять как выходы в исходное состояние при запуске выставляются!?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Я же говорил, попал :)

Муж_Долговой
Муж_Долговой аватар
Offline
Зарегистрирован: 07.10.2018

ЕвгенийП пишет:

Я же говорил, попал :)

А как правильно называется тот чердак над Сетапом, где и  глобальные переменные прописывают?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Там много чего может быть, но думаю, что Вы имеете в виду глобальное пространство имён.

Муж_Долговой
Муж_Долговой аватар
Offline
Зарегистрирован: 07.10.2018

ЕвгенийП пишет:

Там много чего может быть, но думаю, что Вы имеете в виду глобальное пространство имён.

А на жаргоне?

"Чердак" не понятно будет?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Мне - нет.

sadman41
Offline
Зарегистрирован: 19.10.2016

Что, прямо вот так int number595 = (B00000000) пишу и всё? А если я бахну byte shiftReg164 = 0xFF - какие выводы у меня встанут в '1'?

Муж_Долговой
Муж_Долговой аватар
Offline
Зарегистрирован: 07.10.2018

Значит так ... с такой строчкой в области глобальных переменных    int number595 = (B00000000)  при включении питания на ESP кратковременно, до включения Лупа, устонавливаются нули. Это я проверил на железе. Напишишешь как мне написать твоё FF ... сразу и проверю. Макетку ещё не разобрал. Чтобы не было недопонимания ... измени мой последний скетч, где помогал с расширением входов, как ты хочешь.

Logik
Offline
Зарегистрирован: 05.08.2014

Муж_Долговой пишет:

Если в чердаке (или как там называется место над Сетапом) записать строку:

        int number595 = (B00000000); // Вместо (00000000) можно ставить нужный вам безопасный стартовый код. Хоть (10010011)

   ... то при загрузке выходы микросхемы так и загрузятся. 

Афигеть! Потрясен до глубины души.

Муж_Долговой
Муж_Долговой аватар
Offline
Зарегистрирован: 07.10.2018

Logik пишет:

Муж_Долговой пишет:

Если в чердаке (или как там называется место над Сетапом) записать строку:

        int number595 = (B00000000); // Вместо (00000000) можно ставить нужный вам безопасный стартовый код. Хоть (10010011)

   ... то при загрузке выходы микросхемы так и загрузятся. 

Афигеть! Потрясен до глубины души.

Понял в чём ваша бестолковость. Строка  int number595 = (B00000000) не сама по себе же!

Это переменная, которая потом в скетче может иметь любое значение

Имеется ввиду, что потом в Лупе это применится:

***

      digitalWrite(latchPin, LOW);    //открываем защёлку
      shiftOut(dataPin, clockPin, MSBFIRST, number595);      
         digitalWrite(latchPin, HIGH);  // закрываем защёлку
***
sadman41
Offline
Зарегистрирован: 19.10.2016

Ну вот и писали бы, что строка "при нём", а не просто так болтается. Тут всё как в суде - рассматривается так, как написано.

Муж_Долговой
Муж_Долговой аватар
Offline
Зарегистрирован: 07.10.2018

sadman41 пишет:

Ну вот и писали бы, что строка "при нём", а не просто так болтается. Тут всё как в суде - рассматривается так, как написано.

Так я ещё и виноват!!!!?

Потому и спрашивал у автора его скетч ... что бы на нём показать.

SLKH
Offline
Зарегистрирован: 17.08.2015

Муж_Долговой пишет:

Разберёшься, что я написал - тогда и .... ну и молодец тогда. 

Молодец? Нет, гений!
Муж_Долговой
Муж_Долговой аватар
Offline
Зарегистрирован: 07.10.2018

Вот знал, что Гуру налетят!

Думаю, ТС уже прочитал. Хотел удалить. Не вышло.

А кто заблокировал мне возможность это удалить? 

Ну теперь сами и удаляйте.

b707
Offline
Зарегистрирован: 26.05.2017

Муж_Долговой - ерунду вы пишете, ваш метод не работает и не может работать.

Светодиоды на выводах 595-регистра вспыхивают ДО загрузки скетча в ардуину, так что никакая строчка в коде этого поведения не меняет. Это совершенно очевидный вывод, но если вы будете упорствовать - могу собрать схему и продемонстрировать видео, 595 регистры у меня как раз на столе лежат.

Явление, с которым столкнулся ТС - известно давно. Бороться с ним можно только АППАРАТНЫМИ методами.

Муж_Долговой
Муж_Долговой аватар
Offline
Зарегистрирован: 07.10.2018

b707 пишет:

Муж_Долговой - ерунду вы пишете, ваш метод не работает и не может работать.

Светодиоды на выводах 595-регистра вспыхивают ДО загрузки скетча в ардуину, так что никакая строчка в коде этого поведения не меняет. Это совершенно очевидный вывод, но если вы будете упорствовать - могу собрать схему и продемонстрировать видео, 595 регистры у меня как раз на столе лежат.

Явление, с которым столкнулся ТС - известно давно. Бороться с ним можно только АППАРАТНЫМИ методами.

Пойду видео снимать.

b707
Offline
Зарегистрирован: 26.05.2017

Муж_Долговой пишет:

Пойду видео снимать.

Давай я тебе четкое ТЗ дам. что именно снимать.

На выходы 595 регистра устанавливаешь светодиоды. В коде скетча эти светодиоды ЗАЖИГАЕШЬ (то есть в момент выключения питания на выходах регистра единицы).

Выключаешь питание, ждешь минуту, включаешь снова. Наблюдаешь вспышку диодов ДО ЗАГРУЗКИ ардуины или ЕСП.

Задание - написать такой скетч, чтобы эту вспышку убрать программно. Код выкладываем в свободный доступ.

b707
Offline
Зарегистрирован: 26.05.2017

Собрал схему, проделал эксперимент. Вспышки после добавления в начало кода  int number595 =0; остаются. как и следовало ожидать.

Однако, что могу сказать в поддержку "Мужа"- действительно, эффект от той строчки несомненно есть. Без нее диоды на регистре горят все время загрузки, которая может длится до секунды. С этой строчкой - диоды вспыхивают буквально на мгновение. Но вспыхивают все же.

Так что метод с OE пином надежнее, что и требовалось доказать.

Вывод - если в момент загрузки появление сигналов на выходах регистра недопустимо - помогут только аппаратные методы.

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

b707
Offline
Зарегистрирован: 26.05.2017

Муж пропал.... видимо жена вмешалась и пристроила мужа к чему-то более полезному, чем ардуино :)

Муж_Долговой
Муж_Долговой аватар
Offline
Зарегистрирован: 07.10.2018

Не пропал. Грузится видео долго. Одно (с обнулением) загрузилось.

b707
Offline
Зарегистрирован: 26.05.2017

Муж_Долговой пишет:

Не пропал. Грузится видео долго. Одно (с обнулением) загрузилось.

так ты сделай видео на 10-15 секунд - зачем больше? такое грузится мгновенно

Муж_Долговой
Муж_Долговой аватар
Offline
Зарегистрирован: 07.10.2018
Муж_Долговой
Муж_Долговой аватар
Offline
Зарегистрирован: 07.10.2018
[code]
/*Заготовка скетча для расширения портов NodeMCU ESP8266 или ардуино UNO 
 * 74НС595 - три штуки. Расширитель аналоговых портов CD 4051BE - 5 штук. 
 * При чём аналогвые расширители управляются 8 портами микросхемы 74НС595_1
 * Схема и скетч тестированы на UNO и NodeMCU ESP8266 c контролем на монитор порта
 * Скетч не содержит Delay и millis Однако аналоговый порт считываться успевает
 * Занимая один аналоговый порт микроконтроллера и три цифровых ....
 * получаем 40 аналоговых и 2*8 = 16 цифровых
 Может кому пригодится*/
/*int latchPin = 10;  //10 Пин ESP D5
int clockPin = 12;  //12 Пин ESP  D8
int dataPin = 11;   //11 Пин ESP  D7 */
int latchPin = D5;  //10 Пин ESP D5
int clockPin = D8;  //12 Пин ESP  D8
int dataPin = D7;   //11 Пин ESP  D7
int number595_2 = (B00000000);   // Расширение выходов
//int number595_3 = (B00000000);
uint8_t inh[] = { B01111000, B10111000, B11011000, B11101000, B11110000 };
void setup() {
  Serial.begin (115200);
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);}
void loop() {
  for (uint8_t i = 0x00; sizeof(inh) > i; i++) {
    for (uint8_t k = B000; B111 >= k; k++) {
        uint8_t number595_1 = inh[i] | k;
      number595_2 = number595_1;  
    digitalWrite(latchPin, LOW);    //открываем защёлку
    shiftOut(dataPin, clockPin, MSBFIRST, number595_1);  //Заносим даные в первый регистр
     shiftOut(dataPin, clockPin, MSBFIRST, number595_2);  //Заносим даные во второй регистр
     //shiftOut(dataPin, clockPin, MSBFIRST, number595_3);  //Заносим даные в третий регистр
     digitalWrite(latchPin, HIGH);  // закрываем защёлку
      int val = analogRead (A0);  // в этом месте можно "перехватывать" данные аналоговых сигналов для использования в своих целях
      if (val!=0){ //Если неподключенные пины притянуть к "земле", то их можно не печатать
 Serial.print (number595_1, BIN); //  чтобы в голове не пересчитывать номер аналогового входа СD4051BE
 Serial.print (" / ");
 Serial.print (number595_1 );
     Serial.print ("   = ");
     Serial.println (val);
     delay (500);}
     }
  }
}
[/code]
int number595_2; // = (B00000000);   // без обнуления
Муж_Долговой
Муж_Долговой аватар
Offline
Зарегистрирован: 07.10.2018

 Второе видео грузится. А на словах .   ... при подаче питания 595 становится в запретное для моего скетча состояние и выходит после полного прохождения цикла
Левые пять светодиодов - выбор микросхемы CD5041BE. Правые три - счёт от 000 до 111
b707
Offline
Зарегистрирован: 26.05.2017

В момент включения вспыхивает, насколько я вижу. Или я ничего не понял.

Муж_Долговой
Муж_Долговой аватар
Offline
Зарегистрирован: 07.10.2018

Светодиоды включаются нулевым уровнем

Чтобы понять ... надо инвертировать мозг. Сам путаюсь

b707
Offline
Зарегистрирован: 26.05.2017

Держите мое видео . Тут все просто и наглядно.  Сначала светодиоды горят. Потом выключаем питание. Потом включаем обратно - видим вспышку.

Ваша строчка стоит первой в коде.

https://youtu.be/o8p23aK7XTk

 

код

 int number595 = 0;
 
#define LATCH_PIN  7
#define CLOCK_PIN  6
#define DATA_PIN  8


// Установка состояния 2х последовательных сдвиговых регистров из переменной типа uint16_t

void HC595_put(uint16_t data)
{
  //устанавливаем LOW на latchPin, чтобы начать передачу
    digitalWrite(LATCH_PIN, LOW);
    
    
    // выводим старший байт
    shiftOut(DATA_PIN, CLOCK_PIN, MSBFIRST, (data >> 8));  
    // выводим младший байт
    shiftOut(DATA_PIN, CLOCK_PIN, MSBFIRST, data); 
    //устанавливаем HIGH на latchPin, чтобы проинформировать регистр, что передача окончена.
    digitalWrite(LATCH_PIN, HIGH);
}

// Начальная настройка 
void HC595_init() {
  pinMode(LATCH_PIN, OUTPUT);
  pinMode(CLOCK_PIN, OUTPUT);
  pinMode(DATA_PIN, OUTPUT);
  HC595_put(number595);
}


void setup() {
  // put your setup code here, to run once:
HC595_init();
delay(1000);
number595 = 65535;
HC595_put(number595);
}

void loop() {}

 

b707
Offline
Зарегистрирован: 26.05.2017

Update - прошу прощения, при переносе кода в конфу взялся выкидывать комменты и немного порушил код. Сейчас исправил - выше код правильный и соответвует видео.

Это чтобы не было сомнений, почему сообщение несколько раз редактировалось.

Муж_Долговой
Муж_Долговой аватар
Offline
Зарегистрирован: 07.10.2018

Т.е. Если у меня светодиоды включаются нолём ... то я мог про вспышку при подаче напряжения и не знать. Сперва Не горят, потому что нет напряжения, потом не горят потому что 11111111, потом честно загораются при обнулении. Интересно. Сейчас в чердаке половине единички выставлю. Увидим. Обидно будет, если из за такой досадной мелочи Андриано диванным теоретиком обозвал.

Муж_Долговой
Муж_Долговой аватар
Offline
Зарегистрирован: 07.10.2018

Зачем так сложно программировать Ардуино? Совсем ничего не понятно. 

b707
Offline
Зарегистрирован: 26.05.2017

Муж_Долговой пишет:

Зачем так сложно программировать Ардуино? Совсем ничего не понятно. 

надеюсь, вы не о моем коде?

Муж_Долговой
Муж_Долговой аватар
Offline
Зарегистрирован: 07.10.2018

А о Чьём же ещё!

b707
Offline
Зарегистрирован: 26.05.2017

Муж_Долговой пишет:

А о Чьём же ещё!

\он же даже короче, чем ваш из #35.  И, на мой взгляд, проще и понятнее.

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

b707, неточности в строках 16 и 18, поправьте.

b707
Offline
Зарегистрирован: 26.05.2017

xDriver пишет:

b707, неточности в строках 16 и 18, поправьте.

в комментах  бит на байт, если вы об этом? - поправил, спасибо за подсказку

Муж_Долговой
Муж_Долговой аватар
Offline
Зарегистрирован: 07.10.2018

https://youtu.be/gyXWxR0UWUM

Это видео без предварительного обнуления. Хаос продолжается первые 21 секунду. Потом работает как надо.

Муж_Долговой
Муж_Долговой аватар
Offline
Зарегистрирован: 07.10.2018

b707 пишет:

Муж_Долговой пишет:

А о Чьём же ещё!

\он же даже короче, чем ваш из #35.  И, на мой взгляд, проще и понятнее.

Сравнил! Мой скетч управляет восьми микросхемами расширителями входов/выходов.

SLKH
Offline
Зарегистрирован: 17.08.2015

Муж_Долговой пишет:

b707 пишет:

Муж_Долговой пишет:

А о Чьём же ещё!

\он же даже короче, чем ваш из #35.  И, на мой взгляд, проще и понятнее.

Сравнил! Мой скетч управляет восьми микросхемами расширителями входов/выходов.

И очень плохо. Нарушен один из основных принципов - есть слона по кусочкам.

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

 

SLKH
Offline
Зарегистрирован: 17.08.2015

При экспериментах неплохо бы через сколько-то секунд после отключения питания реально обнулять напряжение на 595, т.е. замыкать VCC и GND пинцетом.