Программа для подсчёта импульсов и выбора действия в зависимости от их количества

Всем здравствуйте. Нужна помощь . Физически собран блок приемного устройства на Arduino Nano( 328p ). Его задача принимать и считать прямоугольные импульсы и по количеству подсчитанных импульсов включать ту или иную индикацию. Работает схема следующим образом: Когда поступает вызывной сигнал формируется высокий уровень сигнала receive , он поступает на вход ардуино и по условию разрешает счет прямоугольных импульсов, поступающих на вход 2. По окончанию цикла передачи сигнал receive становится логическим нулем и программа должна сравнить количество подсчитанных импульсов с промежутками значений и включить индикацию в зависимости от значения переменной count. Блок void setup отрабатывает корректно . Блок void loop корректно отрабатывает первое условие по контролю включения приемника. Дальше начинаются проблемы… Блок счетчика импульсов включается через условие , что на receive высокий уровень, это работает импульсы на мониторе порта считаются, но после переключения его на ноль программа не переходит к проверке условий, кроме того не работает сброс для состояний авария и неисправность, точнее заданное перед операндами условие ,что reset должен быть 1 игнорируется ,операнды просто выполняются по ходу программы и все. Пробывал разные способы : и через switch, и через if\ else не работает корректно. Расставлять фигурные скобки, тоже не помогает Подскажите ,пж, где ошибка, скетчи ниже.

   [   Оформите код по правилам форума   ]

delay() блокирует выполнение программы минимум в 2ух местах

Оформите код по правилам форума, иначе тема улетит в помойку.

И не забудьте опубликовать схему.

