Датчик препятствий и серво(бесполезная коробка)

karl2233
Offline
Зарегистрирован: 05.07.2015

Хэлп ми, в смысле мозг кипит и словил цикл %

собираю бесполезную коробку, хочу добавить движение (после того, как включить тумблер):

"Рычаг медленно чуть вылазит о останавливается (крышка приоткрыта так, что бы ИК-датчик видел тумблер), и ждёт. Если есть движение к тумблеру, то рычаг быстро выключает его; если движения нет минуту - то медленно выключает тумблер и медленно прячется".

суть проблемы:

ИК датчик(555 таймер+TSOP1738) включен постоянно, следовательно подаёт сигнал будучи в коробке. Никак не могу его на время пребывания в коробке(и после срабатывания) деактивировать.

как-то так

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

кто нибудь понял?

karl2233
Offline
Зарегистрирован: 05.07.2015

а что тут понимать?

вроде всё по-русски, запятые на месте.

суть проста и непонятна - датчик препятствий, практически постоянно выдавая "0", херит такую хорошую(я про задуманное движение в "бесполезной коробке") идею.

или я не понял что ты не понял?=)

...как вариант, запуск 555 таймера(который генерит 38кГц на светолиод) по сигналу с Ардуины.

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

1 бит надо поменять с 3им, так как разводка не позовола сделать иначе. хардварный spi решил не использовать, скорости отрисовки итак хватает. в целом все хорошо, но либо размер поменять либо расстояние

вопрос: так как динамическая индикация, как точно ловить время между импульсами без прерываний, так как изза длительности кода от delay(2) отказываться не стоит

я знаю о чем я, так как сам писал код и делал устройство. ты нет. сможешь ответить на вопрос?

karl2233
Offline
Зарегистрирован: 05.07.2015

так ты из ЭТИХ?! о_О...

вопросом на вопрос которые отвечают ))))

причём тут кто код  писал?

есть проект - "бесполезная коробка" (надеюсь слышал про таке?). там есть всякие движения рычага, выключающего тумблер.

вот я и хочу разнообразить эти движения, введя реагирование на руку человека.

 алгоритм простой:

1. включили тумблер (обычно рычаг его выключает сразу или после каки-то движений или ожидания).

2. рычаг, выключающий тумблер, медленно вылазит на половину (т.е. крышка приоткрывается) и останавливается.

3. на крышке, изнутри, висит датчик препятствия, "смотрящий" на тумблер.

4. как только человек тянет руку к тумблеру (ведь никакой реакции кроме как полуоткрытая крышка не последовало), то рычаг быстро выключает тумблер и прячется в коробку.

5. крышка закрывается.

так вот, проблема в том, что датчик всё время щупает пространство и когда он в коробке то реагирует на всё и даёт команду на серву, которая дергается.

т.е. датчик надо мне как-то включать только при открытой крышке и до выключения тумблера.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

а вот оно что. я должен погуглить чтобы узнать о чем ты, чтобы понять о чем ты пишешь

а я то думал что это тебе нужно больше

почитай

http://arduino.ru/forum/obshchii/sozdanie-temy#comment-75012

karl2233
Offline
Зарегистрирован: 05.07.2015

н-дя...

Puhlyaviy до пары не хватает =)

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

я даже немного разочарован

karl2233
Offline
Зарегистрирован: 05.07.2015

забей.

я сильнее разочарован

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012
trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Была, была с датчиком :   сначала работала быстро, а потом открывала крышку и ждала...
Дёргалась, вроде дразнила, руку подносили- резко хлопала тумблером.

Это не та, но ближе: https://www.youtube.com/watch?v=apVR5Htz0K4

karl2233
Offline
Зарегистрирован: 05.07.2015

по-тихоньку разобрался сам: надо вводить дополнительные условия

Гриша
Offline
Зарегистрирован: 27.04.2014

karl2233 пишет:

по-тихоньку разобрался сам: надо вводить дополнительные условия

Вы просто замечательно описали алгоритм, скетч просто супер, а схема простенькая, такую каждый знает. Вобщем я вообще не понимаю, что тут может не работать!? Ну разве что спиртом плату протиреть, можено пальцами пощелкать, вдруг скорости не хватает...

А про дополнительные условия Вы погорячились, я вот просматриваю скетч - думаю это лишнее, алгоритму соответствовать не будет. Ну или меняйте алгоритм работы.

ну как-то так, чего не понятно?

karl2233
Offline
Зарегистрирован: 05.07.2015

Гриша, алгоритм описан нормально. Что не понятно?

