Датчик препятствий и серво(бесполезная коробка)
- Войдите на сайт для отправки комментариев
Вс, 12/07/2015 - 21:54
Хэлп ми, в смысле мозг кипит и словил цикл %
собираю бесполезную коробку, хочу добавить движение (после того, как включить тумблер):
"Рычаг медленно чуть вылазит о останавливается (крышка приоткрыта так, что бы ИК-датчик видел тумблер), и ждёт. Если есть движение к тумблеру, то рычаг быстро выключает его; если движения нет минуту - то медленно выключает тумблер и медленно прячется".
суть проблемы:
ИК датчик(555 таймер+TSOP1738) включен постоянно, следовательно подаёт сигнал будучи в коробке. Никак не могу его на время пребывания в коробке(и после срабатывания) деактивировать.
как-то так
кто нибудь понял?
а что тут понимать?
вроде всё по-русски, запятые на месте.
суть проста и непонятна - датчик препятствий, практически постоянно выдавая "0", херит такую хорошую(я про задуманное движение в "бесполезной коробке") идею.
или я не понял что ты не понял?=)
...как вариант, запуск 555 таймера(который генерит 38кГц на светолиод) по сигналу с Ардуины.
1 бит надо поменять с 3им, так как разводка не позовола сделать иначе. хардварный spi решил не использовать, скорости отрисовки итак хватает. в целом все хорошо, но либо размер поменять либо расстояние
вопрос: так как динамическая индикация, как точно ловить время между импульсами без прерываний, так как изза длительности кода от delay(2) отказываться не стоит
я знаю о чем я, так как сам писал код и делал устройство. ты нет. сможешь ответить на вопрос?
так ты из ЭТИХ?! о_О...
вопросом на вопрос которые отвечают ))))
причём тут кто код писал?
есть проект - "бесполезная коробка" (надеюсь слышал про таке?). там есть всякие движения рычага, выключающего тумблер.
вот я и хочу разнообразить эти движения, введя реагирование на руку человека.
алгоритм простой:
1. включили тумблер (обычно рычаг его выключает сразу или после каки-то движений или ожидания).
2. рычаг, выключающий тумблер, медленно вылазит на половину (т.е. крышка приоткрывается) и останавливается.
3. на крышке, изнутри, висит датчик препятствия, "смотрящий" на тумблер.
4. как только человек тянет руку к тумблеру (ведь никакой реакции кроме как полуоткрытая крышка не последовало), то рычаг быстро выключает тумблер и прячется в коробку.
5. крышка закрывается.
так вот, проблема в том, что датчик всё время щупает пространство и когда он в коробке то реагирует на всё и даёт команду на серву, которая дергается.
т.е. датчик надо мне как-то включать только при открытой крышке и до выключения тумблера.
а вот оно что. я должен погуглить чтобы узнать о чем ты, чтобы понять о чем ты пишешь
а я то думал что это тебе нужно больше
почитай
http://arduino.ru/forum/obshchii/sozdanie-temy#comment-75012
н-дя...
Puhlyaviy до пары не хватает =)
я даже немного разочарован
забей.
я сильнее разочарован
http://frivolousengineering.com/
Была, была с датчиком : сначала работала быстро, а потом открывала крышку и ждала...
Дёргалась, вроде дразнила, руку подносили- резко хлопала тумблером.
Это не та, но ближе: https://www.youtube.com/watch?v=apVR5Htz0K4
по-тихоньку разобрался сам: надо вводить дополнительные условия
по-тихоньку разобрался сам: надо вводить дополнительные условия
Вы просто замечательно описали алгоритм, скетч просто супер, а схема простенькая, такую каждый знает. Вобщем я вообще не понимаю, что тут может не работать!? Ну разве что спиртом плату протиреть, можено пальцами пощелкать, вдруг скорости не хватает...
А про дополнительные условия Вы погорячились, я вот просматриваю скетч - думаю это лишнее, алгоритму соответствовать не будет. Ну или меняйте алгоритм работы.
ну как-то так, чего не понятно?
Гриша, алгоритм описан нормально. Что не понятно?
Схему я не выкладывал, ибо вопрос не в ней - там всё ОК (но если кому надо выложу).
Скетч кто-то спрашивал? Нет, кстати, вот он:
// Медленный выход рычага, задержка под крышкой // ожидание сигнала с ИК датчика // при наличии сигнала - резкое выключение и возврат в исх.положение { // Тумблер Включен if (ButtonState == 1 && !ON) { delaybeforeoff = currentMillis; failMillis = currentMillis; ON = true; godown = false; ServoSpeed = 30; offdelay = 1; MoveStep = 0; } // Задержка до начала движения if (ON && currentMillis - delaybeforeoff > offdelay) { goup = true; } // Медленное движение рычага до поднятия крышки if(currentMillis - previousMillis > ServoSpeed && MoveStep == 0 && goup && !fail) { previousMillis = currentMillis; pos1 ++; servo1.write(pos1); if (pos1 == ServoMaxPos - 90) { MoveStep ++; } } SensorStatus = digitalRead(Sensor); //считываем уровень на входе 5 if (SensorStatus == LOW && ButtonState == 1) // если сигнал есть и тумблер включен //быстрое выключение { previousMillis = currentMillis; servo1.write(ServoMaxPos); MoveStep ++; } // Тумблер Выключен if (ButtonState == 0 && goup) { goup = false; godown = true; ServoSpeed = 1; ON = false; } // Быстрое возвращение рычага в И.П. if(currentMillis - previousMillis > ServoSpeed && pos1 > ServoMinPos && godown) { previousMillis = currentMillis; servo1.write(ServoMinPos); // Завершение движения if (godown && servo1.read() == ServoMinPos) } }теперь проблема в другом - при повторном включении тумблера происходит просто выключение оного без всяких фокусов (((
[quote=karl2233]
Скетч кто-то спрашивал?
теперь проблема в другом - при повторном включении тумблера происходит просто выключение оного без всяких фокусов (((
quote]
вы его сами должны были выложить....
повторное выключение включенного тумблера - значит коробочка устала от вашего кода и хочет спать.....
....может быть вы в коде прописали коробочке интеллект ?
н-дя...
Puhlyaviy до пары не хватает =)
jeka_tm к нему зачем присоединили ?
- похвала ????
- фееееее ????
изначально вопрос был скорее теоретический - "как".
теперь перешел в сторону практики.
результат - одинаков :) что с кодом, что без. так что разницы нет, как понимаю, можно было и не спрашивать =)
https://www.youtube.com/watch?v=apVR5Htz0K4
классная версия !!!!!!!!!!!!!!!!!
:)
версия класная, но код....
как для начинающего(я про себя) это нереально
изначально вопрос был скорее теоретический - "как".
результат - одинаков :) что с кодом, что без. так что разницы нет, как понимаю, можно было и не спрашивать =)
вам же ответили нормальные люди - "так" , "сяк" , или "этак"
.....можно и не спрашивать :(
или спросить по другому ?
как для начинающего(я про себя) это нереально
да , наверное.....
и это повод наехать на Жеку и Пухлявого ?
...ждите Дохтура тогда. У его есть пилюли..... в рифму....
Да чтож ты мне спокойно поболеть не даешь!
Вот привязался!
предлагаю начать сначала . сначала описать проблему как здесь описано
http://arduino.ru/forum/obshchii/sozdanie-temy#comment-75012
но не скрывая. если проблема возможно касается схемы нужна схема, конкретная железка - ссылка на него
и по работе конкретно: как работает и что хочется получить подробно!!! в чем конкретно проблема
Да чтож ты мне спокойно поболеть не даешь!
Вот привязался!
яяяяяяяя ??????????????????
дай таблетку-антидот ! а то прописал хер знает что и забыл ( или забил ? ) , а мине клизмы типеричя снятся ардуированные.....
выздоравливай ! конечно же ! :)
тема, за бесполезностью, закрыта.
всем спасибо, все свободны (с)
з.ы. заболевшим - выздоровления!
:)
karl2233, вроде форум читали, а вопросы задаете как новечек... вот поставьте себя на наше место и перечитайте топик - я Вас уверяю в самом начеле (кроме самой идеи) никакой информации по существу вопроса, и только в 13м посте явился код!!! и сразу вопрос - это весь код? он в LOOP?
что со строкой 25 и 27 - previousMillis - там точно все ровно?
какие переменные ключевые? посмотрите их в порте и поставте delay() это поможет понять в какой момент в переменной появляется не нужное значение - дебагте пошагово
это от нервов....
и куда он придёт ? после "дебагте пошагово" ?
:(
это от нервов....
и куда он придёт ? после "дебагте пошагово" ?
:(
не вкурил сарказма :) есть логика работы, есть переменные... мы умеем на компьютере смотреть значение этих переменных в ключевых местах? или сарказм был про каждый шаг? мы ожидаем увидеть систему в каком-то состоянии = значение переменных, вот их и нужно смотреть. Ну особо профи могут и без этого, но для этого нужен опыт.
Гриша, вопрос был "Никак не могу его на время пребывания в коробке(и после срабатывания) деактивировать."
так что суть была в какой-то, неизвестной мне команде (если, конечно, таковая существует в природе).
что касательно кода - решил писать его заново (хе-хе).
теперь проблемы возникают по ходу действа ))))
// Тумблер Включен if (ButtonState == 1 && !ON) { ON = true; godown = false; offdelay = 1; MoveStep = 0; } // Медленное движение рычага до поднятия крышки if(currentMillis - previousMillis > ServoSpeed && MoveStep == 0 )// значения в этой строке мне ваще не понятны { previousMillis = currentMillis; pos1 ++; servo1.write(pos1); ServoSpeed = 10; if (pos1 == ServoMaxPos - 85) { MoveStep ++; } } //до этого момента, если датчик обмануть(показать что препятсвия нет) работает норм SensorStatus = digitalRead(Sensor); //считываем уровень на входе 5 if (SensorStatus == LOW && ButtonState == 1 && ServoMaxPos - 90) // если сигнал есть и тумблер включен { previousMillis = currentMillis; servo1.write(ServoMaxPos); MoveStep ++; } // если на обманутый датчик подать сигнал препятсвия(руку поставить) то тумблер выключает //и далее стоит в таком состоянии и всё что написано ниже игнорирует // Тумблер Выключен if (ButtonState == 0 && goup) { goup = false; godown = true; ServoSpeed = 1; ON = false; MoveStep ++; } // Быстрое возвращение рычага в И.П. if(currentMillis - previousMillis > ServoSpeed && pos1 > ServoMinPos && godown) { previousMillis = currentMillis; servo1.write(ServoMinPos); // Завершение движения if (godown && servo1.read() == ServoMinPos) { BoX = 0; } } }Теперь проблема выглядит так:
1. когда включаю тумблер (датчику искусственно показываю что препятсвий нет) то рычаг медленно выходит приоткрывая крышку и останавливается.
2. потом я перед датчиком ставлю руку, рычаг быстро выключает тумблер и НЕ возвращается в исходное положение(ИП), т.е. не прячется в коробку.
3. если в п.1. на датчике есть сигнал (а он будет, ибо замкнутое пространствов коробке) то при включении тумблера рычаг быстро выключает тумблер и НЕ возвращается в ИП.
таким образом, вопрос состоит в том, что бы:
1. когда крышка закрыта (датчик в коробке) он не реагировал на препятсвие.
2. как вернуть рычаг обратно (т.е. систему в исходное положение )))))
*мантру "рычаг вернись" и земные поклоны делал, в бубен бил = результата нет*
что со строкой 25 и 27 - previousMillis - там точно все ровно?
вот код установок
#include <Servo.h> // Библиотека для серво //----------------- Настройки -------------- int Sensor = 5; // OUT сенсора на 5-ый вывод int ServoPin = 3; // серво на 3-ый вывод int ButtonPin = 2; // Пин к которому подключен тумблер int ServoMinPos = 40; // И.П. рычага int ServoMaxPos = 170; // Положение, в котором рычаг отключает тумблер int SensorStatus = 1; // первоначальный статус сенсора // Режим работы UBoX int BoXmode = 2; // 1=случайно, 2=по порядку // Число движений, по умолчанию 8 int MoveNum = 1; // По умолчанию 8 // Настройка движения Shake int shakeMinPos = 70; // Нижнее положение рычага в движении Shake (крышка закрыта, рычаг прямо под крышкой, но не касается её) int shakeMaxPos = 80; // Верхнее положение рычага в движении Shake (крышка поднята на 3 - 5 мм) int shakeNum = 10; // Число ударов крышкой в движении Shake int shakeSpeed = 70; // Скорость задержки между движениями рычага в движении Shake //------------------Установки--------------- Servo servo1; // Имя серво int ServoSpeed = 1; // скорость движения серво int pos1 = ServoMinPos; // Угол начальной установки серво int BoX = 0; // Номер движения int BoXtemp = 0; int ButtonState = 0; // Статус тумблера 1 = Вкл., 0 = Выкл. int offdelay = 200; // Задержка до начала движения, разная в каждом движении. int MoveStep = 0; // Для учета числа шагов в движении long previousMillis; // Для таймера движений long delaybeforeoff; // Для таймера задержки до начала движения boolean goup = false; // Маркер подъема рычага boolean godown = false; // Маркер опускания рычага boolean ON = false; // Маркер включения тумблера // Переменные для движения Shake int shakeMoveNum; long previousShakeMillis; // Для таймера движения Shake int shakeNumTemp; void setup () { Serial.begin(9600); servo1.write(ServoMinPos); // Установка серво в И.П. servo1.attach(ServoPin); // Подключение серво к пину pinMode(ButtonPin, INPUT); // Подключеие тумблера pinMode (Sensor, INPUT); // Подключение сенсора } //---------------Сама программа------------------ void loop() { unsigned long currentMillis = millis(); ButtonState = digitalRead(ButtonPin); // Считывает статус тумблера 1 = вкл., 0 = выкл. if (ButtonState == 1 && !ON) { if (BoX == 0 && BoXmode == 1) // Случайный выбор движения { BoX = random(1, MoveNum + 1); } if (BoX == 0 && BoXmode == 2) // Выбор движения по порядку { BoX = BoXtemp + 1; if (BoX == MoveNum) { BoXtemp = 0; } else { BoXtemp = BoX; } } } // Далее идут все движения рычага для выключения тумблера //--------------------- Движение 2 ------------------------ // Медленный выход рычага, задержка под крышкой, ожидание сигнала ИК и резкое выключение тумблера. if (BoX == 1) { // Тумблер Включен (далее идёт само движение код которого в предыдущем сообщении)вот что подумал:
1. если сенсор подключать к пину именно тогда, когда он нужен( т.е. команду для него "void setup" давать после приподнятия крышки, а потом давать команду на отключение?
...вот и вернулось всё на круги своя )))))
а датчик то какой? ик?
короче 2 варианта: если ик отключать ик диод пока внутри или добавить флаг, что если отдали команду закрыть крышку флаг=1, если крышка открыта=0
а в обработке датчика добавить условие что если флаг=0 и сработал датчик то делать .....
jeka_tm, датчик на компараторе (или на 555), не суть.
главное что в исходном состоянии на выходе лог "1", когда есть препятствие лог "0".
подключить датчик я смог, а вот отключить его или управлять его включением не понимаю как.
не суть? то спрашиваешь что делать, как отключить датчик, но не говоришь что за датчик. ну дело твое
говорил уже: добавить флаг, переменная boolean у которой 2 состояния возможных. ты же знаешь по программе крышка сейчас открыта или нет, хотя бы по положению сервы. двойное условие не проблема сделать, пишется через &&
не совсем понял про условие, вернее куда (в установки? в движение?) его добавить.
аа! в установки. вначале задаю условие что "труе", а что "фальш", потом оперирую ими.
хорошо.
но к чему (рычаг? крышка? ИК-датчик? положение сервы?) привязать эти значения?
к рычагу - никак, нет там датчиков, а вешать ещё один - это не кошерно ))
к сигналу ИК-датчика - так он привязан к порту и на его выходе или "0" или "1", тут скорее надо отвязывать.
остаётся положение сервы (ну когда она рычагом приподняла крышку)?
ну так опять станет вопрос - "как сделать так, что бы ДО приподнятия крышки на датчик никто не реагировал".
...или я не понял
начните с простого, написать прогу которая буде при отсутствии руки (препятствия) открывать крышку, выключать тумблер, закрывать крышку, но если тумблер выключен ничего не происходит... если я правильно понял...потом ее можно будет усовершенствовать... т.е. пока обычные if , else
ИМХО, начинать нужно с простого, а потом наворачивать или я невнимательно прочитал... завтра будет время почитаю...
начните с простого, написать прогу которая буде при отсутствии руки (препятствия) открывать крышку, выключать тумблер, закрывать крышку
уже, даж вопросы появились ))))
...в общем, думаю управлять через питание(МК-инвертор-мосфет-датчик), коряво конечно, но иное не позволяют имеющиеся у меня знания Ардуино.
не совсем понял про условие, вернее куда (в установки? в движение?) его добавить.
аа! в установки. вначале задаю условие что "труе", а что "фальш", потом оперирую ими.
хорошо.
но к чему (рычаг? крышка? ИК-датчик? положение сервы?) привязать эти значения?
к рычагу - никак, нет там датчиков, а вешать ещё один - это не кошерно ))
к сигналу ИК-датчика - так он привязан к порту и на его выходе или "0" или "1", тут скорее надо отвязывать.
остаётся положение сервы (ну когда она рычагом приподняла крышку)?
ну так опять станет вопрос - "как сделать так, что бы ДО приподнятия крышки на датчик никто не реагировал".
...или я не понял
например открытая крышка у тебя 90 градусов. а сейчас она закрыта и например 70 градусов
если ты отдал команду серве повернуть до 90 градусов ты можешь считать что серва свое дело сделает и крышка будет открыта? флаг=0
если отдал команду на 70 градусов считаем что крышка закрыта флаг=1
польза от кукурузы понятна, но не понятно что такое кукуруза(с)
можно пример с флагом? а то я что-то не совсем понял как его применить.
но идея здравая, спасибо.
например датчик сработал на выходе 1, в другом случае 0
if(sensor==1){ ... }добавляем флаг в условие
if(sensor==1 && flag==0){ ....... }или более короткая запись
if(sensor && !flag){ ....... }спасибо.
можно пояснить что происходит в программе, когда добавляется этот флаг?
и, если у меня активный "0"(когда есть препятствие), то короткая форма мне не подходит, верно? надо прописывать"sensor == 0", да?
получается что мне надо что-то типа:
if (pos1 == ServoMaxPos - 85 && sensor==0 && flag==1)// когда серво в этом положении, сигнал от датчика принимается //далее прописываю действия при поступлении сигнала { .... } else (!pos1 == ServoMaxPos - 85 && sensor==0 ) // если серво в любой позиции, кроме указанной { flag == 0; // сенсор игнорируется }возникает вопрос - как можно указать любое положение сервы после реагирования и до наступления нового цикла?
суть вот в чём:
1. в исходном положении датчик в коробке и программа должна его игнорировать.
2. когда серва в указанном положении, датчик флагом включается, программа реагирует.
3. далее датчик надо опять отключить(ведь серва возвращатся будет через то же самое положение!).
4. но после возврата в ИП, система должа какбы обнулится.
если я правильно понимаю логику работы с "flag", то надо его включать после того, как серва приняла указанное положение и выключать при поступлении сигнала с датчика, после отдачи команды на серву для выключения тумблера.
2 и 3 запись это одно и тоже. пиши как нравится или понятнее. я раньше и иногда сейчас чтобы бросалось в глаза пишу flag==1
положение сервы ты не можешь знать, но как только отдал команду серве можно считать с этого момента что например дверь закрылась, в реальности она еще закрывается. но так как в эти моменты работа сенсора будет нестабильна лучше их не использовать
единственное когда отдашь команду на открытие нужен delay(200) например чтобы успела открыться крышка, а потом уже flag=0
flag нужен для того чтобы его запихнуть в условие, он показывает дверца открыта или нет. и если закрыта добавление flag в условие обработки датчика не даст программе реагировать на сенсор
короче flag=1 как только отдашь команду на закрытие а потом delay(200) чтобы подождать пока закроется
flag=0 после того как отдашь команду открыть и подождешь delay(200) чтобы подождать пока откроется
karl2233, не знаю, читали Вы или нет этот топик
код в обсуждении :)
jeka_tm
спасибо за доходчивое пояснение!
karl2233, не знаю, читали Вы или нет этот топик
код в обсуждении :)
ОООООООООО! это то что надо!
огроменное спасибо! и как это я мимо прошел!?
я на основе этого проекта и делаю, по итогу код слегонца упростил, причесал и теперь по-новой переписываю в виду поставленной задачи :)
SU-27-16, нашел свои перлы дебага :)))))))))
....
и куда он придёт ? после "дебагте пошагово" ?
:(
вот шедевр изваращения с кодом (мои первые шаги, хорошая привычка ничего не удалять) один сплошной дебаг, кому интересно скомпилите:
ЗЫ. все самое интересное в loop
/* установка времени в DS1307 с помощью одной кнопки и монитора порта - работает; установка времени поразрядно, для входа в режим - держи кнопку. DS1307 - подключен к i2c (IIC), кнопка к выводу D6 на землю, 10к резистор к D6 на +5В; главная проблема - вес скетча!!! ; кому нечего делать может прицепить диоды :) ; */ #include <Wire.h> // enable I2C bus #include "DS1307.h" DS1307 clock;//define a object of DS1307 class int inpin1=6;// define digital interface #6 //int inpin2=7;// define digital interface #7 int led1=8, led2=9, led3=10, led4=11, led5=12, led6=13; //int f, g; void setup() { Serial.begin(9600); Wire.begin(); // start up I2C bus delay(1000); clock.begin(); delay(1000); pinMode(inpin1,INPUT);//define button interface as input для разрядов и входа в режим програмирования // pinMode(inpin2,INPUT);//define button interface as input для установки чисел в разрядах pinMode(led1,OUTPUT);//define button interface as OUTput pinMode(led2,OUTPUT);//define button interface as OUTput pinMode(led3,OUTPUT);//define button interface as OUTput pinMode(led4,OUTPUT);//define button interface as OUTput pinMode(led5,OUTPUT);//define button interface as OUTput pinMode(led6,OUTPUT);//define button interface as OUTput } void set2Time() { //+1 //int inpin1=6;// define digital interface #6 | int inpin2=7;// define digital interface #7 int x, y, y2; // zset, int HD, HS, MD, MS; int HDs, HSs, MDs, MSs; // zset = digitalRead(inpin1); // read the state of the pushbutton value for set time process: if(digitalRead(inpin1)==LOW) //test if the button 1 been pushed { //+2 for(x=0; x<=2; x++) //test 3-5 times for begin set time process --- for 1 begin { ///+3 delay (500); // zset = digitalRead(inpin1); if(digitalRead(inpin1)==LOW) { /* digitalWrite(led2,LOW); delay (200); digitalWrite(led2,HIGH); delay (200); digitalWrite(led2,LOW); */ // delay (800); } else { goto stopset; } } ////-3 //// for 1 and clock.getTime(); HD=(clock.hour)/10; HS=(clock.hour)%10; MD=(clock.minute)/10; MS=(clock.minute)%10; HDs=HD; //десятки часа HSs=HS; // единицы часа MDs=MD; //десятки минут MSs=MS; // единицы минут /* Serial.print(HD); Serial.print(HS); Serial.print(":"); Serial.print(MD); Serial.print(MS); Serial.print("\n"); delay(1000); */ for(x=0; x<=6; x++) //ready for set HD for 2 begin { //+4 Serial.print("D1:_"); Serial.print(HDs); Serial.print(HSs); Serial.print(":"); Serial.print(MDs); Serial.print(MSs); Serial.print("\n"); digitalWrite(led3,HIGH); delay (500); digitalWrite(led3,LOW); delay (500); // zset = digitalRead(inpin1); if(digitalRead(inpin1)==LOW) { //+5 digitalWrite(led4,LOW); delay (400); digitalWrite(led4,HIGH); delay (400); digitalWrite(led4,LOW); delay (400); x=0; if (HDs<3) { y=HDs++ ; /* Serial.print("+-+-"); Serial.print(HDs); Serial.print(HSs); Serial.print(":"); Serial.print(MDs); Serial.print(MSs); Serial.print("\n"); */ } if (HDs>=3) { y=0; HDs=y; /* Serial.print("----"); Serial.print(HDs); Serial.print(HSs); Serial.print(":"); Serial.print(MDs); Serial.print(MSs); Serial.print("\n"); */ } y=HDs; /* Serial.print("+++"); Serial.print(HDs); Serial.print(HSs); Serial.print(":"); Serial.print(MDs); Serial.print(MSs); Serial.print("\n"); */ } //-5 } //-4 // and for 2 Serial.print("SET_D1_and_ "); Serial.print(HDs); Serial.print(HSs); Serial.print(":"); Serial.print(MDs); Serial.print(MSs); Serial.print("\n"); delay (100); for(x=0; x<=6; x++) //ready for set HS for 3 begin { //+4 /* digitalWrite(led3,LOW); delay (300); digitalWrite(led3,HIGH); delay (300); digitalWrite(led3,LOW); */ Serial.print("D2:_"); Serial.print(HDs); Serial.print(HSs); Serial.print(":"); Serial.print(MDs); Serial.print(MSs); Serial.print("\n"); delay (1200); // zset = digitalRead(inpin1); if(digitalRead(inpin1)==LOW) { //+5 /* digitalWrite(led4,HIGH); delay (400); digitalWrite(led4,LOW); delay (400); digitalWrite(led4,HIGH); delay (400); digitalWrite(led4,LOW); */ // delay (800); x=0; if (HDs==2) { if (HSs<4) { y2=HSs++ ; /* Serial.print("D2_HSs+-"); Serial.print(HDs); Serial.print(HSs); Serial.print(":"); Serial.print(MDs); Serial.print(MSs); Serial.print("\n"); */ y2=HSs; } if (y2>=4) { /* Serial.print("D2_HSs+-+-+-+-"); Serial.print(HDs); Serial.print(HSs); Serial.print(":"); Serial.print(MDs); Serial.print(MSs); Serial.print("\n"); */ y2=0; HSs=y2; /* Serial.print("+-+-000--"); Serial.print(HDs); Serial.print(HSs); Serial.print(":"); Serial.print(MDs); Serial.print(MSs); Serial.print("\n"); */ } } if (HDs<2) { if (HSs<10) { y2=HSs++ ; y2=HSs; /* Serial.print("+-+- HDs<2_HSs<10_"); Serial.print(HDs); Serial.print(HSs); Serial.print(":"); Serial.print(MDs); Serial.print(MSs); Serial.print("\n"); */ } if (HSs>=10) { y2=0; HSs=y2; /* Serial.print("+-+-HSs>=10_y2=0_"); Serial.print(HDs); Serial.print(HSs); Serial.print(":"); Serial.print(MDs); Serial.print(MSs); Serial.print("\n"); */ } } /* Serial.print("+++"); Serial.print(HDs); Serial.print(HSs); Serial.print(":"); Serial.print(MDs); Serial.print(MSs); Serial.print("\n"); */ } //-5 } //-4 // and for 3 Serial.print("SET_D2_and_ "); Serial.print(HDs); Serial.print(HSs); Serial.print(":"); Serial.print(MDs); Serial.print(MSs); Serial.print("\n"); delay (100); for(x=0; x<=6; x++) //ready for set MD for 4 begin { //+4 /* digitalWrite(led3,LOW); delay (300); digitalWrite(led3,HIGH); delay (300); digitalWrite(led3,LOW); */ Serial.print("D3:_"); Serial.print(HDs); Serial.print(HSs); Serial.print(":"); Serial.print(MDs); Serial.print(MSs); Serial.print("\n"); delay (1200); // zset = digitalRead(inpin1); if(digitalRead(inpin1)==LOW) { //+5 /* digitalWrite(led4,HIGH); delay (400); digitalWrite(led4,LOW); delay (400); digitalWrite(led4,HIGH); delay (400); digitalWrite(led4,LOW); */ delay (800); x=0; //--------------------------------------------------------------------------- if (MDs<6) { y2=MDs++ ; y2=MDs; /* Serial.print("+-+- MDs<6_"); Serial.print(HDs); Serial.print(HSs); Serial.print(":"); Serial.print(MDs); Serial.print(MSs); Serial.print("\n"); */ } if (MDs>=6) { y2=0; MDs=y2; /* Serial.print("+-+-MDs>=6_y2=0_"); Serial.print(HDs); Serial.print(HSs); Serial.print(":"); Serial.print(MDs); Serial.print(MSs); Serial.print("\n"); */ } //---------------------------------------------------------------------- /* Serial.print("+++"); Serial.print(HDs); Serial.print(HSs); Serial.print(":"); Serial.print(MDs); Serial.print(MSs); Serial.print("\n"); */ } //-5 } //-4 set MD and of for 4 Serial.print("SET_D3_and_ "); Serial.print(HDs); Serial.print(HSs); Serial.print(":"); Serial.print(MDs); Serial.print(MSs); Serial.print("\n"); delay (100); for(x=0; x<=6; x++) //ready for set MS for 5 begin { //+4 /* digitalWrite(led3,LOW); delay (300); digitalWrite(led3,HIGH); delay (300); digitalWrite(led3,LOW); */ Serial.print("D4:_"); Serial.print(HDs); Serial.print(HSs); Serial.print(":"); Serial.print(MDs); Serial.print(MSs); Serial.print("\n"); delay (1200); // zset = digitalRead(inpin1); if(digitalRead(inpin1)==LOW) { //+5 /* digitalWrite(led4,HIGH); delay (400); digitalWrite(led4,LOW); delay (400); digitalWrite(led4,HIGH); delay (400); digitalWrite(led4,LOW); */ // delay (800); x=0; //--------------------------------------------------------------------------- if (MSs<10) { y2=MSs++ ; y2=MSs; /* Serial.print("+-+- MSs<10_"); Serial.print(HDs); Serial.print(HSs); Serial.print(":"); Serial.print(MDs); Serial.print(MSs); Serial.print("\n"); */ } if (MSs>=10) { y2=0; MSs=y2; /* Serial.print("+-+-MSs>=10_y2=0_"); Serial.print(HDs); Serial.print(HSs); Serial.print(":"); Serial.print(MDs); Serial.print(MSs); Serial.print("\n"); */ } //---------------------------------------------------------------------- /* Serial.print("+D5++"); Serial.print(HDs); Serial.print(HSs); Serial.print(":"); Serial.print(MDs); Serial.print(MSs); Serial.print("\n"); */ } //-5 } //-4 set MS and of for 5 Serial.print("SET_D4_and_ "); Serial.print(HDs); Serial.print(HSs); Serial.print(":"); Serial.print(MDs); Serial.print(MSs); Serial.print("\n"); delay (1200); //---------------------write to DS1307 HD=(HDs*10+HSs); if (HD>=24) //защита от кривых рук :) { HD=0; } MD=(MDs*10+MSs); if (MD>=60) //защита от кривых рук :) { MD=0; } /* Serial.print(HD, DEC); Serial.print(":"); Serial.print(MD, DEC); Serial.print("\n"); delay(1000); */ clock.fillByHMS(HD,MD,30); clock.setTime(); /*{ Serial.begin(9600); clock.begin(); clock.fillByYMD(2014,11,26);// (2013,1,19) Jan 19,2013 clock.fillByHMS(19,50,30);// (15,28,30) 15:28 30" clock.fillDayOfWeek(TUE);// (SAT) Saturday clock.setTime();//write time to the RTC chip //комент на 4 строки для установки вренени и даты } */ //------------------------------------------------ } //-2 stopset: ; } //-1 void loop() { int l; for (l=0; l<=2; l++) { clock.getTime(); Serial.print(clock.hour, DEC); Serial.print(":"); Serial.print(clock.minute, DEC); Serial.print("\n"); delay(1000); } set2Time(); digitalWrite(led1,HIGH); delay (400); digitalWrite(led1,LOW); delay (400); }открыл для себя хорошую книгу
сварганил простецкий датчик tsop1738+ИК светодиод управляемый МК(генерит 38кГц и смотрит за приёмником).
вопрос:
можно ли после запуска программы ("loop") внутри запустить ещё один "loop"? и как потом этот второй остановить по наступлению события?
например(я всё про коробку, ибо в той теме автор не отвечает, видимо мало кому интересно):
1. идёт основная программа (система в ожидании воздействия на тумблер).
2. включили тумблер.
3. серво приняло среднее (не ИП и не такое, при котором тумблер выкл) положение.
4. запустился второй "loop" внутри которого крутится программа (генерация импульсов частотой 38кГц) управления ИК датчиком и приёмником.
5. пришел сигнал на ИК приёмник. этот сигнал дал команду серве на выключение тумблера. и вот тут нужно остановить второй "loop" что бы датчик не реагировал.
6. когда система вернётся в ИП(п.1), то всё повторяется.
ээээ. а чем не нравится простой if?
датчик, когда в коробке будет реагировать на замкнутое пространство (оно же препятсвие).
поэтому датчик надо включать тогда, когда крышка приоткрыта, а когда сигнал пришел или крышка закрыта, то надо его отключить.
или я не понял? )
if(чегототам) {
делай раз
} else {
делай два
}
И зачем тут еще один луп?
хм... спасибо.
а в принцепе, второй loop внутри первого возможен?