Ви не увійшли.
Добрый день. Нужна помощь. Электронную часть я уже сделал, но не знаю как программно это прописать.
Мне нужно, чтоб при включении с пульта микроконтроллер опрашивал все 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)
Неактивний
Отредактировал как смог. В том-то и дело , что раньше все было завязано на конструкциях if-else , а теперь не понимаю как это сделать т.к. появилась потребность опроса портов и использования ИК датчика.
Вот код ранее который был:
if (digitalRead (vhod0) == LOW) //Проверяю есть ли на вход0 - вход7 приходит высокий уровень сигнала
{
digitalWrite(signal0, LOW); //Если уровень сигнала высокий на входах, то записать на выходы высокий уровень сигнала
}
else
digitalWrite(signal0, HIGH); // иначе заспсатиь на выходы - низкий уровень сигнала
}
А теперь нужно по нажатии на одну кнопку на пульте опросить все входящие порты и сохранить их значения в переменные и если порт поменяет уровень сигнала - то подать на исходящий порт - высокий уровень. А второй кнопкой пульта как бы снять с сигнализации т.е. чтоб не происходило на входящих портах на исходящих всегда будет низкий уровень.
Я как могу объясняю(. Прошу не пинать сильно - новичёк в программировании
Неактивний
Прошу не пинать сильно - новичёк в программировании
раз новичёк, то и пишите как новичёк.
есть то-то то-то
нужно чтобы работало так то
а вы порты.....
в вашей каше вообще разобраться не возможно.
Неактивний
Отредактировал как смог. В том-то и дело , что раньше все было завязано на конструкциях if-else , а теперь не понимаю как это сделать т.к. появилась потребность опроса портов и использования ИК датчика.
Я как могу объясняю(. Прошу не пинать сильно - новичёк в программировании
Ну так заведите флаг(переменную), назовите ее допустим signalizaciya и с пульта меняйте ее состояние. Если она,например, =1(сигнализация включена) то используйте свои старые конструкции if-else. Если =0 ничего не делайте.
Прошу не пинать сильно - отвечаю так как понимаю ваши объяснения
Так не получится. Должно работать так -
С пульта нажав одну кнопку я ставлю телевизоры или компьютеры на сигнализацию.В этот момент происходит опрос входящих портов (ардуино опрашивает все порты ввода - их 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)
Неактивний
1.Научитесь вставлять в сообщения нормально код
2.В качестве входных портов возьмите последовательные номера пинов, а не вразброс. Например, INPUT с 2 по 9
3.В цикле опросите эти пины, заведите массив куда запишете начальные состояния входов и дальше при "постановке на сигнализацию" также в цикле опрашивайте входа и сравнивайте с значениями соответствующих элементов массива. Если не совпадают, значит "Караул!Грабят!"
Правильно ли записал состояние пинов в массивы? И правильно ли сделал сравнение двух массивов?
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);
Неактивний
Что делаю не так???
Все не так!
Где у вас опрос входов? И для начала почитайте хотя бы здесь https://doc.arduino.ua/ru/prog/Array как работать с массивами
Впринципе все не так. Сигнал надо опрашивать постояннов цикле. Второй не понятно что вы опрашиваете. Это анагологовый сигнал или дискрет. Если значение 1,0 тогда проще. Но кто дает этот сигнал я так и не понял что за устройство? Где вы его берете. И второй вопрос что с ним делать тоже не понятно до конца.
Неактивний
я не нашёл информации как мне сравнить два массива!
на ардуино ide вот это не работает :
bool result = equal(begin(arr1),end(arr1), begin(arr2),end(arr2))
Меня именно интересует сравнить два массива как выше описано мной. Есть такая функция?. Код я потом оформлю сам. Т.е. я с помощью цикла for считаю данные состояния портов в массив. Потом будет таймер 1 сек, и во второй массив считаю снова порты и если эти два массива не совпадают то звучит сирена. Вот и интересует как сравнить эти два массива???
Неактивний
Зачем вы так сложняете? Массивы, функции сравнения массивов?
Делате проще, чем проще тем лучше (на быстродействие не влияет, читаемость намоного лучше) Из минусов только строк кода много, но опять таки, для ардуино количество строк будет одинаково после компиляциии, поэтому:
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)
Неактивний
Если, как было сказано выше, входные сигналы "цифровые", то
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))
{
//включаем сирену и вызываем спецназ
}
}
}
Kaka пише:ssipk пише:как сравнить эти два массива???
Функцией memcmp
нафига?
Человек задал вопрос
как мне сравнить два массива!
Я на него ответил.
Что-то не так? Ответ неверный? Или не на тот вопрос отвечал, как некоторые?
Неактивний
А потом что? Если ещё один элемент не равен? Ещё раз включаем и вызываем?
А потом ничего. Я дал пример как можно. ТС же сказал
Код я потом оформлю сам.
Вот пусть и оформляет как ему нужно. Мой ХШ на каникулах. Я не знаю нужно ли ТС реагировать на каждый сигнал по отдельности или пофиг какой сработал, главное чтобы заорало.
А нет, вот указано
После того как он опросил порты и присвоил их значение(высокий или низкий уровень) переменным ,он(микроконтроллер) должен и дальше следить за состоянием портов и если какой либо из них изменит своё состояние(с высокого на низкий уровень или на оборот), то на исходящем пине d4 - d9(например) будет высокий уровень сигнала. Вторая кнопка пульта отключает ардуино (т.е. при её нажатии как по типу сигнализации первая кнопка включает слежение за портами , а вторая отключает
т.е. все-таки ТС пофиг какой порт сработал.
Прошу прощения. Не было времени для описания.
Вот время снова появилось и решил продолжить проект.
Так и не получается добиться результата.
Подскажите где ошибка?
#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();
}
}
Неактивний
Прошу прощения. Код правильно отредактировал . Вот:
#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)
Неактивний