#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 скомпилировать ![]()
а когда говоришь людям, чтобы различали “оно не работает” и “я не смог запустить” - они обижаются
Нет, правда. Pcf имеют силу только в low. 23017 и в low, и в high. Удобство ж очевидно в пользу 2го
Я не понимаю смысла этой фразы. Возможно, так оно и есть.
я вспомнил, там верхний ключ ограничен током в 100 мкА.
в постах 3 и 5 выше ![]()
Так третий пост мой как раз.
Мне непонятна фраза
Звучит как “мавки имеют силу только русальную неделю”. Имеется в виду, что может управлять только землёй? Если так, то мне непонятно чем это плохо.