#1 2020-12-09 20:18:20

ssipk
Учасник
Зареєстрований: 2019-02-21
Повідомлень: 19

опрос портов ардуино

Добрый день. Нужна помощь. Электронную часть я уже сделал, но не знаю как программно это прописать.
Мне нужно, чтоб при включении с пульта микроконтроллер  опрашивал все 8 входящих портов и сохранял их значения в каких-то переменных. (На каких-то портах будет высокий уровень сигнала , а на каких-то низкий(в этом то у меня и сложность )). После того как он опросил порты и присвоил их значение(высокий или низкий уровень) переменным ,он(микроконтроллер) должен и дальше следить за состоянием портов и если какой либо из них изменит своё  состояние(с высокого на низкий уровень или на оборот), то на исходящем пине d4 - d9(например) будет высокий уровень сигнала. Вторая кнопка пульта отключает ардуино (т.е. при её нажатии как по типу сигнализации первая кнопка включает слежение за портами , а вторая отключает(т.е. ели её нажать то на исходящих портах d4-d9 не будет высокого уровня сигнала)).
У меня скетч вот такой:

#include <IRremote.h> // подключаем библиотеку для IR приемника

IRrecv irrecv(13); // указываем пин, к которому подключен IR приемник
decode_results results;


//---------------------------------------------------------
int led1=0;//Две переменные хранящие в себе информацию с датчика
int led2=0;// Эти две переменные хранят состояние включения и отключения (постановки снятия с сигнализации)

//входящие сигналы с юсб на пины ардуино
int vhod0 = A0;
int signal0 = 13;

//исходящие сигналы с пинов ардуино на микросхему бузера

int signal1 = 3;

void setup() {
// установка пинов на входящий сигнал

irrecv.enableIRIn();  // запускаем прием инфракрасного сигнала
   Serial.begin(9600); // подключаем монитор порта
   
pinMode(13, INPUT); // пин 13 будет входом  ик датчика(англ. «intput»)   
pinMode(vhod0, INPUT);

//установка пинов на исходящий из ардуино сигнал(на управление  микросхемой бузера )


pinMode(signal1, OUTPUT);


}

