Ви не увійшли.
Сторінки 1
Сегодня заберу свой пк с visualsrudio. Работаю неделю на подменном попробуют в среде C#/
https://doc.arduino.ua/ru/prog/Array
ничего нового не узнал. Все как на шарпе
Может я не правильно выразился. i перебирает коллекции массива и с помощью цикла for сравнивает их с нынешним состоянием портов
Может естьсреда разработки как для C# типа visual studio? Для запуска программы в дебаге и ловли ошибок?
Прошу прощения. Код правильно отредактировал . Вот:
#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(); // ожидаем следующий сигнал с ИК приёмника
}
}
Прошу прощения. Не было времени для описания.
Вот время снова появилось и решил продолжить проект.
Так и не получается добиться результата.
Подскажите где ошибка?
#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();
}
}
я не нашёл информации как мне сравнить два массива!
на ардуино ide вот это не работает :
bool result = equal(begin(arr1),end(arr1), begin(arr2),end(arr2))
Меня именно интересует сравнить два массива как выше описано мной. Есть такая функция?. Код я потом оформлю сам. Т.е. я с помощью цикла for считаю данные состояния портов в массив. Потом будет таймер 1 сек, и во второй массив считаю снова порты и если эти два массива не совпадают то звучит сирена. Вот и интересует как сравнить эти два массива???
Помогите разобраться! Что делаю не так???
Правильно ли записал состояние пинов в массивы? И правильно ли сделал сравнение двух массивов?
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);
Так не получится. Должно работать так -
С пульта нажав одну кнопку я ставлю телевизоры или компьютеры на сигнализацию.В этот момент происходит опрос входящих портов (ардуино опрашивает все порты ввода - их 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();
}
}
}
Отредактировал как смог. В том-то и дело , что раньше все было завязано на конструкциях if-else , а теперь не понимаю как это сделать т.к. появилась потребность опроса портов и использования ИК датчика.
Вот код ранее который был:
if (digitalRead (vhod0) == LOW) //Проверяю есть ли на вход0 - вход7 приходит высокий уровень сигнала
{
digitalWrite(signal0, LOW); //Если уровень сигнала высокий на входах, то записать на выходы высокий уровень сигнала
}
else
digitalWrite(signal0, HIGH); // иначе заспсатиь на выходы - низкий уровень сигнала
}
А теперь нужно по нажатии на одну кнопку на пульте опросить все входящие порты и сохранить их значения в переменные и если порт поменяет уровень сигнала - то подать на исходящий порт - высокий уровень. А второй кнопкой пульта как бы снять с сигнализации т.е. чтоб не происходило на входящих портах на исходящих всегда будет низкий уровень.
Я как могу объясняю(. Прошу не пинать сильно - новичёк в программировании
Добрый день. Нужна помощь. Электронную часть я уже сделал, но не знаю как программно это прописать.
Мне нужно, чтоб при включении с пульта микроконтроллер опрашивал все 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(); // принимаем следующий сигнал на ИК приемнике
Добрый вечер! Есть движковый переключатель 3пин(два положения on/off), двухцветный светодиод с общим минусом и ардуино. Задача такая: При включении внутреннего блока питания сигнал подается на средний вывод переключателя и попадает на ардуино - горит красный светодиод, при переключении в другое положение переключателя - +5в от внутреннего блока питния отключается а подключается другой источник питания тоже +5в и по тому же среднему выводу эти +5в попадают на тотже пин ардуино и горит уже зелёный светодиод. Я знаю , что так ка я нарисовал работать не будет. Но что нужно для реализации написанного и не дорого!
- вот схема. Как её переделать
Я работаю матером по ремонту оргтехники и бытовой техники. Ардуино решил освоить интересная штука. Меня интересует именно программирование. Модули я сам паяю ... Вот и спрашиваю про хороший учебник ... Я так понимаю Вы на Си пишите?
Посоветуйте хороший учебник по программированию в среде ардуино и по Си или С++
"qwone" - Вам спасибо за код.
А про дверь и светодиод - это я отвечал "vvr"
qwone- Спасибо. Скопилировался правильно. Буду на работе проверю.
"а где у вас в коде дверь закрывается через 3 сек."
Дверь в коде - это светодиод!
Serial.println("OK");// Если код совпал пишем ОК!
digitalWrite(13, HIGH);// Зажигаем диод
delay(3000);// Выдерживаем паузу
digitalWrite(13, LOW);}// Гасим диод
else {Serial.println("NO!");// Если несовпадение пишем NO!
delay(500);}
Вот скетч работающего замка. Работает так поднесли ключ открылась дверь по истечении 3 секунд сама закрылась. Мне же надо, чтоб поднесли ключ - открылась дверь и не закрывалась пока ещё раз не поднесут ключ к считывателю. Помогите исправить код.
#include <OneWire.h>
OneWire ds(10);// Определяем пин подключения к ключу
byte aaa[2][8] = {{0x01,0x11,0xF7,0x43,0x01,0x00,0x00,0x65},// Двухмерный массив известных ключей EB 0 0 1 B6 7A 12 1
{0xEB,0x00,0x00,0x01,0xB6,0x7A,0x12,0x01}};// Первое число - количество ключей, второе - количество байт в ключе
byte addr[8], k, m; // Обозначаем массив для чтения ключа из 8 байт
void setup() {
pinMode(13, OUTPUT);// Прописываем диод на пин 13.
Serial.begin(9600);}// Запускаем порт
void loop() {
m = 0;// Обнуляем указатель наличия ключа
if (ds.search(addr)){// Если устройство подключено - считываем
for (k=0; k<2; k++){// Запускаем цикл перебора ключей
if(aaa[k][0] == addr[0] && aaa[k][1] == addr[1] && aaa[k][2] == addr[2] // Сравниваем побайтно массивы
&& aaa[k][3] == addr[3] && aaa[k][4] == addr[4] && aaa[k][5] == addr[5] // Да, это черезчур громоздко, зато просто "как кувалда".
&& aaa[k][6] == addr[6] && aaa[k][7] == addr[7]){ m=1;}} // Если ключ есть увеличиваем значение указателя
if (m > 0) {// Проверяем значение указателя
Serial.println("OK");// Если код совпал пишем ОК!
digitalWrite(13, HIGH);// Зажигаем диод
delay(3000);// Выдерживаем паузу
digitalWrite(13, LOW);}// Гасим диод
else {Serial.println("NO!");// Если несовпадение пишем NO!
delay(500);}
for(int i=7; i>-1; i--){// Запускаем цикл печати данных из массива
Serial.print(addr[i], HEX);// Печатаем нужный байт в шестнадцатиричном виде
Serial.print(" ");}// Печатаем пробел
Serial.println();// В конце цикла переводим строку
ds.reset_search();}} // Сбрасываем устройство
Сторінки 1