Чтение цифровых портов

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

Метки:
  1. MAK

    MAK Нерд

    Господи, человек спросил простую вещь. Ответ "нет" сразу после начального поста.
     
    PAUK нравится это.
  2. fogary

    fogary Гик

    В Вашем варианте, проверка датчика стоит в конце второго цикла FOR. Исходя из этого - do while. Такой цикл выполняется как минимум один раз. Цикл while может ниразу не выполнится, т. к. у него проверка в начале. Какой вариант Вам больше подходит, тот и выбирайте.
     
  3. PAUK

    PAUK Нерд

    А если сделать вот так:
    Код (C++):
    void loop() {
      if (digitalRead(sensorPin) == LOW) {
        while (brightness < 255) {
          brightness += 5;  
          analogWrite(PWMPin, brightness);  
          delay(2);
        }

        delay(timeout);

        while ((brightness > 0) && (digitalRead(sensorPin) == HIGH)) {
          brightness -= 5;
          analogWrite(PWMPin, brightness);
          delay(5);
        }
      }
    }
     
    Gritsan нравится это.
  4. SergeiL

    SergeiL Оракул Модератор

    В таком варианте нужно не забывать о кратности прибавляемого или вычитаемого значения с максимальным/минимальным. Иначе в PWM могут записываться некорректные значения.
    Сначала осуществляется проверка на Max/Min, потом изменение, потом запись в PWM измененного значения.
     
  5. PAUK

    PAUK Нерд

    Да, Я потому и выбрал значение 5
     
    Gritsan нравится это.
  6. PAUK

    PAUK Нерд

    Я произвёл отладку и оказалось что ничего не выходит за предел допустимых значений, во всех случаях переменная "brightness" лежит в пределе 0-255, видимо после выхода из цикла возвращается предыдущее значение переменной. Так что разработчики не дураки и не зря в стандартном примере используется проверка "<= 255" или ">= 0"
     
    Gritsan нравится это.
  7. parovoZZ

    parovoZZ Гуру

    А зачем она у тебя определена как 2-х байтная, если не выходит за пределы байта?
     
  8. PAUK

    PAUK Нерд

    Она уже byte.
     
    Gritsan нравится это.
  9. parovoZZ

    parovoZZ Гуру

    Код (C++):
    int brightness = 0;
     
  10. PAUK

    PAUK Нерд

    Я же сказал, что она уже "byte', позже выложу переделанный код...
     
  11. fogary

    fogary Гик

    Был не прав, приношу извинения.
     
    PAUK нравится это.
  12. PAUK

    PAUK Нерд

    Respect!
     
  13. PAUK

    PAUK Нерд

    Всем спасибо за подсказки и принятие участия в обсуждении. Я максимально идеализировал текст программы, насколько это только возможно в Ардуино:
    Код (C++):
    /*
    Reading sensor status and if it's LOW
    turn the LED on with PWM from 0 to 255
    and after timeout turn the LED off
    with PWM dimming from 255 to 0.
    Debug version
      */


    // set pin numbers:
    const byte sensorPin = 12;     // the number of the sensor pin
    const byte PWMPin = 11;        // the number of the PWM out pin

    // set on time in seconds
    #define ontime 5               // how many time is full bright in seconds

    // variables
    byte brightness = 0;            // how bright the LED is when the programm start
    long timeout = ontime*1000;    // convert time is full bright seconds to milliseconds

    void setup() {
      // initialize serial communication at 9600 bits per second:
      Serial.begin(9600);
      // initialize the PWM pin as an output:
      pinMode(PWMPin, OUTPUT);
      // set the start bright
      analogWrite(PWMPin, brightness);
      // initialize the sensor pin as an input:
      pinMode(sensorPin, INPUT);
      // turn on pull up resistor
      digitalWrite(sensorPin, HIGH);
    }

    void loop() {

      // check if the sensor is on.
      if (digitalRead(sensorPin) == LOW) {
          // fade in from min to max in increments of 5 points:
          for (int fadeValue = ((brightness/5)*5)+5 ; fadeValue <= 255; fadeValue += 5) {
          // sets the value (range from 0 to 255):
          brightness = fadeValue;    // how bright the LED is
          analogWrite(PWMPin, brightness);
          // send to serial port brightness value
          Serial.print("How bright in first for - 1:  ");
          Serial.println(brightness);
          // wait for 10 milliseconds to see the dimming effect
          delay(10);
          }
          delay(timeout);  // wait needed time
      }

      Serial.print("How bright after first for:  ");
      Serial.println(brightness);
      delay(40);  // wait show result

      // fade out from max to min in increments of 1 points:
      for (int fadeValue = brightness-1 ; fadeValue >= 0 && digitalRead(sensorPin) != LOW; fadeValue -= 1) {
          // sets the value (range from 0 to 255):
          brightness = fadeValue;    // how bright the LED is
          analogWrite(PWMPin, brightness);
          // send to serial port brightness value
          Serial.print("How bright in second for - 2:  ");
          Serial.println(brightness);
          // wait for 15 milliseconds to see the dimming effect
          delay(15);
      }
     
      Serial.print("How bright after second for:  ");
      Serial.println(brightness);
      delay(40);  // wait show result

    }
     
    В мониторе последовательного порта видно, что ни один цикл не запускается, пока не сработает датчик, и также ни один цикл не запускается при включённом датчике и максимальной яркости.
    Если есть ещё какие нибудь замечания, с удовольствием послушаю.
     
    Gritsan нравится это.
  14. fogary

    fogary Гик

    Если не секрет, это для чего?
     
  15. PAUK

    PAUK Нерд

    Хороший вопрос - ну давайте рассмотрим такой вариант, когда сенсор отключился и второй цикл постепенно стал уменьшать яркость на единицу, но сенсор снова сработал и прервавшись, второй цикл вернул значение яркости некратное пяти. Если не применить данное выражение, то в первом цикле не будет достигнута максимальная яркость 255. И второй вариант, когда сенсор сработал и некоторое время находится в таком состоянии. Тогда значение яркости постоянно будет 255 и при указанном выражении программа не будет зря входить в первый цикл, так как значение переменной для него уже будет больше 255.
     
  16. parovoZZ

    parovoZZ Гуру

    Не переживай, компилятор такое не пропустит.
     
  17. Asper Daffy

    Asper Daffy Иксперд

    А ничего, что если brightness уже кратно 5, то ((brightness/5)*5)+5 будет на 5 больше, чем brightness?
     
  18. PAUK

    PAUK Нерд

    Если этого не сделать, то после выхода из второго цикла, первый цикл начнётся с последнего значения второго и только после этого начнёт прибавлять яркость по 5, а при указанном выражении после входа в цикл яркость сразу прибавится на 5. Можете проследить за значениями последовательного порта:
    Код (Text):
    0
    0
    5           здесь сработал датчик и начался первый цикл
    10
    15
    20
    25
    30
    35
    40
    45
    50
    55
    60
    65
    70
    75
    80
    85
    90
    95
    100
    105
    110
    115
    120
    125
    130
    135
    140
    145
    150
    155
    160
    165
    170
    175
    180
    185
    190
    195
    200
    205
    210
    215
    220
    225
    230
    235
    240
    245
    250
    255
    255         здесь достигнута максимальная яркость и входа в цикл не происходит
    255         здесь достигнута максимальная яркость и входа в цикл не происходит
    255         здесь достигнута максимальная яркость и входа в цикл не происходит
    254         датчик отключился и начался второй цикл
    253
    252
    251
    250
    249
    248
    247
    246
    245
    244
    243
    242
    241
    240
    239
    238
    237
    236
    235
    234
    233
    232
    231
    230
    229
    228
    227
    226
    225
    224
    223
    222
    221
    220
    219
    218
    217
    220        датчик снова сработал и опять начался первый цикл и повышение яркости
    225
    230
    235
    240
    245
    250
    255         здесь достигнута максимальная яркость и входа в цикл не происходит
    255         здесь достигнута максимальная яркость и входа в цикл не происходит
    255         здесь достигнута максимальная яркость и входа в цикл не происходит
     
    Gritsan нравится это.
  19. PAUK

    PAUK Нерд

    Братан, тебе спасибо конечно за подсказку, но не оказывай медвежью услугу, не надо сваливать на компилятор, попробуй скомпилировать без этого выражения, и с ним!
     
  20. parovoZZ

    parovoZZ Гуру

    Ну хорошо, буду знать, что компилятор правила арифметики игнорирует =)