void loop() {


if ( irrecv.decode( &results )) {        // Если на ИК приемнике, что-то есть
    Serial.println(results.value, HEX);
   
      // включаем   сигнализацию, в зависимости от полученного сигнала 
      if (results.value==0xFF6897&&led1==0&&vhod0!=vhod0){
  digitalWrite( 3, HIGH );led1=1;results.value=0;
}
//И дальше с вторым , третьим, четвёртым.....восьмым портами

//  выключаем сигнализацию, в зависимости от полученного сигнала 
if (results.value==0xFF3333&&led1==1){
  digitalWrite( 3, LOW );led1=0;results.value=0;
}   

//И дальше с вторым , третьим, четвёртым.....восьмым портами

      irrecv.resume(); // принимаем следующий сигнал на ИК приемнике

Остання редакція ssipk (2020-12-10 10:32:14)

Неактивний

#2 2020-12-10 09:17:01

renoshnik
Учасник
Зареєстрований: 2017-04-03
Повідомлень: 911

Re: опрос портов ардуино

Вставьте правильно код в своем сообщении !

Неактивний

#3 2020-12-10 10:39:41

ssipk
Учасник
Зареєстрований: 2019-02-21
Повідомлень: 19

Re: опрос портов ардуино

Отредактировал как смог. В том-то и дело , что раньше все было завязано на конструкциях if-else , а теперь не понимаю как это сделать т.к. появилась потребность опроса портов и использования ИК датчика.
Вот код ранее который был:   

if (digitalRead (vhod0) == LOW) //Проверяю есть ли на вход0 - вход7 приходит высокий уровень сигнала
    {
      digitalWrite(signal0, LOW); //Если уровень сигнала высокий на входах, то записать на выходы высокий уровень сигнала
      }
        else
          digitalWrite(signal0, HIGH); // иначе заспсатиь на выходы - низкий уровень сигнала
}

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


Я как могу объясняю(. Прошу не пинать сильно - новичёк в программировании

Неактивний

#4 2020-12-10 10:55:02

vvr
Учасник
Зареєстрований: 2015-04-12
Повідомлень: 762

Re: опрос портов ардуино

ssipk пише:

Прошу не пинать сильно - новичёк в программировании

раз новичёк, то и пишите как новичёк.
есть то-то то-то
нужно чтобы работало так то
а вы порты.....
в вашей каше вообще разобраться не возможно.

Неактивний

#5 2020-12-10 12:44:56

г0сть
Гість

Re: опрос портов ардуино

ssipk пише:

Отредактировал как смог. В том-то и дело , что раньше все было завязано на конструкциях if-else , а теперь не понимаю как это сделать т.к. появилась потребность опроса портов и использования ИК датчика.

Я как могу объясняю(. Прошу не пинать сильно - новичёк в программировании

Ну так заведите флаг(переменную), назовите ее допустим signalizaciya и с пульта меняйте ее состояние. Если она,например,  =1(сигнализация включена) то используйте свои старые конструкции if-else. Если =0 ничего не делайте.
Прошу не пинать сильно - отвечаю так как понимаю ваши объяснения smile

#6 2020-12-10 15:43:11

ssipk
Учасник
Зареєстрований: 2019-02-21
Повідомлень: 19

Re: опрос портов ардуино

Так не получится. Должно работать так -
С пульта нажав одну кнопку я ставлю телевизоры или компьютеры на сигнализацию.В этот момент происходит опрос входящих портов (ардуино опрашивает все порты ввода - их 8), т.к. к сигнализации не всегда будут подключены 8 устройств, а возможно 7 или 5 - по этому создается 8 переменных. При включении с пульта ардуино опрашивает порты, (допустим 5 из них подключено ()на них низкий уровень сигнала, а 3 отключено на них высокий уровень сигнала). Каждому порту соответствует своя переменная , которая хранит его значение. После того как ардуино опросил все 8 портов, он записал их значения в переменную подождал 3 секунды и дальше программа начинает следить за состоянием этих портов и если оно изменится ну скажем одно устройство подключили или отключили , то на исходящих сигналах ардуино будет высокий уровень сигнала(прозвучит сигнализация. ) Второй кнопкой пульта я отключаю слежение за портами ардуино (т.е. снимаю все устройства с сигнализации) и если что-то подключать или отключать сирена не сработает.

Не знаю как организовать это все в код.

Я вижу это так.

#include "IRremote.h"
IRrecv irrecv(13);
decode_results results;


int button1 = 0; //Кнопка пульта 1 - эта переменная для постановки устройств на сигнализацию
int button2 = 0; //Кнопка пульта 2 - эта переменная для снятия устройств с сигнализации


void setup() {
  // put your setup code here, to run once:

Serial.begin(9600);
  irrecv.enableIRIn();

bool sig0 = digitalRead (A0);
bool sig1 = digitalRead (A1);
bool sig2 = digitalRead (A2);
bool sig3 = digitalRead (A3);
bool sig4 = digitalRead (A4);
bool sig5 = digitalRead (A5);
bool sig6 = digitalRead (11);
bool sig7 = digitalRead (12);
int  ir =   digitalRead (13); //порт ик приёмника



  pinMode(0,OUTPUT);//Входы которые следят за подключенными устройствами
  pinMode(1,OUTPUT);
  pinMode(2,OUTPUT);
  pinMode(3,OUTPUT);
  pinMode(4,OUTPUT);
  pinMode(5,OUTPUT);
  pinMode(6,OUTPUT);
  pinMode(7,OUTPUT);

 
  pinMode(A0,INPUT);
  pinMode(A1,INPUT);
  pinMode(A2,INPUT);
  pinMode(A3,INPUT);
  pinMode(A4,INPUT);
  pinMode(A5,INPUT);
  pinMode(11,INPUT);
  pinMode(12,INPUT);
  pinMode(13,INPUT); //Вход с ик датчика
 
}

void loop() {
  // put your main code here, to run repeatedly:


if ( irrecv.decode( &results )) {
    Serial.println(results.value, HEX);


А вот тут не пойму как описать. Т.е. если код с пульта совпадает и уровень порта входящего сигнала не равен уровню ранее сохраненному сигналу с этого порта, то на D3 подать высокий уровень сигнала

if  (results.value==0xFF42BD&&led1==0&&pin2!=pin1) //С ИК пульта включаем сигнализацию. Если код совпадает и если на
{
  digitalWrite( 3, HIGH );led1=1;results.value=0;
}
if  (results.value==0xFF52AD&&pin1!=pin1&&led1==1){ //этой командой отключаем сигалицацию. Т.е. она не следит за портами и не подает высокий уровень на бузер
  digitalWrite( 3, LOW );led1=0;results.value=0;
}   
irrecv.resume();   
  }
 
}



}

Остання редакція ssipk (2020-12-10 16:19:09)

Неактивний

#7 2020-12-10 17:02:34

г0сть
Гість

Re: опрос портов ардуино

1.Научитесь вставлять в сообщения нормально код
2.В качестве входных портов возьмите последовательные номера пинов, а не вразброс. Например, INPUT с 2 по 9
3.В цикле опросите эти пины, заведите массив куда запишете начальные состояния входов и дальше при "постановке на сигнализацию" также в цикле опрашивайте входа и сравнивайте с значениями соответствующих элементов массива. Если не совпадают, значит "Караул!Грабят!"

#8 2020-12-29 21:54:23

ssipk
Учасник
Зареєстрований: 2019-02-21
Повідомлень: 19

Re: опрос портов ардуино

Правильно ли записал состояние пинов в массивы? И правильно ли сделал сравнение двух массивов?

pinMode(A0,INPUT); //Устанавливаю пины на вход
  pinMode(A1,INPUT);
  pinMode(A2,INPUT);
  pinMode(A3,INPUT);
  pinMode(A4,INPUT);
  pinMode(A5,INPUT);

int vhod1 = A0; // Присваиваю пины переменным
int vhod2 = A1;
int vhod3 = A2;
int vhod4 = A3;
int vhod5 = A4;
int vhod5 = A5;

int arr1 [] {vhod1,vhod2,vhod3,vhod4,vhod5,vhod6};//Первый массив считывается состояние входящих пинов
delay 1000;                                                              //проходит одна секунда
int arr2 [] {vhod1,vhod2,vhod3,vhod4,vhod5,vhod6}; Второй массив считывается всё теже пины 
delay 1000;
bool result = equal(begin(arr1),end(arr1), begin(arr2),end(arr2)); Сравниваю два массива и если они отличаются - то как описано ниже (не знаю насколько правильно ) звучит сирена.

if    (result)  digitalWrite(5 , LOW);  
else 
 digitalWrite(5 , HIGH);

Неактивний

#9 2020-12-29 21:58:30

ssipk
Учасник
Зареєстрований: 2019-02-21
Повідомлень: 19

Re: опрос портов ардуино

Помогите разобраться! Что делаю не так???

Неактивний

#10 2020-12-29 22:49:56

г0сть
Гість

Re: опрос портов ардуино

ssipk пише:

Что делаю не так???

Все не так!
Где у вас опрос входов? И для начала почитайте хотя бы здесь https://doc.arduino.ua/ru/prog/Array как работать с массивами

#11 2021-01-02 16:55:35

0z0n
Учасник
Зареєстрований: 2019-02-10
Повідомлень: 20

Re: опрос портов ардуино

Впринципе все не так. Сигнал надо опрашивать постояннов цикле. Второй не понятно что вы опрашиваете. Это анагологовый сигнал или дискрет. Если значение 1,0 тогда проще. Но кто дает этот сигнал я так и не понял что за устройство? Где вы его берете. И второй вопрос что с ним делать тоже не понятно до конца.

Неактивний

#12 2021-01-02 17:39:21

ssipk
Учасник
Зареєстрований: 2019-02-21
Повідомлень: 19

Re: опрос портов ардуино

я не нашёл информации как мне сравнить два массива!
на ардуино ide вот это не работает :

bool result = equal(begin(arr1),end(arr1), begin(arr2),end(arr2))

Меня именно интересует сравнить два массива как выше описано мной. Есть такая функция?. Код я потом  оформлю сам. Т.е. я с помощью цикла for считаю данные состояния портов в массив. Потом будет таймер 1 сек, и  во второй массив считаю снова порты и если эти два массива не совпадают то звучит сирена. Вот и интересует как сравнить эти два массива???

Неактивний

#13 2021-01-02 17:54:29

Kaka
Учасник
Зареєстрований: 2018-03-21
Повідомлень: 405

Re: опрос портов ардуино

ssipk пише:

как сравнить эти два массива???

Функцией memcmp

Остання редакція Kaka (2021-01-02 17:54:45)

Неактивний

#14 2021-01-02 17:59:31

holyorb2
Учасник
Зареєстрований: 2020-12-27
Повідомлень: 19

Re: опрос портов ардуино

Зачем вы так сложняете? Массивы, функции сравнения массивов?

Делате проще, чем проще тем лучше  (на быстродействие не влияет, читаемость намоного лучше) Из минусов только строк кода много, но опять таки, для ардуино количество строк будет одинаково после компиляциии, поэтому:

setup ()
{
  mode = 0; // 0 -> ждем сигналж%: 1 -> сверяем пины с эталоном
}

loop () 
{
  status = значение_с_ИК_приемника(); // 1 = нажата кнопка активации; 2 = нажата кнопка прекращения слежения

  if (mode == 0 && status == 1) {
    pinInit1 = digitalRead(PIN_READ1);
    pinInit2 = digitalRead(PIN_READ2);
    pinInit3 = digitalRead(PIN_READ3);
    pinInit4 = digitalRead(PIN_READ4);
    ...

    mode = 1;
  }

  if (mode == 1 && status == 2) {
    mode = 0;
  }

  if (mode == 1) {
    if (pinInit1 != digitalRead(PIN_READ1)) {
      // Что-то сделать, пин1 изменил состояние
      // Если нужно запомнить новое состояние, тогда его перезаписать
    }
    if (pinInit2 != digitalRead(PIN_READ2)) {
      // Что-то сделать, пин2 изменил состояние
      // Если нужно запомнить новое состояние, тогда его перезаписать
    }
    ...
  }

  delay(100);   // небольшая пауза в опросе
}

Остання редакція holyorb2 (2021-01-02 18:00:36)

Неактивний

#15 2021-01-02 18:01:23

holyorb2
Учасник
Зареєстрований: 2020-12-27
Повідомлень: 19

Re: опрос портов ардуино

Kaka пише:
ssipk пише:

как сравнить эти два массива???

Функцией memcmp

нафига? Тут всего несколько датчиков, нафига усложнять?

Неактивний

#16 2021-01-02 18:44:09

гIсть
Гість

Re: опрос портов ардуино

Если, как было сказано выше, входные сигналы "цифровые", то

int arr [6];

void setup() {
  Serial.begin(9600);
  for (int i = 14; i <= 19; i++)
  {
    pinMode(i, INPUT);
    arr[i - 14] = digitalRead(i);
  }

}

void loop() {
  for (int i = 14; i <= 19; i++)
  {
    if (arr[i - 14] != digitalRead(i))
    {
      //включаем сирену и вызываем спецназ
    }
  }

}

#17 2021-01-02 19:01:24

Kaka
Учасник
Зареєстрований: 2018-03-21
Повідомлень: 405

Re: опрос портов ардуино

holyorb2 пише:
Kaka пише:
ssipk пише:

как сравнить эти два массива???

Функцией memcmp

нафига?

Человек задал вопрос

ssipk пише:

как мне сравнить два массива!

Я на него ответил.

Что-то не так? Ответ неверный? Или не на тот вопрос отвечал, как некоторые?

Неактивний

#18 2021-01-02 19:03:33

Kaka
Учасник
Зареєстрований: 2018-03-21
Повідомлень: 405

Re: опрос портов ардуино

гIсть пише:

  for (int i = 14; i <= 19; i++)
  {
    if (arr[i - 14] != digitalRead(i))
    {
      //включаем сирену и вызываем спецназ
    }
  }

А потом что? Если ещё один элемент не равен? Ещё раз включаем и вызываем?

Неактивний

#19 2021-01-02 19:16:19

гIсть
Гість

Re: опрос портов ардуино

Kaka пише:

А потом что? Если ещё один элемент не равен? Ещё раз включаем и вызываем?

А потом ничего. Я дал пример как можно. ТС же сказал

ssipk пише:

Код я потом  оформлю сам.

Вот пусть и оформляет как ему нужно. Мой ХШ на каникулах. Я не знаю нужно ли ТС реагировать на каждый сигнал по отдельности или пофиг какой сработал, главное чтобы заорало.

#20 2021-01-02 19:29:00

гIсть
Гість

Re: опрос портов ардуино

А нет, вот указано

ssipk пише:

После того как он опросил порты и присвоил их значение(высокий или низкий уровень) переменным ,он(микроконтроллер) должен и дальше следить за состоянием портов и если какой либо из них изменит своё  состояние(с высокого на низкий уровень или на оборот), то на исходящем пине d4 - d9(например) будет высокий уровень сигнала. Вторая кнопка пульта отключает ардуино (т.е. при её нажатии как по типу сигнализации первая кнопка включает слежение за портами , а вторая отключает

т.е. все-таки ТС пофиг какой порт сработал.

#21 2021-05-14 19:18:45

ssipk
Учасник
Зареєстрований: 2019-02-21
Повідомлень: 19

Re: опрос портов ардуино

Прошу прощения. Не было времени для описания.
Вот время снова появилось и решил продолжить проект.
Так и не получается  добиться результата.
Подскажите где ошибка?

#include "IRremote.h"  // Подключаю библиотеку для работы с ик пультом
IRrecv irrecv(12);
decode_results results;
int led1=0;

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

void setup() {
   pinMode( 0, INPUT);
 pinMode( 1, INPUT);
 pinMode( 2, INPUT);
 pinMode( 3, INPUT);
 pinMode( 4, INPUT);
 pinMode( 5, INPUT);
 pinMode( 6, INPUT);
 pinMode( 7, INPUT);
 
pinMode( 13, OUTPUT);
pinMode( 12, INPUT);
  Serial.begin(9600);
  irrecv.enableIRIn();
  
  for (int i = 0; i <= 8; i++)
  {
    pinMode(i, INPUT);
    arr[i - 8] = digitalRead(i);
  }
}

void loop() {
  if ( irrecv.decode( &results )) { 
    Serial.println(results.value, HEX);
    
if (results.value==0xFF30CF&&led1==0){
   for (int i = 0; i <= 8; i++)
  {
    if (arr[i - 8] != digitalRead(i))
    {
      digitalWrite( 13, HIGH );led1=1;results.value=0; //включаем сирену и вызываем спецназ
   
    }
  }
  }
if (results.value==0xFF30CF&&led1==1){
      digitalWrite( 13,  LOW  );led1=0;results.value=0; //включаем сирену и вызываем спецназ
    
}  

 irrecv.resume();   
  }
  
}

Неактивний

#22 2021-05-14 19:53:49

renoshnik
Учасник
Зареєстрований: 2017-04-03
Повідомлень: 911

Re: опрос портов ардуино

int arr [7]; //определяем массив на 8 элементов
for (int i = 0; i <= 8; i++)
arr[i - 8] = digitalRead(i);

объясните это !?!

Остання редакція renoshnik (2021-05-14 19:55:24)

Неактивний

#23 2021-05-14 20:54:50

ssipk
Учасник
Зареєстрований: 2019-02-21
Повідомлень: 19

Re: опрос портов ардуино

Прошу прощения. Код правильно отредактировал . Вот:

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

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

void setup() {             //определяю порты ввода
   pinMode( A0, INPUT);
 pinMode( A1, INPUT);
 pinMode( A2, INPUT);
 pinMode( A3, INPUT);
 pinMode( A4, INPUT);
 pinMode( A5, INPUT);
 pinMode( 13, INPUT);
 pinMode( 12, INPUT);
 
pinMode( 3, OUTPUT);     //Пин сирены в состояние вывода 
pinMode( 8, INPUT);       //Пин ИК датчика в режим входа 
  Serial.begin(9600);     //Выставляю скорость Serial порта
  irrecv.enableIRIn();    //Включаю ИК порт
  
  for (int i = 12; i <= 19; i++)  // Создаю цикл который один раз при включении опрашивает порты от 19 до  12
  {
    pinMode(i, INPUT);  //создаю переменную i для хранения в ней значения при чтении данных из цикла 
    arr[i - 12] = digitalRead(i); //здесь в  делаю сдвиг в массиве  и благодаря этому чтение начинается с 12 пина
  }
}

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

 irrecv.resume();   // ожидаем следующий сигнал с ИК приёмника
  }
  
}

Остання редакція ssipk (2021-05-14 21:00:14)

Неактивний

#24 2021-05-14 21:15:24

ssipk
Учасник
Зареєстрований: 2019-02-21
Повідомлень: 19

Re: опрос портов ардуино

Может естьсреда разработки как для C# типа visual studio? Для запуска программы в дебаге и ловли ошибок?

Неактивний

#25 2021-05-14 21:34:36

renoshnik
Учасник
Зареєстрований: 2017-04-03
Повідомлень: 911

Re: опрос портов ардуино

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

https://doc.arduino.ua/ru/prog/Array

Читаем внимательно до просветления !!!

Неактивний

Швидке повідомлення

Введіть повідомлення і натисніть Надіслати

Підвал форуму