int receive=3;
int alarm1=4;
int alarm2=5;
int reset=6;//
int alarm3=7;
int selft=8;
int offcall=9;
int phone=10;
int buttonPin  = 2;     // вход счетчика
const int repeat_time = 500;  // длительность автоповтора
int count;                    // счётчик импульсов
void setup()
{
Serial.begin(9600);
pinMode(buttonPin, INPUT);
pinMode(receive, INPUT);
pinMode(alarm1, OUTPUT);
pinMode(alarm2, OUTPUT);
pinMode(reset,INPUT );
pinMode(alarm3, OUTPUT);
pinMode(selft, INPUT);
pinMode(offcall, OUTPUT);
pinMode(phone, OUTPUT);
if((digitalRead(selft) == LOW))
{digitalWrite(offcall, HIGH);
delay(3500);
digitalWrite(offcall, LOW);
delay(10000);}
}
void loop(){
{if((digitalRead(selft) == LOW))
{digitalWrite(phone, HIGH);
delay(500);
digitalWrite(phone, LOW);
delay(500);}
else digitalWrite(phone, HIGH);}  // контроль вкл.телефона

{ if(digitalRead(reset) == HIGH && digitalRead(receive) == LOW)
count=0;
// сброс неисправности и аварии
if(digitalRead(receive) == HIGH)
{if (digitalRead(buttonPin)) {
(++count);
Serial.println(count);
delay(repeat_time);
}}}

{ if((digitalRead(receive) == LOW)&&(count <= 5)&&digitalRead(reset) == LOW)
count=0;

else if((digitalRead(receive) == LOW)&&(count > 5 && count <=10)&& digitalRead(reset) == LOW)

{digitalWrite(alarm1, HIGH);
delay (8000);
digitalWrite(alarm1, LOW);
Serial.println( закрыт");
count=0;}

else if((digitalRead(receive) == LOW)&& (count > 10 && count <=19)&&digitalRead(reset) == LOW)
{digitalWrite(alarm2, HIGH);
Serial.println(“Неисправность”);
count=0;}

else if((digitalRead(receive) == LOW)&& (count > 19))
{digitalWrite(alarm3, HIGH);
Serial.println(“Авария”);
count=0;}
delay (700);}}

До 46 строки выполняется корректно. Дальше либо не переходит, либо идет сброс счетчика, хотя на входе reset 0

int receive=3;
int alarm1=4;
int alarm2=5;
int reset=6;//
int alarm3=7;
int selft=8;
int offcall=9;
int phone=10;
int buttonPin = 2; // вход счетчика
const int repeat_time = 500; // длительность автоповтора
int count; // счётчик импульсов
void setup()
{
Serial.begin(9600);
pinMode(buttonPin, INPUT);
pinMode(receive, INPUT);
pinMode(alarm1, OUTPUT);
pinMode(alarm2, OUTPUT);
pinMode(reset,INPUT );
pinMode(alarm3, OUTPUT);
pinMode(selft, INPUT);
pinMode(offcall, OUTPUT);
pinMode(phone, OUTPUT);
if((digitalRead(selft) == LOW))
{digitalWrite(offcall, HIGH);
delay(3500);
digitalWrite(offcall, LOW);
delay(10000);}
}
void loop(){
{if((digitalRead(selft) == LOW))
{digitalWrite(phone, HIGH);
delay(500);
digitalWrite(phone, LOW);
delay(500);}
else digitalWrite(phone, HIGH);} // контроль вкл.приемника

{ if(digitalRead(reset) == HIGH && digitalRead(receive) == LOW)
count=0;
digitalWrite(alarm1, LOW);
digitalWrite(alarm2, LOW);
digitalWrite(alarm3, LOW);// сброс неисправности и аварии
if(digitalRead(receive) == HIGH)
{if (digitalRead(buttonPin)) {
(++count);
Serial.println(count);
delay(repeat_time);
}}}

{ if((digitalRead(receive) == LOW)&&(digitalRead(reset) == LOW ))
switch (count) {
case 0 … 5: count=0; break;

case   6 ... 10: digitalWrite(alarm1, HIGH);
delay (8000);
 digitalWrite(alarm1, LOW);
  Serial.println("закрыто");


count=0; break;
case 11 … 19: digitalWrite(alarm2, HIGH);
Serial.println(“Неисправность”);
count=0;break;
case 20 … 30: digitalWrite(alarm3, HIGH);
Serial.println(“Авария”);
count=0;break;
delay (700);}}}

В этом коде не переходит к 50 строке, хотя компиляция всех кодов проходит

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

Да , понимаю. Сначала в setup идет запуск приемного устройства, далее в loop проверяется его включенное состояние. Далее при поступлении вызова 3 вход-1, запускается счетчик импульсов на входе 2, считает ,пока на 3- лог 1, как только на 3 лог ноль идет сравнение переменной count с промежутками чисел и появляется лог 1 на прописанных входах. Беда в том,что при 0 на 3 входе не переходит к сравнению count с промежутками чисел, да там еще добавлен вход сброса reset с ним все в порядке. Где ошибка? первый код на if, второй чере switch. Компиляцию проходят

В таком случае, Вы гений программирования и нам до Вас очень далеко. Это нам надо у Вас консультироваться.

Я, например, в этом хаосе не могу понять ничего, пока не проведу деобфускацию и не расположу блоки кода в их естественном порядке.

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

1 лайк

Ilyxa92, вставку кода ты уже освоил. Теперь освой CTRL+T в IDE Ардуино.

такое впечатление, что фигурные скобки вставлялись в хаотичном порядке, там где они нужны их нет и наоборот.
@Ilyxa92, вменяемые люди, форматируют код, примерно так

Спойлер
int receive = 3;
int alarm1 = 4;
int alarm2 = 5;
int reset = 6; //
int alarm3 = 7;
int selft = 8;
int offcall = 9;
int phone = 10;
int buttonPin = 2; // вход счетчика
const int repeat_time = 500; // длительность автоповтора
int count; // счётчик импульсов
void setup()
{
  Serial.begin(9600);
  pinMode(buttonPin, INPUT);
  pinMode(receive, INPUT);
  pinMode(alarm1, OUTPUT);
  pinMode(alarm2, OUTPUT);
  pinMode(reset, INPUT );
  pinMode(alarm3, OUTPUT);
  pinMode(selft, INPUT);
  pinMode(offcall, OUTPUT);
  pinMode(phone, OUTPUT);
  if ((digitalRead(selft) == LOW))
  { digitalWrite(offcall, HIGH);
    delay(3500);
    digitalWrite(offcall, LOW);
    delay(10000);
  }
}
void loop() {
  { if ((digitalRead(selft) == LOW))
    { digitalWrite(phone, HIGH);
      delay(500);
      digitalWrite(phone, LOW);
      delay(500);
    }
    else digitalWrite(phone, HIGH);
  } // контроль вкл.приемника

  { if (digitalRead(reset) == HIGH && digitalRead(receive) == LOW)
      count = 0;
    digitalWrite(alarm1, LOW);
    digitalWrite(alarm2, LOW);
    digitalWrite(alarm3, LOW);// сброс неисправности и аварии
    if (digitalRead(receive) == HIGH)
    { if (digitalRead(buttonPin)) {
        (++count);
        Serial.println(count);
        delay(repeat_time);
      }
    }
  }

  { if ((digitalRead(receive) == LOW) && (digitalRead(reset) == LOW ))
      switch (count) {
        case 0 … 5: count = 0; break;

        case   6 ... 10: digitalWrite(alarm1, HIGH);
          delay (8000);
          digitalWrite(alarm1, LOW);
          Serial.println("закрыто");


          count = 0; break;
        case 11 … 19: digitalWrite(alarm2, HIGH);
          Serial.println(“Неисправность”);
          count = 0; break;
        case 20 … 30: digitalWrite(alarm3, HIGH);
          Serial.println(“Авария”);
          count = 0; break;
          delay (700);
      }
  }
}

а теперь расскажите, почему строки (в этом коде) 41 и 55 начинаются с ‘{’ ?
это так цветочки, дальше будет больнее.

1 лайк

С языка снял.
@Ilyxa92 разберитесь со скобками - и может все и заработает.

int receive=3;
int alarm1=4;
int alarm2=5;
int reset=6;
int alarm3=7;
int selft=8;
int offcall=9;
int phone=10;
int buttonPin=2;
const int repeat_time=500;
int count=0;
bool lastButtonState=LOW;
bool counting=false;

void setup(){
Serial.begin(9600);
pinMode(buttonPin,INPUT);
pinMode(receive,INPUT);
pinMode(alarm1,OUTPUT);
pinMode(alarm2,OUTPUT);
pinMode(reset,INPUT);
pinMode(alarm3,OUTPUT);
pinMode(selft,INPUT);
pinMode(offcall,OUTPUT);
pinMode(phone,OUTPUT);
if(digitalRead(selft)==LOW){
digitalWrite(offcall,HIGH);
delay(3500);
digitalWrite(offcall,LOW);
delay(10000);
}
}

void loop(){
if(digitalRead(selft)==LOW){
digitalWrite(phone,HIGH);
delay(500);
digitalWrite(phone,LOW);
delay(500);
}else{
digitalWrite(phone,HIGH);
}

if(digitalRead(reset)==HIGH){
count=0;
digitalWrite(alarm1,LOW);
digitalWrite(alarm2,LOW);
digitalWrite(alarm3,LOW);
counting=false;
Serial.println("Сброс");
}

if(digitalRead(receive)==HIGH&&!counting){
counting=true;
count=0;
Serial.println("Начало подсчета");
}

if(counting){
bool currentButtonState=digitalRead(buttonPin);
if(currentButtonState==HIGH&&lastButtonState==LOW){
count++;
Serial.print("Счет: ");
Serial.println(count);
delay(repeat_time);
}
lastButtonState=currentButtonState;
}

if(digitalRead(receive)==LOW&&counting){
counting=false;
Serial.print("Итоговый счет: ");
Serial.println(count);
if(count>=6&&count<=10){
digitalWrite(alarm1,HIGH);
Serial.println("закрыто");
delay(8000);
digitalWrite(alarm1,LOW);
}else if(count>=11&&count<=19){
digitalWrite(alarm2,HIGH);
Serial.println("Неисправность");
}else if(count>=20&&count<=30){
digitalWrite(alarm3,HIGH);
Serial.println("Авария");
}
count=0;
delay(700);
}
}

а case 6 … 10: это что ?))) может ваш ии не полный код дал ?))) вооо может поможет

не поможет удерживайте кнопку нажатой в течении 8 секунд, это если делай блокирует выполнение другой части кода…