Задачка по миганию светодиода

Тема в разделе "Arduino & Shields", создана пользователем buktopz, 17 сен 2017.

  1. buktopz

    buktopz Нерд

    Господа программисты, подскажите, пожалуйста, скетч для следующего алгоритма:
    - если светодиод мигает с частотой 1Гц (примерно 1 секунда)
    - контроллер считывает это и и выполняет некое действие
    - иначе (если светодиод горит постоянно или не горит) контроллер выполняет другое действие
     
  2. qwone

    qwone Гик

    Напоминает анекдот:
    После свадьбы молодые договариваются о том, как жить будут. И вот новоиспечённый муж говорит молодой супруге:

    - Дорогая, я хочу тебя предупредить! Когда я возвращаюсь домой с работы в кепке, надетой козырьком вперёд, значит, настроение у меня хорошее и всё в порядке. А если козырёк у кепки назад, то настроение у меня плохое, веди себя тихо, молчи и не нервируй меня!

    -Милый, - отвечает ему супруга, - я тоже тебя предупредить хочу. Если ты приходишь домой, а у меня "руки в боки", то знай - плевала я на то, как на тебе надета кепка!
     
    NikitOS нравится это.
  3. Airbus

    Airbus Радиохулиган Модератор

    Читайте литературу по программированию используйте операторы if/else и будет Вам Щастье!Можете использовать прерывание по изменению состояния пина-выполнять действие А в прерывании а в основном цЫкле выполнять действие Б. Я ясно изложил?
     
  4. buktopz

    buktopz Нерд

    а вот после if можно поподробнее
     
  5. buktopz

    buktopz Нерд

    а вот после else не обязательно
     
  6. Airbus

    Airbus Радиохулиган Модератор

  7. buktopz

    buktopz Нерд

    я пока по слогам читаю, долго это, может лучше сразу скетч?
     
  8. rkit

    rkit Гуру

    Если вы хотите готовый скетч, то идите в раздел "закажу проект", и описывайте задачу подробно. Откуда у вас взялся светодиод, как он подключен, какое оборудование у вас есть, и что за действия нужно выполнять. Лучше вообще описать прибор, который вы хотите получить в конечном результате.
    Тут и так вы никогда не получите скетча.
     
  9. buktopz

    buktopz Нерд

    все Вы поняли...
     
  10. Подскажите, а есть ли симулятор типа протеуса для ардуинок, пока все в пути хотелось бы с программой ознакомиться?
     
  11. qwone

    qwone Гик

    Пользуясь своим хрустальным шаром , перевожу ТЗ ТС. У него есть устройство скорее всего на автомобиле, а у устройства есть светодиод. А светодиод или потушен(это обычное состояние), или мигает(это аварийное). А так как ТС жадный,ленивый и не очень любит учится, то ему нужно устройство на Ардуине, которое бы опрашивало состояние светодиода и делало что то вместо ТС, когда светодиод мигает или не делало, если светодиод не мигает.
    ПС: Хрустальный шар мутный и китайский, так что гарантии за достоверность никакой.:p
     
  12. buktopz

    buktopz Нерд

    а вот и нет, есть модем, у него есть аварийное отключение на случай зависания, посылаю неверную АТ-команду, если отвечает не ОК, посылаю сигнал на аварийный пин модема. И все бы хорошо, я даже запрашивал состояние модема if((atVal.indexOf("+CPAS: 0" ) > -1) || (atVal.indexOf("+CPAS: 3" ) > -1) || (atVal.indexOf("+CPAS: 4" ) > -1)) и все он правильно понимает и отвечает, но беда в том, что он иногда виснет так, что ничего не принимает и соответственно не чего не отвечает - тупик. Порывшись в даташите, я обнаружил, что есть у него пин состояния. Он и выдает прямоугольный сигнал, в случае нормального состояния. А когда виснет, либо высокий уровень, либо низкий, не меняя состояния. За это хочу зацепиться. Просто думал это форум, поэтому и спросил
     
  13. Airbus

    Airbus Радиохулиган Модератор

    А не тупо к светодиоду цеплятся?Посылаете АТ ждете секунду если не ОК то перезагружаем.Если все же к светодиоду то какие идеи есть?Я бы сделал на прерываниях изменение уровня начинаем считать следующее изменение уровня сброс и снова начинаем считать если не мигает тобишь не сбрасывает считаем до определенного значения потом даем команду на перезагруз.Можно без прерываний по высокому уровню сброс счетчика далее см.выше.Я ясно изложил?Или Вам нужно чтоб за Вас скетч написали?
     
  14. qwone

    qwone Гик

    Ну да . Если к уровень не поменял значение через , к примеру, 1,5 сек то перезагруз. Все решается через millis()
     
  15. buktopz

    buktopz Нерд

    не всегда отвечает на команд, иногда виснет так, что не ответит ничего ни ERROR ни ОК
     
  16. buktopz

    buktopz Нерд

    думаю это неправильно, посчитать он должен количество нулей и единиц скажем секунд за 5. Да я не знаю как написать, ну не хотите подсказать, Ваше дело, буду искать на другом форуме
     
  17. buktopz

    buktopz Нерд

    задача то пустяк для спеца
     
  18. buktopz

    buktopz Нерд

    вот кусок кода
    Код (C++):
    unsigned long atTime = 0;

    void loop()
    {
    if(millis() - atTime > 120000)  // если прошло 2 минуты условно
        {  
            gsm.println("AT+CPAS"); // отправляем команду проверки состояния
            delay(50); // время ожидания ответа с модема, возможно до 100

            // если ответ с модема +CPAS: 0;3;4 , значит всё выходим и идем в луп и засекаем еще 2 мин
            if(gsm.available()>0)    
            {
                delay(50); // время заполнения буфера
                String atVal = "";
                while(gsm.available() > 0)
                {
                    atVal += (char)gsm.read();
                    delay(5);
                }

                if((atVal.indexOf("+CPAS: 0" ) > -1) || (atVal.indexOf("+CPAS: 3" ) > -1) || (atVal.indexOf("+CPAS: 4" ) > -1))
                {
                    // если ответ с модема положительный, то индикация пин 13
                    digitalWrite(STATUS_MODEM, HIGH);
                    delay(100);
                    digitalWrite(STATUS_MODEM, LOW);
                }
                else
                {
                    InitModem(); // иначе новая инициализация
                }
            }
            else // если не помогло
            {          
                resetFunc();  //перезагрузка контроллера
                sms(String("Fails, restore state outputs"), String(phone));  //СМС: "Произошел сбой, восстановите состояние выходов"
            }
                gsm.flush();
                atTime = millis();
        }
     
     
  19. buktopz

    buktopz Нерд

    но resetFunc(); не желательно, мне нужно сохранять состояние выходов контроллера, перезагрузить только модем: InitModem();
    Код (C++):
    void InitModem()
    {
        modemOFF();
        delay(5000);
        modemON();
       
        gsm.println("AT");
        delay(100);
        gsm.println("ATI");
        delay(100);
        gsm.println("ATI");
        delay(100);
         
        gsm.println("AT+CLIP=1");
        delay(100);
        gsm.println("AT+CMGF=1");
        delay(100);
        gsm.println("AT+CSCS=\"GSM\"");
        delay(100);
        gsm.println("AT+CNMI=2,2");
        delay(100);
    }
     
  20. buktopz

    buktopz Нерд

    но проблема в том, что модем ничего не принимает, поэтому и зацепился за выход состояния модема