Модуль на 16 реле на ESP32

Всем привет! Работаю с модулем на 16 реле, в Arduino IDE определяется, скетчи загружаются. Но не могу разобраться с управлением сдвиговыми регистрами. Из описания товара с алиэкспресс выбрал пины подключения, но результата нет. По умолчанию был загружен скетч с последовательным переключением реле. Может быть кто-то с этим модулем сталкивался и знает что я делаю не так. Заранее спасибо!


```
#define LATCH_PIN 12
#define CLOCK_PIN 13
#define DATA_PIN 14
#define OE_PIN 5

void HC595Init() {
  pinMode(DATA_PIN, OUTPUT);
  pinMode(CLOCK_PIN, OUTPUT);
  pinMode(LATCH_PIN, OUTPUT);
  pinMode(OE_PIN, OUTPUT);
  digitalWrite(OE_PIN, HIGH);
  digitalWrite(DATA_PIN, LOW);
  digitalWrite(CLOCK_PIN, LOW);
  digitalWrite(LATCH_PIN, LOW);
}
void setup() {
  HC595Init();  // put your setup code here, to run once:
}

void loop() {
  byte byteToSend = 0;                                    //Создаем пустой байт B00000000
  for (int bitPos = 0; bitPos < 8; bitPos++) {            // В переменной хранится позиция изменяемого бита
    byteToSend = 0;                                       // Обнуляем байт при каждом проходе
    bitWrite(byteToSend, bitPos, HIGH);                   // При bitPos=0 получим B00000001, при bitPos=1 - B00000010, при bitPos=2 - B00000100 и т.д.
    digitalWrite(LATCH_PIN, LOW);                         // Открыли регистр
    shiftOut(DATA_PIN, CLOCK_PIN, MSBFIRST, byteToSend);  // передаем последовательно на dataPin - в первом регистре значение B01001100
    shiftOut(DATA_PIN, CLOCK_PIN, LSBFIRST, byteToSend);  // Инвертируем сигнал при помощи MSBFIRST, грузим с первого бита
    digitalWrite(LATCH_PIN, HIGH);                        /// Закрываем регистр тем самым передаем значение на выводы
    delay(150);
  }
  byteToSend = 0;  // Обнуляем байт при каждом проходе
  digitalWrite(LATCH_PIN, LOW);
  shiftOut(DATA_PIN, CLOCK_PIN, LSBFIRST, byteToSend);  // Инвертируем сигнал при помощи MSBFIRST, грузим с первого бита
  shiftOut(DATA_PIN, CLOCK_PIN, LSBFIRST, byteToSend);  // Инвертируем сигнал при помощи MSBFIRST, грузим с первого бита
  digitalWrite(LATCH_PIN, HIGH);
  delay(150);
  for (int bitPos = 0; bitPos < 8; bitPos++) {            // В переменной хранится позиция изменяемого бита
    byteToSend = 0;                                       // Обнуляем байт при каждом проходе
    bitWrite(byteToSend, bitPos, HIGH);                   // При bitPos=0 получим B00000001, при bitPos=1 - B00000010, при bitPos=2 - B00000100 и т.д.
    digitalWrite(LATCH_PIN, LOW);                         // Открыли регистр
    shiftOut(DATA_PIN, CLOCK_PIN, LSBFIRST, byteToSend);  // передаем последовательно на dataPin - в первом регистре значение B01001100
    shiftOut(DATA_PIN, CLOCK_PIN, MSBFIRST, byteToSend);  // Инвертируем сигнал при помощи MSBFIRST, грузим с первого бита
    digitalWrite(LATCH_PIN, HIGH);                        /// Закрываем регистр тем самым передаем значение на выводы
    delay(150);
  }
  byteToSend = 0;  // Обнуляем байт при каждом проходе
  digitalWrite(LATCH_PIN, LOW);
  shiftOut(DATA_PIN, CLOCK_PIN, LSBFIRST, byteToSend);  // Инвертируем сигнал при помощи MSBFIRST, грузим с первого бита
  shiftOut(DATA_PIN, CLOCK_PIN, LSBFIRST, byteToSend);  // Инвертируем сигнал при помощи MSBFIRST, грузим с первого бита
  digitalWrite(LATCH_PIN, HIGH);
  delay(150);  // Включение всех светодиодов
}
```

