Помогите новичку или направьте в нужном направлении)))

Отправляйте не постоянно, а каждую секунду.

Горе от ума какое-то! Чего тут придумывать? Делайте в лоб! Как написали, точно так и делайте. Тоже мне - бином ньютона.

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

новое_значение = <функция получния нового значения>;
ЕСЛИ старое_значение != новое_значение ТО
      старое_значение = новое_значение;
      отправить_чего_там_надо_по_I2C
КОНЕЦ_ЕСЛИ

Вот и всё, отправляется только когда поменялось, чего тут огород на пустом месте городить?

2 лайка

Можете ещё прерывание PCINT использовать

1 лайк

Замечательно!
Новичку, который не может составить простейшее логическое выражение, сразу советовать с головой окунаться в аппаратные прерывания. При том не просто в прерывания, а в прерывания, которые отсутствуют в системе Ардуино.
Тем более, что у ТС:

1 лайк

Да, протупил я здесь, спасибо поправили

1 лайк

Держаться больше нету сил :grinning: Накидал вчера код, мои мысли совпали с мыслями Pyotr и Евгением Петровичем. Симуляция в wokwi. Не STM, но, вроде, должно переноситься.

Только для наглядности лучше писать в двоичном виде

  if (value != oldValue) {
    switch (value) {
      case 0b0101:
        digitalWrite(outputPin, LOW);
      break;
      case 0b1010:
        digitalWrite(outputPin, HIGH);
      break;
    }

Так будет сразу видно, в каких положениях переключателей включается/выключается

3 лайка

В общем всем спасибо за помощь))) Тема закрыта))) Устал я мучаться и сделал все в FLProg, три минуты и все готово, среда графического программирования рулит однозначно))) Все работает теперь как часики, вот что она написала:

