Мигнуть один раз

Тема в разделе "Arduino & Shields", создана пользователем Zems, 22 окт 2016.

  1. qwone

    qwone Гик

    2 ZAZ-965. Вы давно не пишете в тетрадях в косую линейку, А при чтении не называете буквы в слове. Вот так и здесь. И чем дальше будете писать такие сокращение, тем быстрее будете писать код и больше разбираться в нем. А тексты продвинутых Си-шников они даже мной не читаются, хотя работают. И самое противное если хочешь развиваться, то к этому надо стремиться.

    ПС: А почему на эту конструкцию не прореагировал?
    btm1 = btm1 <<1| digitalRead(btm1_pin);
    if((btm1 &3)==2){
    Вот это и есть странная конструкция.
     
  2. ostrov

    ostrov Гуру

    Такая запись:
    Код (C++):
    digitalWrite(Led1_pin, Led1 =0);// это включает
    digitalWrite(Led1_pin, Led1 =1);// это выключает
    не фишка, а ацкий адъ. Ну нафига тут вообще переменная, если состояние пина указывается явно? На то и переменные, чтобы в них предварительно помещался результат какого то действия, а каков результат не понятно до выполнения.

    И еще, писать HIGH и LOW не дЕбилизм. Если продолжить эту мысль, то писать digitalWrite тоже дебилизм, только PORTB |= 1<<5 и тд.
     
  3. qwone

    qwone Гик

    Точно, но я пока морально не готов.
     
  4. ostrov

    ostrov Гуру

    Вот поэтому учитесь, а не учите.

    1 и 0 могут иметь разный смысл в зависимости от использования. Для состояния пина это HIGH и LOW. Для логики это true и false. Чтобы не запутаться надо не экономить нажатия кнопок, а писать как можно подробнее. Как тут уже говорили - пишется код один раз, а читается десятки. Ваше рацпредложение не только бесполезно , но и вредно. И не только это.
     
  5. qwone

    qwone Гик

    Я и учусь и учу. А вот принимать или отказываться это дело каждого. Код не бульварная газета. Ему не надо быть понятным всем. В обычных скечах народ тупит не по детски. Что на них оринтироваться. Предлагаю ориентироваться на себя. Код должен быть понятен пишушему. Но если у него затык, то его проблема что не прочтут этот код другие.
     
  6. ostrov

    ostrov Гуру

    Когда у вас будет больше сотни программ, да пройдет время полгода и более, будете смотреть на свои каляки маляки и тупить что это и как это. Код должен быть понятным всем, тогда будет понятен и себе.
     
  7. Zems

    Zems Нуб

    Действительно, это моя ошибка, скорее опечатка, я этот код именно для форума написал, в итоге запутал все. Сейчас попробую еще раз описать свою задачу.

    Код (C++):
    if(digitalRead(pin)==HIGHT)//
      digitalWrite(lamp, HIGHT);//включили ламу и она светит пока на pin есть
      digitalWrite(led, HIGHT);//диод  мигнул  при включении
       delay(500); //я понимаю, что делай стопорит весь МК, но для моего скетча это не критично
      digitalWrite(led, LOW); //
    else{                     // иначе лампа не светит, то есть на pin у меня идет сигнал LOW
     digitalWrite(lamp, LOW);}

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

    Как я представляю себе процесс на "русском языке". С включением лампочек все понятно, есть сигнал светит, нет сигнала не светит. С одиночным импульсом сложнее, в голове я себе представляю такую конструкцию:
    Код (C++):
    if(digitalRead(pin)==HIGHT)//
      digitalWrite(lamp, HIGHT);//включили ламу и она светит пока на pin есть
       //Сюда я вставляю некую функцию которая может описана в setup или вначале всего кода. И она мигает мне светодиодом.
    Соответственно мне нужно описать цикл
    Код (C++):
    digitalWrite(led, HIGHT);
       delay(500);
      digitalWrite(led, LOW);
    и просто вставлять его в нужных мне местах, какой то переменной что ли.

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

    rkit Гуру

    Ссылку на достаточно близкий пример я уже давал
     
  9. Zems

    Zems Нуб

    Задачу я свою решил, но пришлось идти в "обход". Реализовал через переменную, которая привязана вообще к другой кнопке, которая перед этим нажимается и отпускается.
    2rkit Ваш пример я внимательно изучил, но все равно получается, что я остаюсь в цикле при удержании "HIGH" на "pin" и как решить задачу при которой "кнопка нажата, один диод светит, а второй один раз мигает" я так и не могу понять.

    Вот кусок скетча с моим решением:
    Код (C++):
    int val=0;



    void loop()

    {
        if(digitalRead(knopka)==HIGH)//если кнопка нажата ...
        {
       
         if (millis() -previousMillis >500)
        {
           previousMillis = millis();
           val++;
        }
        }
        else
     
        if(val>=5)
        {
          digitalWrite(box, 1);
          delay(100);
          digitalWrite(box, 0);
        }


       if(digitalRead(pin)==HIGH)//
         digitalWrite(lamp, HIGH);//включили ламу и она светит пока на pin есть "1"
     
       else{                     // иначе лампа не светит, то есть на pin у меня идет сигнал LOW
         digitalWrite(lamp, LOW);}

       if(digitalRead(pin)==HIGH && val>=5)//
     
         digitalWrite(led, HIGH);//диод  мигнул  при включении
          delay(100); //я понимаю, что делай стопорит весь МК, но в моем случае десятая доля секунды значение не имеет.
         digitalWrite(led, LOW); //
         val = 0; //Обнуляем переменную, что бы диод больше не мигал.
       
    }

    Меня этот вариант устраивает на 99%, но хочу понять как это делать правильно.
     
    Последнее редактирование: 25 окт 2016
  10. rkit

    rkit Гуру

    HIGH, а не HIGHT