Схему  я не выкладывал, ибо вопрос не в ней - там всё ОК (но если кому надо выложу).

Скетч кто-то спрашивал? Нет, кстати, вот он:

 // Медленный выход рычага, задержка под крышкой
 // ожидание сигнала с ИК датчика
 // при наличии сигнала - резкое выключение и возврат в исх.положение

  {
    // Тумблер Включен
    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)
         }

  }

теперь проблема в другом - при повторном включении тумблера происходит просто выключение оного без всяких фокусов (((

 

 

 

 

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

[quote=karl2233]

Скетч кто-то спрашивал?

теперь проблема в другом - при повторном включении тумблера происходит просто выключение оного без всяких фокусов (((

quote]

вы его сами должны были выложить....
повторное выключение включенного тумблера - значит коробочка устала от вашего кода и хочет спать.....
....может быть вы в коде прописали коробочке интеллект ?

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

karl2233 пишет:

н-дя...

Puhlyaviy до пары не хватает =)

jeka_tm  к нему зачем присоединили ?
- похвала ????
- фееееее ????

karl2233
Offline
Зарегистрирован: 05.07.2015

изначально вопрос был скорее теоретический - "как".

теперь перешел в сторону практики.

результат - одинаков :) что с кодом, что без. так что разницы нет, как понимаю, можно было и не спрашивать =)

 

 

 

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

классная версия !!!!!!!!!!!!!!!!!
:)

karl2233
Offline
Зарегистрирован: 05.07.2015

версия класная, но код....

как для начинающего(я про себя) это нереально

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

karl2233 пишет:

изначально вопрос был скорее теоретический - "как".

результат - одинаков :) что с кодом, что без. так что разницы нет, как понимаю, можно было и не спрашивать =)

вам же ответили нормальные люди - "так" , "сяк" , или "этак"
.....можно и не спрашивать :(
или спросить по другому ?

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

karl2233 пишет:

как для начинающего(я про себя) это нереально

да , наверное.....
и это повод наехать на Жеку и Пухлявого ?

...ждите Дохтура тогда. У его есть пилюли..... в рифму....

JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012

Да чтож ты мне спокойно поболеть не даешь!

Вот привязался!

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

предлагаю начать сначала . сначала описать проблему как здесь описано

http://arduino.ru/forum/obshchii/sozdanie-temy#comment-75012

но не скрывая. если проблема возможно касается схемы нужна схема, конкретная железка - ссылка на него

и по работе конкретно: как работает и что хочется получить подробно!!! в чем конкретно проблема

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

JollyBiber пишет:

Да чтож ты мне спокойно поболеть не даешь!

Вот привязался!

яяяяяяяя ??????????????????
дай таблетку-антидот ! а то прописал хер знает что и забыл ( или забил ? ) , а мине клизмы типеричя снятся ардуированные.....

выздоравливай ! конечно же ! :)

karl2233
Offline
Зарегистрирован: 05.07.2015

тема, за бесполезностью, закрыта.

всем спасибо, все свободны (с)

з.ы. заболевшим - выздоровления!

:)

Гриша
Offline
Зарегистрирован: 27.04.2014

karl2233, вроде форум читали, а вопросы задаете как новечек... вот поставьте себя на наше место и перечитайте топик - я Вас уверяю в самом начеле (кроме самой идеи) никакой информации по существу вопроса, и только в 13м посте явился код!!! и сразу вопрос - это весь код? он в LOOP?

что со строкой 25 и 27 -  previousMillis  -  там точно все ровно?

Гриша
Offline
Зарегистрирован: 27.04.2014

какие переменные ключевые? посмотрите их в порте и поставте delay() это поможет понять в какой момент в переменной появляется не нужное значение - дебагте пошагово

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

это от нервов....
и куда он придёт ? после "дебагте пошагово" ?
:(

Гриша
Offline
Зарегистрирован: 27.04.2014

SU-27-16 пишет:

это от нервов....
и куда он придёт ? после "дебагте пошагово" ?
:(

не вкурил сарказма :) есть логика работы, есть переменные... мы умеем на компьютере смотреть значение этих переменных в ключевых местах? или сарказм был про каждый шаг? мы ожидаем увидеть систему в каком-то состоянии = значение переменных, вот их и нужно смотреть. Ну особо профи могут и без этого, но для этого нужен опыт.

karl2233
Offline
Зарегистрирован: 05.07.2015

Гриша,  вопрос был "Никак не могу его на время пребывания в коробке(и после срабатывания) деактивировать."

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

что касательно кода - решил писать его заново (хе-хе).

теперь проблемы возникают по ходу действа ))))

 // Тумблер Включен
    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. как вернуть рычаг обратно (т.е. систему в исходное положение )))))

 *мантру "рычаг вернись" и земные поклоны делал, в бубен бил = результата нет*

 

 