#include “flprogUtilites.h”
#include <Wire.h>
#include <GyverOLED.h>
bool _FreeLog1_IArr[4];
bool _FreeLog1_Q1_StArr = {0, 0, 0, 0};
bool _FreeLog1_Q2_StArr = {1, 0, 0, 0};
bool _FreeLog1_Q3_StArr = {0, 1, 1, 0};
bool _FreeLog1_Q4_StArr = {0, 1, 0, 0};
bool _FreeLog1_Q5_StArr = {1, 1, 1, 0};
bool _FreeLog1_Q6_StArr = {1, 1, 0, 0};
bool _FreeLog1_Q7_StArr = {0, 0, 1, 0};
bool _FreeLog1_Q8_StArr = {1, 0, 1, 0};
bool _FreeLog1_Q9_StArr = {0, 0, 0, 1};
bool _FreeLog1_Q10_StArr = {1, 0, 0, 1};
GyverOLED<SSD1306_128x64, OLED_BUFFER> oled;
bool EN_221112351_1;
String in_221112351_1;
byte size_221112351_1;
byte x_221112351_1;
byte y_221112351_1;
bool EN_221112351_2;
String in_221112351_2;
byte size_221112351_2;
byte x_221112351_2;
byte y_221112351_2;
bool EN_221112351_3;
String in_221112351_3;
byte size_221112351_3;
byte x_221112351_3;
byte y_221112351_3;
bool EN_221112351_4;
String in_221112351_4;
byte size_221112351_4;
byte x_221112351_4;
byte y_221112351_4;
bool EN_221112351_5;
String in_221112351_5;
byte size_221112351_5;
byte x_221112351_5;
byte y_221112351_5;
bool EN_221112351_6;
String in_221112351_6;
byte size_221112351_6;
byte x_221112351_6;
byte y_221112351_6;
bool EN_221112351_7;
String in_221112351_7;
byte size_221112351_7;
byte x_221112351_7;
byte y_221112351_7;
bool EN_221112351_8;
String in_221112351_8;
byte size_221112351_8;
byte x_221112351_8;
byte y_221112351_8;
bool EN_221112351_9;
String in_221112351_9;
byte size_221112351_9;
byte x_221112351_9;
byte y_221112351_9;
bool EN_221112351_10;
String in_221112351_10;
byte size_221112351_10;
byte x_221112351_10;
byte y_221112351_10;
bool _FreeLog1_Q1 = 0;
bool _FreeLog1_Q2 = 0;
bool _FreeLog1_Q3 = 0;
bool _FreeLog1_Q4 = 0;
bool _FreeLog1_Q5 = 0;
bool _FreeLog1_Q6 = 0;
bool _FreeLog1_Q7 = 0;
bool _FreeLog1_Q8 = 0;
bool _FreeLog1_Q9 = 0;
bool _FreeLog1_Q10 = 0;
void setup()
{
pinMode(16, INPUT);
pinMode(15, INPUT);
pinMode(14, INPUT);
pinMode(13, INPUT);
Wire.begin();
oled.init();
oled.clear();
oled.update();
delay(2000);
}
void loop()
{
//Плата:1
_FreeLog1_IArr[0] = (digitalRead (16));
_FreeLog1_IArr[1] = (digitalRead (15));
_FreeLog1_IArr[2] = (digitalRead (14));
_FreeLog1_IArr[3] = (digitalRead (13));
_FreeLog1_Q1 = _checkFreeLogicBlockOutput(_FreeLog1_IArr, 4, _FreeLog1_Q1_StArr, 4);
_FreeLog1_Q2 = _checkFreeLogicBlockOutput(_FreeLog1_IArr, 4, _FreeLog1_Q2_StArr, 4);
_FreeLog1_Q3 = _checkFreeLogicBlockOutput(_FreeLog1_IArr, 4, _FreeLog1_Q3_StArr, 4);
_FreeLog1_Q4 = _checkFreeLogicBlockOutput(_FreeLog1_IArr, 4, _FreeLog1_Q4_StArr, 4);
_FreeLog1_Q5 = _checkFreeLogicBlockOutput(_FreeLog1_IArr, 4, _FreeLog1_Q5_StArr, 4);
_FreeLog1_Q6 = _checkFreeLogicBlockOutput(_FreeLog1_IArr, 4, _FreeLog1_Q6_StArr, 4);
_FreeLog1_Q7 = _checkFreeLogicBlockOutput(_FreeLog1_IArr, 4, _FreeLog1_Q7_StArr, 4);
_FreeLog1_Q8 = _checkFreeLogicBlockOutput(_FreeLog1_IArr, 4, _FreeLog1_Q8_StArr, 4);
_FreeLog1_Q9 = _checkFreeLogicBlockOutput(_FreeLog1_IArr, 4, _FreeLog1_Q9_StArr, 4);
_FreeLog1_Q10 = _checkFreeLogicBlockOutput(_FreeLog1_IArr, 4, _FreeLog1_Q10_StArr, 4);
EN_221112351_10 = _FreeLog1_Q10;
in_221112351_10 = String(“768.0”);
size_221112351_10 = 2;
x_221112351_10 = 1;
y_221112351_10 = 1;
if (EN_221112351_10==1)
{
oled.setCursorXY(x_221112351_10, y_221112351_10);
oled.setScale(size_221112351_10);
oled.print(in_221112351_10);
oled.update();
}
EN_221112351_6 = _FreeLog1_Q9;
in_221112351_6 = String(“705.6”);
size_221112351_6 = 2;
x_221112351_6 = 1;
y_221112351_6 = 1;
if (EN_221112351_6==1)
{
oled.setCursorXY(x_221112351_6, y_221112351_6);
oled.setScale(size_221112351_6);
oled.print(in_221112351_6);
oled.update();
}
EN_221112351_7 = _FreeLog1_Q8;
in_221112351_7 = String(“384.0”);
size_221112351_7 = 2;
x_221112351_7 = 1;
y_221112351_7 = 1;
if (EN_221112351_7==1)
{
oled.setCursorXY(x_221112351_7, y_221112351_7);
oled.setScale(size_221112351_7);
oled.print(in_221112351_7);
oled.update();
}
EN_221112351_8 = _FreeLog1_Q7;
in_221112351_8 = String(“352.8”);
size_221112351_8 = 2;
x_221112351_8 = 1;
y_221112351_8 = 1;
if (EN_221112351_8==1)
{
oled.setCursorXY(x_221112351_8, y_221112351_8);
oled.setScale(size_221112351_8);
oled.print(in_221112351_8);
oled.update();
}
EN_221112351_5 = _FreeLog1_Q6;
in_221112351_5 = String(“192.0”);
size_221112351_5 = 2;
x_221112351_5 = 1;
y_221112351_5 = 1;
if (EN_221112351_5==1)
{
oled.setCursorXY(x_221112351_5, y_221112351_5);
oled.setScale(size_221112351_5);
oled.print(in_221112351_5);
oled.update();
}
EN_221112351_9 = _FreeLog1_Q5;
in_221112351_9 = String(“176.4”);
size_221112351_9 = 2;
x_221112351_9 = 1;
y_221112351_9 = 1;
if (EN_221112351_9==1)
{
oled.setCursorXY(x_221112351_9, y_221112351_9);
oled.setScale(size_221112351_9);
oled.print(in_221112351_9);
oled.update();
}
EN_221112351_4 = _FreeLog1_Q4;
in_221112351_4 = String(" 96.0");
size_221112351_4 = 2;
x_221112351_4 = 1;
y_221112351_4 = 1;
if (EN_221112351_4==1)
{
oled.setCursorXY(x_221112351_4, y_221112351_4);
oled.setScale(size_221112351_4);
oled.print(in_221112351_4);
oled.update();
}
EN_221112351_3 = _FreeLog1_Q3;
in_221112351_3 = String(" 88.2");
size_221112351_3 = 2;
x_221112351_3 = 1;
y_221112351_3 = 1;
if (EN_221112351_3==1)
{
oled.setCursorXY(x_221112351_3, y_221112351_3);
oled.setScale(size_221112351_3);
oled.print(in_221112351_3);
oled.update();
}
EN_221112351_2 = _FreeLog1_Q2;
in_221112351_2 = String(" 48.0");
size_221112351_2 = 2;
x_221112351_2 = 1;
y_221112351_2 = 1;
if (EN_221112351_2==1)
{
oled.setCursorXY(x_221112351_2, y_221112351_2);
oled.setScale(size_221112351_2);
oled.print(in_221112351_2);
oled.update();
}
EN_221112351_1 = _FreeLog1_Q1;
in_221112351_1 = String(" 44.1");
size_221112351_1 = 2;
x_221112351_1 = 1;
y_221112351_1 = 1;
if (EN_221112351_1==1)
{
oled.setCursorXY(x_221112351_1, y_221112351_1);
oled.setScale(size_221112351_1);
oled.print(in_221112351_1);
oled.update();
}
}
bool _checkFreeLogicBlockOutput(bool inArray, int inArraySize, bool stArray, int stArraySize)
{
int inIndex = 0;
bool result = 1;
for (int i = 0; i < stArraySize; i = i + 1)
{
if (!(inArray[inIndex] == stArray[i]))
{
result = 0;
}
inIndex ++;
if (inIndex == inArraySize)
{
if (result)
{
return 1;
}
else
{
result = 1;
}
inIndex = 0;
}
}
return 0;
}

