Сигналка

ssipk
Offline
Зарегистрирован: 09.07.2021

Всем привет! Прошу помощи со скетчем. Уже давно им занимаюсь , но не могу дать ладу. Итак:

При подаче питания  на ардуино и нажатия кнопки на пульте on/off, микроконтроллер опрашивает порты с 12 по 19 и сохраняет их состояние в массив arr(напримет 12, 14, 16 высокий уровень сигнала, остальные низкий). После чего запускается цикл loop который который снова опрашивает эти же порты(т.е. постоянно следит за их состоянием и сравнивает с эталонным, что записано в setup в массив arr.)и если оно отличается, что срабатывает тревога и на пин 3 подается высокий уровень. 

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

#include "IRremote.h"  //библиотека работы с ик приёмником
IRrecv irrecv(2);      // на этом пине висит ИК приёмник
decode_results results;   // декодирование сигнала с ИК приемника
int led1=0;               // Включает и выключает сигнализацию
//int led2=0;             // пока в резерве

int vhod0 = A0;            //присваиваю переменным пины для удобства
int vhod1 = A1;
int vhod2 = A2;
int vhod3 = A3;
int vhod4 = A4;
int vhod5 = A5;
int vhod6 = 13;
int vhod7 = 12;

//исходящие сигналы с пинов ардуино на микросхему ULN2803 
int signal0 = 3;
int signal1 = 4;
int signal2 = 5;
int signal3 = 6;
int signal4 = 7;
int signal5 = 8;
int signal6 = 9;
int signal7 = 10;

int arr [8]; //определяем массив на 8 элементов


void setup() {


  Serial.begin(9600);
  for (int i = 12; i <= 19; i++) // тут я опрашиваю с помощью цикла пины и сохраняю их состояние(коллекцию) в массив 
  {
    pinMode(i, INPUT);           // назначаю i как вход и опрашиваю пины
    arr[i - 12] = digitalRead(i); // с 12го пина по 19 записую в массив их состояние
  }

  
 
}

void loop() {
if ( irrecv.decode( &results )) { 
    Serial.println(results.value, HEX); //вывожу на монитор код нажатой кнопки пульта
}
//**************************
  if (results.value==0xFF30CF&&led1==0){   
   for (int i = 13; i <= 19; i++)
  {
    if (arr[i - 13] != digitalRead(i))   // тут я снова с помощью цикла сравниваю состояние пинов с сохранённым в массиве
    {
      digitalWrite( signal0, HIGH );led1=1;results.value=0; //включаем сирену и вызываем спецназ
      digitalWrite( signal1, HIGH );led1=1;results.value=0; //включаем сирену и вызываем спецназ
      digitalWrite( signal2, HIGH );led1=1;results.value=0; //включаем сирену и вызываем спецназ
      digitalWrite( signal3, HIGH );led1=1;results.value=0; //включаем сирену и вызываем спецназ
      digitalWrite( signal4, HIGH );led1=1;results.value=0; //включаем сирену и вызываем спецназ
      digitalWrite( signal5, HIGH );led1=1;results.value=0; //включаем сирену и вызываем спецназ
      digitalWrite( signal6, HIGH );led1=1;results.value=0; //включаем сирену и вызываем спецназ
      digitalWrite( signal7, HIGH );led1=1;results.value=0; //включаем сирену и вызываем спецназ
    }
  }
  }
if (results.value==0xFF30CF&&led1==1){
      digitalWrite( signal0,  LOW  );led1=0;results.value=0; //выключаем сирену  
      digitalWrite( signal1,  LOW  );led1=0;results.value=0; //выключаем сирену  
      digitalWrite( signal2,  LOW  );led1=0;results.value=0; //выключаем сирену 
      digitalWrite( signal3,  LOW  );led1=0;results.value=0; //выключаем сирену    
      digitalWrite( signal4,  LOW  );led1=0;results.value=0; //выключаем сирену 
      digitalWrite( signal5,  LOW  );led1=0;results.value=0; //выключаем сирену 
      digitalWrite( signal6,  LOW  );led1=0;results.value=0; //выключаем сирену 
      digitalWrite( signal7,  LOW  );led1=0;results.value=0; //выключаем сирену 
  
  
}   

  
}

 

b707
Онлайн
Зарегистрирован: 26.05.2017

Какая помощь требуется? Что работает не так? Задавайте конкретные вопросы, просто так тратить время на переписывание вашего кода никто не будет.

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Каковы критерии «нормального состояния»?

ssipk
Offline
Зарегистрирован: 09.07.2021

"Каковы критерии «нормального состояния»?"  Что вы имеете ввиду?

Я не пойму почему , но не работает скетч!

Каждый раз по разному вылезают косяки.

Должно быть так:

8 входов. Их опрашивает цикл и сохраняет в массив состояние каждого входа {0, 0, 0, 1, 1, 0,1, 1} - например

вторым циклом в loop он сравнивает состоян7ие датчиков с коллекцией в массиве и если они отличаются, то срабатывает сигнализация.

