Датчик Холла на воротах
- Войдите на сайт для отправки комментариев
Сб, 23/11/2019 - 20:05
Здравствуйте, подскажите пожалста где ошибка, реле открываются на долю секунды, должны быть открытыми по переменной mag
const int relPin = 4;//замок const int relPin1 = 5;//вход const int relPin2 = 6;//вых const int relPin3 = 7;//пищ int mag = 0; int i =0; int exi[10]; int bada[10]; void setup() { pinMode(relPin, OUTPUT); pinMode(relPin1, OUTPUT); pinMode(relPin2, OUTPUT); pinMode(relPin3, OUTPUT); digitalWrite(relPin, HIGH); digitalWrite(relPin1, HIGH); digitalWrite(relPin2, HIGH); digitalWrite(relPin3, HIGH); Serial.begin(9600); } void loop() { int mag = analogRead(0)/10; // чтение переменной if (mag > 15 && mag < 25){ исходя из положения заполняю возможные конечные значения exi[0] = 46;exi[1] = 47;exi[2] = 48;exi[3] = 49;exi[4] = 50;exi[5] = 51;exi[6] = 52;exi[6] = 53;exi[7] = 54;exi[8] = 55;exi[9] = 55; // тут правельные bada[0]= 81;bada[1]= 82;bada[2]= 83;bada[3]= 84;bada[4]= 85;bada[5]= 86;bada[6]= 87;bada[7]= 88;bada[8]= 89;bada[9]= 90; // тут не правельные } else if (mag > 45 && mag < 55){ exi[0]= 81;exi[1]= 82;exi[2]= 83;exi[3]= 84;exi[4]= 85;exi[5]= 86;exi[6]= 87;exi[7]= 88;exi[8]= 89;exi[9]= 90; // правельные bada[0]= 15;bada[1]= 16;bada[2]= 17;bada[3]= 18;bada[4]= 19;bada[5]= 20;bada[6]= 21;bada[7]= 22;bada[8]= 23;bada[9]= 24; / не правельные } else{ exi[0]= 15;exi[1]= 16;exi[2]= 17;exi[3]= 18;exi[4]= 19;exi[5]= 20;exi[6]= 21;exi[7]= 22;exi[8]= 23;exi[9]= 24; // правельные bada[0] = 46;bada[1] = 47;bada[2] = 48;bada[3] = 49;bada[4] = 50;bada[5] = 51;bada[6] = 52;bada[7] = 53;bada[8] = 54;bada[9] = 55; // не правельные } i = 0; while (i < 20){ // считаю до 20 раз digitalWrite(relPin, LOW);//замок открыть дверь digitalWrite(relPin2, LOW);//вход показать зеленый на вход for (i = 0; i < 10; i++){ //искать значения из массива и сравнивать с переменной if (mag == exi[i]){ mag = analogRead(0)/10; delay(2000); break; //совпало на верные значения круто }} break; for (i = 0; i < 10; i++){ if (mag == bada[i]){ // ищем переменную в непрвельных значениях mag = analogRead(0)/10; digitalWrite(relPin3, LOW);//пищ //не правельное положение двери пищать сиреной delay(2000); digitalWrite(relPin3, HIGH);//пищ break; } } break; delay(2000); //прошло 20 проходов вхиле i = i +1; } digitalWrite(relPin, HIGH);//замок закрыть digitalWrite(relPin2, HIGH);//вход зажечь красный delay(5000); }
В 38 строке i используется как переменная цикла, а в строках 41 и 48 Вы её безбожно загаживаете.
Строки №№ 50-61 не исполняются никогда от слова совсем
Так и задумано?
А если хотите помощи, объясняйтесь толком - не экономьте буквы. Ваше "должны быть открытыми по переменной mag" понятно только Вам. Хотя, судя по коду, и Вам тоже непонятно.
переменная меняется, и нужно понять к какому диапазону значений онa принадлежит.
Понятнее не стало. Объясняйтесь толком.
А по первым моим двум фразам - все нормально? Так и задумано?
разделил счетчик, на i, i1, i2, убрал лишние брейки
раньше работало вот так:
а сейчас хочу переделать на сравнение переменной mag с диапазонами значений
Простите, мне надоело клещами тянуть из Вас что же Вы хотите сделать. Не хотите или не можете объяснить толком - дело Ваше.
Ну дак учусь и поэтому не совсем понимаю как это работает:
Ардуинка смотрит за дверью и пищит если дверь открыта не правильно, датчик холла считывает угол в одну или в другую сторону,
в момент открытия ардуинка смотри показания в каком положении открыта дверь, это переменная mag, после нахождения положения, есть два варианта открытия двери, правильно ex и не правильно bad, отрываются реле - электромагнит и указатель, запускается цикл while, который отсчитывает время на открытие двери, после окончания открытия двери, датчик смотрит на конечное положение mag и сравнивает с тем которое получил ранее ex и bad, если mag = ex то выход правельный, если mag = bad, то выход неправельный и звучит реле сирена пищ.
когда были значения конкретные то кое как работало, а когда настали холода то показания разняться у датчика, и надо сделать для сравнения с mag диапазоны +- от этих конкретных значений.
Вот так сделал, все работает, всем спасибо!!!
Какой кошмар
я ж учусь.... причем без какой-то базовой основы.....
а можно пояснить, что это за массивы exi[] и bada[] ?
И нафига в них по 29 практически одинаковых значений, если, судя по коду -вы всего лишь ловите ЛЮБОЕ из 29 совпадений? - может заменить этот тупой перебор while на одно условие типа
mag == 18 || mag == 19
А как это можно записать?
А как это можно записать?
Так вы сначала поясните, зачем вы 29 раз сравниваете mag с одним и тем же хначением? (ибо 18 и 19 это практически одно и тоже в вашем коде, как я вижу)
29 раз потому, что while 29 раз проходит, значения одинаковые, потому что я не могу сделать перебор, что б он по времени был примерно 3-5 секунд.
29 раз потому, что while 29 раз проходит, значения одинаковые, потому что я не могу сделать перебор, что б он по времени был примерно 3-5 секунд.
кошмар....
Что мешает 29 раз с интервалом в 100 мс просто в цикле сравнить mag с числом 18? зачем для этого заводить массив из 29 одинаковых значений, ну что за бредятина?
вот так вот не лучше будет?
вот так вот не лучше будет?
СПАСИБО, век живи век учись :))))
Сдается мне , что сам подход в корне неправильный.
в подход я не углублялся, так как до сих пор очень смутно понимаю, зачем измерять одно и тоже 29 раз :)
Поправил код исключительно из эстетических соображений