Работа с PCF8575


#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);
#include "PCF8575.h"

// Настройки адреса и размеров
PCF8575 pcf(0x26);

const byte ROWS = 5; 
const byte COLS = 4;

// Пины согласно вашему заданию
byte rowPins[ROWS] = {4, 5, 6, 7, 8}; // Строки P6-P10
byte colPins[COLS] = {3, 2, 1, 0};    // Столбцы P3-P0

// Раскладка клавиш
const char* keys[ROWS][COLS] = {
  {"F1","F2","#","*"},
  {"1","2","3","Up"},
  {"4","5","6","Down"},
  {"7","8","9","Esc"},
  {"Left","0","Right","Ent"}
};


//************ ПЕРЕМЕННЫЕ ************************
char* currentWord = ""; // **** Переменная нажатой кнопки ******
bool keyPressed = false;
byte Reg = 0; //*** Режим (сушка-1, копчение-2, варка-3) ***
boolean st_st = 0; //*** старт-1  стоп-0 ********
byte T_k = 45; //**** заданная температура в камере ***
byte T_pr = 30; //**** заданная температура продукта ***
byte Vlaga = 0; //**** заданная влажность ******
boolean R5_ten = 0, R6_vent = 0, R7_voda = 0, R8_1Z = 0, R9_2Z = 0, R10_3Z = 0; // *** Значения сигналов на пины ***
byte Cifra; // *** Оцифрованное зачение нажатой кнопки ***
char* Opc_LCD = "F1"; // Какую экранную опцию выбрали

//******************************************************







void setup()  {
  Serial.begin(9600);
   Wire.begin();
    Wire.setClock(5000); // Понижение скорости шины I2C до 50 кГц
     Wire.setWireTimeout(10000, true); // Сброс шины I2C при ошибке длительностью 10 миллисекунд
  lcd.init();
 lcd.backlight();
 lcd.clear();

//  ********* Подготовк клавиатуры *******************
if (pcf.begin()) {
    Serial.println("Клавиатура готова!");
  } else {
    Serial.println("Ошибка: PCF8575 не найден!");
    while(1); // Останавливаемся, если чип не отвечает
  }

  // Для PCF8575: чтобы пин работал на чтение (вход), 
  // в него нужно записать HIGH.
  pcf.write16(0xFFFF); 
//***************************************************************************

// ******  Присваеваем назначение пинам вывода и ставим LOW ****************
for (byte i = 5; i < 11; i++) {
   pinMode (i, OUTPUT);  digitalWrite(i, LOW);   }
//************************************************************

lcd.setCursor(6, 1);
lcd.print("HELLO!!!");
lcd.setCursor(8, 2);
lcd.print("BABY");
delay(3000);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Input MODE: ");



}

void loop()  {




// ******* Раздел опроса клавиатуры ********************
 // Сбрасываем флаг перед сканированием
  keyPressed = false;

  // Сканирование матрицы
  for (byte r = 0; r < ROWS; r++) {
    pcf.write(rowPins[r], LOW);
    
    for (byte c = 0; c < COLS; c++) {
      if (pcf.read(colPins[c]) == LOW) {
        // Если кнопка нажата, записываем слово в глобальную переменную
        currentWord = keys[r][c];
          Cifra = atoi(currentWord); // Присваеваем значени если нажата цифра, остальное "0"
        keyPressed = true;
  // Ждем отпускания кнопки прямо здесь
        while(pcf.read(colPins[c]) == LOW) { 
          delay(10); 
        }
      }
    }
    pcf.write(rowPins[r], HIGH);
  }

  // Если за цикл была нажата кнопка — выводим на экран
  if (keyPressed) {
  
   //*********  Опция 
   if (Opc_LCD == "F1") {

      if (currentWord == "1") {
    lcd.setCursor(11, 0);
     lcd.print(" SUSHKA  ");
      Reg = 1; }
      if (currentWord == "2") {
    lcd.setCursor(11, 0);
     lcd.print("Kopchenie"); 
      Reg = 2; }
       if (currentWord == "3") {
    lcd.setCursor(11, 0);
     lcd.print(" Varka   "); 
      Reg = 3; }
   }
    
    lcd.setCursor(0, 2);
    lcd.print(">> ");
    lcd.print(Cifra);
    
    delay(200); // Защита от дребезга
  }
  //*********************************************************

if (Cifra == 1) Cifra = 10;
digitalWrite(Cifra, HIGH); Serial.println(Cifra);
if (currentWord == "Ent") {
  for (byte i = 5; i < 11; i++) {  digitalWrite(i, LOW);  }
}

//********** Выбор режимов работы ****************






Serial.println(currentWord);


} // ************ END *******

кажись вышло

Забыл. На принципиалке не указан LCD2004 на шине I2C.

Не разглядел.(

Я не могу подать HIGH на пины. он виснет через несколько сек

Не, всё норм. Это я стормозил.(

А тут можно подробнее, О чем речь, о клавиатуре? Кто “он” который зависает?

С реле непонятно. Что коммутируют? 24 вольта для кого?
Зачем защита на I2C? Или PCF вынесен во вне?

зависает нано

На схеме нет исполнительных устройств. Это актуаторы с переменной полярностью

Работал с pcf8574, правда. Не рекомендую. 23017, как рекомендовали выше, самое оно.

Только они быстро работать не умеют. Для кнопок подойдут. Что-то быстрое - ловят фризы. Пробовал разгонять i2c, не помогло

С зависанием и самопроизвольным нажатием разобрался.

Все банально. Только не подкалывайте.

Плату от гавна лучше мыть надо. Флюс который ничего не проводит, очень даже проводит. Я то ее конечно помыл 646-м, но возле PCF остался налет.

Потом вообще нашел критический залет. Что на схеме, что на плате. +5В на SSR пришелся у меня на катод. Отрезал, перемычки поставил. Заработало.

Но вот с 24В-м каналом пока не очень. Но пока косяки явные устраню и начну там шурудить.

шота они стоят в популярных I2C модулях дисплея 1602 и никто не жалуется.

Напомнило, как на старом форуме Logic рекомендовал всем переделывать свои проекты на том основании, что не сумел alloca скомпилировать :slight_smile:

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

Нет, правда. Pcf имеют силу только в low. 23017 и в low, и в high. Удобство ж очевидно в пользу 2го

Я не понимаю смысла этой фразы. Возможно, так оно и есть.

я вспомнил, там верхний ключ ограничен током в 100 мкА.

в постах 3 и 5 выше :slight_smile:

Так третий пост мой как раз.

Мне непонятна фраза

Звучит как “мавки имеют силу только русальную неделю”. Имеется в виду, что может управлять только землёй? Если так, то мне непонятно чем это плохо.