Жесть какая :roll_eyes:

2 лайка

Зато работает как часы)))

Код из сообщения #26 тоже работает как часы. И всего три десятка строк. Читаемых.

А зачем тебе часы?

Так я ж не спорю))) просто для меня так быстрее намного, тут если отбросить индикацию на дисплей, тоже строчек 30 выходит, все сделано через массивы. Но для себя на досуге все равно разберусь как это ручками написать. Кстати, а почему это не работает?
,
if ( fs11 == 1, fs22 == 0, fs33 == 0, fs44 == 0) freg = 2;
,
переменная freg не меняет значение, что не так с этим действием? как оно должно быть правильно написанно?

Если нужно, чтобы выполнялись все условия, то

if ( fs11 == 1 && fs22 == 0 && fs33 == 0 && fs44 == 0) freg = 2;

Если нужно, чтобы выполнялось хотя бы одно условие, то

if ( fs11 == 1 || fs22 == 0 || fs33 == 0 || fs44 == 0) freg = 2;

Логические операторы

1 лайк

Понял))) огромное спасибо))) теперь все будет работать как надо с кодом из 26-го сообщения, считываем состояния пинов в 4 переменные, потом ставим условия на эти переменные, если значения в условии соответствуют, то присваиваем определенное значение еще одной переменной, а потом уже ее через switch… case, и все будет отлично)))

Всем еще раз спасибо))) Вот что получилось в итоге

Ужас.
Вообще-то: “считываем состояния пинов в одну переменную, выделяем нужные биты по маске и сравниваем с требуемыми значениями прямо в операторе switch”.

Ну тема же для новичков))) предложенное я еще не умею, как научусь, буду использовать, а пока так, результат все равно устраивает

Так в посте #26 именно это и делается ))

Не совсем.
Там сначала 4 раз читается один и тот же порт, чтобы добыть из него по одному биту за раз.
Затем добытые биты вновь объединяются в единственной переменной.
Имелось ввиду что-то вроде switch (PIND & mask)...