Ничего не понял, тут точно написано то, что написано?

image

Да, увидел. Исправил и упростил, результата нет

#define LATCH_PIN 12
#define CLOCK_PIN 13
#define DATA_PIN 14
#define OE_PIN 5

void HC595Init() {
  pinMode(DATA_PIN, OUTPUT);
  pinMode(CLOCK_PIN, OUTPUT);
  pinMode(LATCH_PIN, OUTPUT);
  pinMode(OE_PIN, OUTPUT);
  digitalWrite(OE_PIN, HIGH);
  digitalWrite(DATA_PIN, LOW);
  digitalWrite(CLOCK_PIN, LOW);
  digitalWrite(LATCH_PIN, LOW);
}
void setup() {
  HC595Init(); 
}

void loop() {
  byte byteToSend = 0;                                    
  for (int bitPos = 0; bitPos < 8; bitPos++) {     
    byteToSend = 0;                                      
    bitWrite(byteToSend, bitPos, HIGH);                 
    digitalWrite(LATCH_PIN, LOW);                      
    shiftOut(DATA_PIN, CLOCK_PIN, LSBFIRST, byteToSend);  
    digitalWrite(LATCH_PIN, HIGH);                        
    delay(150);
  }
}

Спасибо

Для включения выходов сдвигового регистра на его вход OE надо подать 0

Так что попробуйте включать выход digitalWrite(OE_PIN, LOW);

Но у меня нет такого модуля, может быть там дополнительно стоит инвертор на линии к OE? Проверьте.

1 лайк

Классный модуль, вот на чем надо самоплясные сани мастырить. Ссылко можно на него?

Действительно, при подаче 0 на OE_PIN и отправке 0b0000000000000001 реле срабатывают, но только зеркально, одновременно два

модуль на алике ищется легко по запросу esp32 16 rele))))
этот модуль кстате зависает при одновременной работе нескольких реле ? (не помню точное количество, и не помню что точно на таком модуле проблема, или на похожем, и может уже исправили, или даже в описании где то об этом написано )
и нет ссылки на модуль более дорогой где вообще все без проблем

Как по мне, лучше не полениться, и, нарисовать схему, хотя-бы упрощённо, на бумажке.
Я так всегда делаю, когда есть вопросы)).

3 лайка

Я вот такой рекомендую. Есть где развернуться.

1 лайк

Разобрался. У нас два регистра, 16 разрядов числа. Поэтому задвигаем первое число 110000000, потом второе 00000000, тогда у нас включаться только первые два реле

digitalWrite(LATCH_PIN, LOW);                      
    shiftOut(DATA_PIN, CLOCK_PIN, MSBFIRST, B11000000);
    shiftOut(DATA_PIN, CLOCK_PIN, MSBFIRST, B00000000);  
    digitalWrite(LATCH_PIN, HIGH); 
delay(1000);
    digitalWrite(LATCH_PIN, LOW);                      
    shiftOut(DATA_PIN, CLOCK_PIN, MSBFIRST, B00000000);
    shiftOut(DATA_PIN, CLOCK_PIN, MSBFIRST, B00000000);  
    digitalWrite(LATCH_PIN, HIGH); 
delay(1000);
    digitalWrite(LATCH_PIN, LOW);                      
    shiftOut(DATA_PIN, CLOCK_PIN, MSBFIRST, B00000000);
    shiftOut(DATA_PIN, CLOCK_PIN, MSBFIRST, B00000011);  
    digitalWrite(LATCH_PIN, HIGH); 
delay(1000);

спасибо всем

2 лайка