У меня же или постоянно "0" все коллекции или же "1" и не реагирует никак на изменение напряжения на вход ардуино.  Вообщем не работает !(. 

Я не прошу Вас написать за меня скетч, прошу помочь объяснить где ошибка! Делаю тоже самое на C# в visualstudio (в качестве датчиков использую ввод с консоли - все работает) тут гад не хочет.

v258
Offline
Зарегистрирован: 25.05.2020

Может быть это потому, что вы хрен знает что считываете и хрен знает с чем сравниваете? Посмотрите внимательно на это и скажите, в каком конкретно месте вы считываете, например, состояние пина А4?

static const uint8_t A0 = 18;
static const uint8_t A1 = 19;
static const uint8_t A2 = 20;
static const uint8_t A3 = 21;
static const uint8_t A4 = 22;
static const uint8_t A5 = 23;

Ну и в догонку - а подтяжку пинов не забыли сделать?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

ssipk, почему у Вас в строке 35 [i-12], а в строке 51 [i-13]?

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

andriano пишет:

ssipk, почему у Вас в строке 35 [i-12], а в строке 51 [i-13]?


Сережа С выучил так, что советы давать решил? Малацца. Пока - неуд. Циклы разные

ssipk
Offline
Зарегистрирован: 09.07.2021

ssipk пишет:

Всем привет! Прошу помощи со скетчем. Уже давно им занимаюсь , но не могу дать ладу. Итак:

При подаче питания  на ардуино и нажатия кнопки на пульте on/off, микроконтроллер опрашивает порты с 12 по 19 и сохраняет их состояние в массив arr(напримет 12, 14, 16 высокий уровень сигнала, остальные низкий). После чего запускается цикл loop который который снова опрашивает эти же порты(т.е. постоянно следит за их состоянием и сравнивает с эталонным, что записано в setup в массив arr.)и если оно отличается, что срабатывает тревога и на пин 3 подается высокий уровень. 

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

#include "IRremote.h"  //библиотека работы с ик приёмником
IRrecv irrecv(2);      // на этом пине висит ИК приёмник
decode_results results;   // декодирование сигнала с ИК приемника
int led1=0;               // Включает и выключает сигнализацию
//int led2=0;             // пока в резерве

int vhod0 = A0;            //присваиваю переменным пины для удобства
int vhod1 = A1;
int vhod2 = A2;
int vhod3 = A3;
int vhod4 = A4;
int vhod5 = A5;
int vhod6 = 13;
int vhod7 = 12;

//исходящие сигналы с пинов ардуино на микросхему ULN2803 
int signal0 = 3;
int signal1 = 4;
int signal2 = 5;
int signal3 = 6;
int signal4 = 7;
int signal5 = 8;
int signal6 = 9;
int signal7 = 10;

int arr [8]; //определяем массив на 8 элементов


void setup() {


  Serial.begin(9600);
  for (int i = 12; i <= 19; i++) // тут я опрашиваю с помощью цикла пины и сохраняю их состояние(коллекцию) в массив 
  {
    pinMode(i, INPUT);           // назначаю i как вход и опрашиваю пины
    arr[i - 12] = digitalRead(i); // с 12го пина по 19 записую в массив их состояние
  }

  
 
}

void loop() {
if ( irrecv.decode( &results )) { 
    Serial.println(results.value, HEX); //вывожу на монитор код нажатой кнопки пульта
}
//**************************
  if (results.value==0xFF30CF&&led1==0){   
   for (int i = 12; i <= 19; i++)
  {
    if (arr[i - 12] != digitalRead(i))   // тут я снова с помощью цикла сравниваю состояние пинов с сохранённым в массиве
    {
      digitalWrite( signal0, HIGH );led1=1;results.value=0; //включаем сирену и вызываем спецназ
      digitalWrite( signal1, HIGH );led1=1;results.value=0; //включаем сирену и вызываем спецназ
      digitalWrite( signal2, HIGH );led1=1;results.value=0; //включаем сирену и вызываем спецназ
      digitalWrite( signal3, HIGH );led1=1;results.value=0; //включаем сирену и вызываем спецназ
      digitalWrite( signal4, HIGH );led1=1;results.value=0; //включаем сирену и вызываем спецназ
      digitalWrite( signal5, HIGH );led1=1;results.value=0; //включаем сирену и вызываем спецназ
      digitalWrite( signal6, HIGH );led1=1;results.value=0; //включаем сирену и вызываем спецназ
      digitalWrite( signal7, HIGH );led1=1;results.value=0; //включаем сирену и вызываем спецназ
    }
  }
  }
if (results.value==0xFF30CF&&led1==1){
      digitalWrite( signal0,  LOW  );led1=0;results.value=0; //выключаем сирену  
      digitalWrite( signal1,  LOW  );led1=0;results.value=0; //выключаем сирену  
      digitalWrite( signal2,  LOW  );led1=0;results.value=0; //выключаем сирену 
      digitalWrite( signal3,  LOW  );led1=0;results.value=0; //выключаем сирену    
      digitalWrite( signal4,  LOW  );led1=0;results.value=0; //выключаем сирену 
      digitalWrite( signal5,  LOW  );led1=0;results.value=0; //выключаем сирену 
      digitalWrite( signal6,  LOW  );led1=0;results.value=0; //выключаем сирену 
      digitalWrite( signal7,  LOW  );led1=0;results.value=0; //выключаем сирену 
  
  
}   

  
}

 

ssipk
Offline
Зарегистрирован: 09.07.2021

это я тупанул когда сюда писал ИСПРАВИЛ

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Вы так и не написали - подтяжка имеется внешняя или нет?

ssipk
Offline
Зарегистрирован: 09.07.2021

подтяжка через резистор 10К на землю

sadman41
Offline
Зарегистрирован: 19.10.2016

Почему решили, что не срабатывает? Может быть срабатывает, но очень быстро?

В каждую ветку операторов if() вставьте отладочный Serial.println() и проверьте...

lilik
Offline
Зарегистрирован: 19.10.2017

Мельком глянул скетч, как недоучка заметил, что у вас 64 строка своим условием сразу отсекает предыдущее. То есть если что то сработало, то тут же и выключилось, а вы ничего не почувствовали :-)