karl2233
Offline
Зарегистрирован: 05.07.2015

Гриша пишет:

что со строкой 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" давать после приподнятия крышки, а потом давать команду на отключение?

...вот и вернулось всё на круги своя )))))

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

а датчик то какой? ик?

короче 2 варианта: если ик отключать ик диод пока внутри или добавить флаг, что если отдали команду закрыть крышку флаг=1, если крышка открыта=0

а в обработке датчика добавить условие что если флаг=0 и сработал датчик то делать .....

karl2233
Offline
Зарегистрирован: 05.07.2015

jeka_tm, датчик на компараторе (или на 555), не суть.

главное что в исходном состоянии на выходе лог "1", когда есть препятствие лог "0".

подключить датчик я смог, а вот отключить его или управлять его включением не понимаю как.

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

не суть? то спрашиваешь что делать, как отключить датчик, но не говоришь что за датчик. ну дело твое

говорил уже: добавить флаг, переменная boolean у которой 2 состояния возможных. ты же знаешь по программе крышка сейчас открыта или нет, хотя бы по положению сервы. двойное условие не проблема сделать, пишется через &&

karl2233
Offline
Зарегистрирован: 05.07.2015

не совсем понял про условие, вернее куда (в установки? в движение?) его добавить.

аа! в установки. вначале задаю условие что "труе", а что "фальш", потом оперирую ими.

хорошо.

но к чему (рычаг? крышка? ИК-датчик? положение сервы?) привязать эти значения?

к рычагу - никак, нет там датчиков, а вешать ещё один - это не кошерно ))

к сигналу ИК-датчика - так он привязан к порту и на его выходе или "0" или "1", тут скорее надо отвязывать.

остаётся положение сервы (ну когда она рычагом приподняла крышку)?  

ну так опять станет вопрос - "как сделать так, что бы ДО приподнятия крышки на датчик никто не реагировал".

...или я не понял

 

Гриша
Offline
Зарегистрирован: 27.04.2014

начните с простого, написать прогу которая буде при отсутствии руки (препятствия) открывать крышку, выключать тумблер, закрывать крышку, но если тумблер выключен ничего не происходит... если я правильно понял...потом ее можно будет усовершенствовать... т.е. пока обычные if , else

ИМХО, начинать нужно с простого, а потом наворачивать или я невнимательно прочитал... завтра будет время почитаю...

karl2233
Offline
Зарегистрирован: 05.07.2015

Гриша пишет:

начните с простого, написать прогу которая буде при отсутствии руки (препятствия) открывать крышку, выключать тумблер, закрывать крышку

уже, даж вопросы появились ))))

...в общем, думаю управлять через питание(МК-инвертор-мосфет-датчик), коряво конечно, но иное не позволяют имеющиеся у меня знания Ардуино.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

karl2233 пишет:

не совсем понял про условие, вернее куда (в установки? в движение?) его добавить.

аа! в установки. вначале задаю условие что "труе", а что "фальш", потом оперирую ими.

хорошо.

но к чему (рычаг? крышка? ИК-датчик? положение сервы?) привязать эти значения?

к рычагу - никак, нет там датчиков, а вешать ещё один - это не кошерно ))

к сигналу ИК-датчика - так он привязан к порту и на его выходе или "0" или "1", тут скорее надо отвязывать.

остаётся положение сервы (ну когда она рычагом приподняла крышку)?  

ну так опять станет вопрос - "как сделать так, что бы ДО приподнятия крышки на датчик никто не реагировал".

...или я не понял

 

например открытая крышка у тебя 90 градусов. а сейчас она закрыта и например 70 градусов

если ты отдал команду серве повернуть до 90 градусов ты можешь считать что серва свое дело сделает и крышка будет открыта? флаг=0

если отдал команду на 70 градусов считаем что крышка закрыта флаг=1

 

karl2233
Offline
Зарегистрирован: 05.07.2015

польза от кукурузы понятна, но не понятно что такое кукуруза(с)

можно пример с флагом? а то я что-то не совсем понял как его применить.

но идея здравая, спасибо.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

например датчик сработал на выходе 1,  в другом случае 0

if(sensor==1){
...
}

добавляем флаг в условие

if(sensor==1 && flag==0){
.......
}

