прошу помощи в проверке кода

Тема в разделе "Arduino & Shields", создана пользователем totoshka41, 9 окт 2018.

  1. totoshka41

    totoshka41 Нуб

    Добрый день уважаемые форумчане! Так сложилась моя нелегкая ситуация, что необходима Ваша помощь, а именно есть "как бы работающий скетч", человек , который его делал утверждает что он полностью рабочий, но я , подключая свои девайсы, немогу точно так же утверждать. Будет ли у Вас возможность проверить данное творение? Очень на это уповаю! Да прибудет с Вами сила!)
    Необходима ардуино Нано, уздатчик, реле(лоу тригер), потенциометр 10ком, ргб светодиод и обычный светодиод.

    /*
    дальномер во время мигания отображает реальную дальность измерения
    (допустим прибор ставится в узкий пролет (до 1 метра) - вкл питание,
    настроил макс дальность срабатывания ((это желтый свет ргб светодиода)
    т.е. я установил потенциометром определенную дистанцию (например 1 м, наглаз)
    всё что дальше 1 м - не регистрируется (устройство не реагирует),
    всё что ближе отображается желтым ргб (а после 30 сек и замыкает реле).
    Первые 30 сек реле не реагирует на возникновение препятствий,
    а после, при возникновении иных, замыкается.
    Тоесть первые 30 секунд необходимы для комфортной установки устройства,
    а после 30 секунд устройство работает в нормальном режиме (преграда - замыкает реле)
    */

    ////// выводы подключения компонентов //////////

    const int potPin = A0;

    const int echoPin = 9;
    const int trigPin = 8;

    const int relay = 15; /// A1
    const int g_led = 16; /// A2
    const int b_led = 17; /// A3
    const int led = 18; /// A4

    ///////// переменные //////////////////

    long period = 300; /// период снятия показаний с дальномера 300 - 0.3 сек
    long blink_period_0 = 1000; /// период миганий кр. светодиода в начале 1000 - 1 сек
    long blink_period_1 = 500; /// период миганий кр. светодиода в конце 500 - 0.5 сек
    long relay_period = 3000; /// время работы реле 3000 - 3 сек

    unsigned long us_millis = 0;
    unsigned long time = 0;
    unsigned long relay_time = 0;

    int distance = 0;
    int distance_control = 0;
    int counter = 0;
    byte state = 0;
    byte led_state = 0;
    byte blink_state = 0;



    void setup()
    {
    Serial.begin (9600);

    pinMode(trigPin, OUTPUT);
    pinMode(echoPin, INPUT);
    pinMode(g_led, OUTPUT);
    pinMode(b_led, OUTPUT);
    pinMode(led, OUTPUT);
    pinMode(relay, OUTPUT);
    digitalWrite(relay, HIGH);
    }

    void loop()
    {
    Serial.print(distance_control);
    Serial.print(" ");
    Serial.print(distance);
    Serial.print(" ");
    Serial.print(blink_state);
    Serial.print(" ");
    Serial.println(counter);

    ////////////// работа дальномера //////////////////////

    if (millis() - us_millis >= period)
    {
    DISTANCE();
    us_millis = millis();
    }


    /////// определяем предельное расстояние только в первые 30 сек ////////////////////

    if (blink_state < 2)
    {
    distance_control = map(analogRead(potPin), 0, 1023, 10, 200);
    }


    ////// мигаем красным светодиодом //////////////

    if (blink_state == 0)
    {
    if ((millis() - time) > (led_state ? blink_period_0 : blink_period_0))
    {
    led_state = !led_state;
    counter ++;
    digitalWrite(led, led_state);
    time = millis();
    }

    if (counter >= 20)
    {
    counter = 0;
    blink_state = 1;
    }
    }

    if (blink_state == 1)
    {
    if ((millis() - time) > (led_state ? blink_period_1 : blink_period_1))
    {
    led_state = !led_state;
    counter ++;
    digitalWrite(led, led_state);
    time = millis();
    }

    if ((counter / 2) >= 10)
    {
    counter = 0;
    digitalWrite(led, LOW);
    blink_state = 2;
    }
    }

    ////////// РАБОЧИЙ ЦИКЛ //////////////////////


    if (distance > 0 && distance < distance_control && blink_state == 2)
    {
    digitalWrite(g_led, HIGH);
    digitalWrite(b_led, HIGH);
    digitalWrite(relay, LOW);
    relay_time = millis();
    state = 1;
    }

    if (state == 1)
    {
    if (millis() - relay_time > relay_period)
    {
    digitalWrite(g_led, LOW);
    digitalWrite(relay, HIGH);
    state = 2;
    }
    }
    }

    ////////// функция измерения расстояния дальномером /////////////////

    void DISTANCE()
    {
    digitalWrite(trigPin, LOW);
    delayMicroseconds(2);
    digitalWrite(trigPin, HIGH);
    delayMicroseconds(10);
    digitalWrite(trigPin, LOW);

    distance = pulseIn(echoPin, HIGH) / 58;
    }
     
  2. Andycat

    Andycat Нерд

    1 вставьте нормально код
    2 у вас два варианта, или учить самому программирование или обратиться к автору кода
     
  3. ostrov

    ostrov Гуру

  4. ZAZ-965

    ZAZ-965 Гуру

    Смущают эти строки (тернарный оператор не делает выбора)
    Код (C++):
    if ((millis() - time) > (led_state ? blink_period_0 : blink_period_0)
    if ((millis() - time) > (led_state ? blink_period_1 : blink_period_1))