ssipk
Offline
Зарегистрирован: 09.07.2021

Мельком глянул скетч, как недоучка заметил, что у вас 64 строка своим условием сразу отсекает предыдущее. То есть если что то сработало, то тут же и выключилось, а вы ничего не почувствовали :-)

int led1=0;               // Включает и выключает сигнализацию
 

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Для повторного отлова не хватает

irrecv.resume()
After receiving, this must be called to reset the receiver and prepare it to receive another code.

b707
Онлайн
Зарегистрирован: 26.05.2017

Ssipk
Ничего подобного. Между строчками 48 и 64 вы код с приемника не читаете, поэтому используется прежний. У вас на включение и выключение код одинаковый, поэтому стоит в 48стр что-то включить, как оно в 64 тут же выключится, буквально через миллисекунду

И еще - если вы сами не можете разобраться и пришли с проблемой на форум - не надо спорить с теми, кто хочет помочь.. По коду очевидно, что в программировании вы ноль, так что слушайте что вам говорят

lilik
Offline
Зарегистрирован: 19.10.2017

ssipk пишет:

Мельком глянул скетч, как недоучка заметил, что у вас 64 строка своим условием сразу отсекает предыдущее. То есть если что то сработало, то тут же и выключилось, а вы ничего не почувствовали :-)

int led1=0;               // Включает и выключает сигнализацию
 

 

Может и ошибаюсь :-)

Просто на другом форуме мне давно заметили на недопустимость писания подряд if без else. Пару раз наколовшись я разобрался когда можно, а когда нет. Вы тоже разберётесь.

b707
Онлайн
Зарегистрирован: 26.05.2017

Lilik, в if без else ничего страшного нет, если правильно расставить скобки. Насколько я вижу, у ТС в этом проблемы нет.

sadman41
Offline
Зарегистрирован: 19.10.2016

b707 пишет:
Ssipk
Ничего подобного. Между строчками 48 и 64 вы код с приемника не читаете, поэтому используется прежний. У вас на включение и выключение код одинаковый, поэтому стоит в 48стр что-то включить, как оно в 64 тут же выключится, буквально через миллисекунду

Ну, он там обнуляет value, однако подход к построению кода такой, что объяснить что там глючит, примерно то же самое, что объяснять, почему иногда, если бить по ноге палкой, она ломается, а иногда нет.

lilik
Offline
Зарегистрирован: 19.10.2017

sadman41 пишет:
b707 пишет:
Ssipk Ничего подобного. Между строчками 48 и 64 вы код с приемника не читаете, поэтому используется прежний. У вас на включение и выключение код одинаковый, поэтому стоит в 48стр что-то включить, как оно в 64 тут же выключится, буквально через миллисекунду
Ну, он там обнуляет value, однако подход к построению кода такой, что объяснить что там глючит, примерно то же самое, что объяснять, почему иногда, если бить по ноге палкой, она ломается, а иногда нет.

Точно, обнуляет, тогда 64 строка должна не срабатывать сразу после 63 :-(

А зачем он обнуляет value? ТС попробуйте не обнулять, добавить "элсе" перед 64-чисто для проверки гипотезы. 

lilik
Offline
Зарегистрирован: 19.10.2017

И скобку из 46 переставить в 76.

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Т.е. то что опрос идёт только если с пульта пришла команда, это нормально ?

Зачем столько раз повторять одни и те же команды ?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

wdrakula пишет:
andriano пишет:

ssipk, почему у Вас в строке 35 [i-12], а в строке 51 [i-13]?

Сережа С выучил так, что советы давать решил? Малацца. Пока - неуд. Циклы разные

Кто о чем, а вшивый о бане!

Влад, ты первый в теме, кто заинтересовался именно Си.

Не нужно быть специалистом по Си, чтобы понять, что 35 строке значение прочитанное с пина i заносится в [i-12]-ю ячейку массива, а в строке 51 значение с того же самого пина сравнивается уже с [i-13]-й ячейкой.

Вот я и поинтересовался, почему такой разнобой.

Если ты в состоянии ответить на мой вопрос, я внимательно слушаю, а если нет, к чему было влезать в тему с не относящимися к ней замечаниями?