или более короткая запись

if(sensor && !flag){
.......
}

 

karl2233
Offline
Зарегистрирован: 05.07.2015

спасибо.

можно пояснить что происходит в программе, когда добавляется этот флаг?

и, если у меня активный "0"(когда есть препятствие),  то короткая форма мне не подходит, верно? надо прописывать"sensor == 0", да?

получается что мне надо что-то типа:

if (pos1 == ServoMaxPos - 85 && sensor==0 && flag==1)// когда серво в этом положении, сигнал от датчика принимается
//далее прописываю действия при поступлении сигнала
{
....
}
else (!pos1 == ServoMaxPos - 85 && sensor==0 ) // если серво в любой позиции, кроме указанной
{
flag == 0; // сенсор игнорируется
}

возникает вопрос - как можно указать любое положение сервы после реагирования и до наступления нового цикла?

суть вот в чём:

1. в исходном положении датчик в коробке и программа должна его игнорировать.

2. когда серва в указанном положении, датчик флагом включается, программа реагирует.

3. далее датчик надо опять отключить(ведь серва возвращатся будет через то же самое положение!).

4. но после возврата в ИП, система должа какбы обнулится. 

если я правильно понимаю логику работы с "flag", то надо его включать после того, как серва приняла указанное положение и выключать при поступлении сигнала с датчика, после отдачи команды на серву для выключения тумблера.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

2 и 3 запись это одно и тоже. пиши как нравится или понятнее. я раньше и иногда сейчас чтобы бросалось в глаза пишу flag==1

положение сервы ты не можешь знать, но как только отдал команду серве можно считать с этого момента что например  дверь закрылась, в реальности она еще закрывается. но так как в эти моменты работа сенсора будет нестабильна лучше их не использовать

единственное когда отдашь команду на открытие нужен delay(200) например  чтобы успела открыться крышка, а потом уже flag=0

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

короче flag=1 как только отдашь команду на закрытие а потом delay(200) чтобы подождать пока закроется

 flag=0 после того как отдашь команду открыть и подождешь delay(200) чтобы подождать пока откроется

Гриша
Offline
Зарегистрирован: 27.04.2014

karl2233, не знаю, читали Вы или нет этот топик

код в обсуждении :)

karl2233
Offline
Зарегистрирован: 05.07.2015

jeka_tm

спасибо за доходчивое пояснение!

Гриша пишет:

karl2233, не знаю, читали Вы или нет этот топик

код в обсуждении :)

ОООООООООО! это то что надо!

огроменное спасибо! и как это я мимо прошел!?

я на основе этого проекта и делаю, по итогу код слегонца упростил, причесал и теперь по-новой переписываю  в виду поставленной задачи :)

Гриша
Offline
Зарегистрирован: 27.04.2014

SU-27-16, нашел свои перлы дебага :)))))))))

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);
}

 

karl2233
Offline
Зарегистрирован: 05.07.2015

открыл для себя хорошую книгу

karl2233
Offline
Зарегистрирован: 05.07.2015

сварганил простецкий датчик tsop1738+ИК светодиод управляемый МК(генерит 38кГц и смотрит за приёмником).

вопрос:

 можно ли после запуска программы ("loop") внутри запустить ещё один "loop"? и как потом этот второй остановить по наступлению события?

например(я всё про коробку, ибо в той теме автор не отвечает, видимо мало кому интересно):

1. идёт основная программа (система в ожидании воздействия на тумблер).

2. включили тумблер.

3. серво приняло среднее (не ИП и не такое, при котором тумблер выкл) положение.

4. запустился второй "loop" внутри которого крутится программа (генерация импульсов частотой 38кГц) управления ИК датчиком и приёмником.

5. пришел сигнал на ИК приёмник. этот сигнал дал команду серве на выключение тумблера. и вот тут нужно остановить второй "loop" что бы датчик не реагировал.

6. когда система вернётся в ИП(п.1), то всё повторяется.

 

JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012

ээээ. а чем не нравится простой if?

karl2233
Offline
Зарегистрирован: 05.07.2015

датчик, когда в коробке будет реагировать на замкнутое пространство (оно же препятсвие).

поэтому датчик надо включать тогда, когда крышка приоткрыта, а когда сигнал пришел или крышка закрыта, то надо его отключить.

или я не понял? )

JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012

if(чегототам) {

делай раз

} else {

делай два

}

И зачем тут еще один луп?

karl2233
Offline
Зарегистрирован: 05.07.2015

хм... спасибо.

а в принцепе, второй loop внутри первого возможен?