РЕШЕНО Шим и индикация

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

  1. PavelP

    PavelP Нуб

    Добрый день. Помогите решить проблему.
    Есть светодиод у кот. рег. яркость (подключен к пину 5) и есть 5 светодиодов для индикации уровня шима (подключены к пинам 9-13). Две кнопки + и -. При помощи кнопок управляем яркостью светодиода (всего шесть положений 1- 51 2- 102 3- 153 4- 204 5- 255). И в зависимости от значения горят светики.-
    1 положение горит светодиод 1

    2 положение горят светодиоды 1 и 2

    3 положение горят светодиоды 1, 2 и 3

    4 положение горят светодиоды 1, 2, 3 и 4

    5 положение горят светодиоды 1, 2, 3, 4 и 5
    Проблема в том, что при первом нажатии на кн. + загораются сразу все светодиоды т.е. шим равен 255, а не 51. Далее при нажатии на кн. - гаснут светодиоды по одному. Тестировал в Протеусе (Скетч не мой)
    Код (C++):
    const int podPlus = 2;
    const int podMinus = 3;
    const int lightbt = 4;
    const int podogrPwm = 5;
    const int lightPwm = 6;

    /*
    const int ledpol1 = 9;
    const int ledpol2 = 10;
    const int ledpol3 = 11;
    const int ledpol4 = 12;
    const int ledpol5 = 13;
    */


    /* Массив номеров пинов для выходных светиков. первый - младший */
    const byte ledpol[] = {
      9, 10, 11, 12, 13
    };
    /* Размер массива с номерами пинов */
    const byte leds_size = sizeof(ledpol) / sizeof(byte);

    int podPlusFl = 0;
    int podMinusFl = 0;
    int lightFl = 0;

    int podPlusState = 0;      
    int podMinusState = 0;
    int lightbtState = 0;

    int valLight = 0;
    int valPodog = 0;

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

    pinMode(podPlus, INPUT);
    pinMode(podMinus, INPUT);
    pinMode(lightbt, INPUT);
    pinMode(podogrPwm, OUTPUT);
    pinMode(lightPwm, OUTPUT);

    /* Инициализируем выходные пины */
      for (byte i = 0; i < leds_size; ++i) {
        pinMode(ledpol[i], OUTPUT);
        }
    /*  
    pinMode(ledpol1, OUTPUT);
    pinMode(ledpol2, OUTPUT);
    pinMode(ledpol3, OUTPUT);
    pinMode(ledpol4, OUTPUT);
    pinMode(ledpol5, OUTPUT);
    */

    }
    void clear_leds() {
      for (byte i = 0; i < leds_size; ++i) {
        digitalWrite(ledpol[i], LOW);
      }
    }
    void loop()
    {
    podPlusState = digitalRead(podPlus);
    podMinusState = digitalRead(podMinus);
    lightbtState = digitalRead(lightbt);
    clear_leds();
      if(podPlusState == LOW && podPlusFl==0) {
           podPlusFl=1;
           }
      if (podPlusState == HIGH && podPlusFl==1){
                if (valPodog < 255 && valPodog != 0){
                  valPodog = valPodog + 51;
                 }
                 else{
                valPodog = 255;
                 }
           podPlusFl=0;
           }
         
           if(podMinusState == LOW && podMinusFl==0) {
           podMinusFl=1;
           }
      if (podMinusState == HIGH && podMinusFl==1){
                if (valPodog > 0){
                  valPodog = valPodog - 51;
                }
           podMinusFl=0;
           }
          if (valPodog != 0) {
        /* Здесь чем выше уровень, тем больше светиков горят */
        /* Если раскомемнтарить break, то будет гореть только один светодиод, соответствующий своему уровню */
       
           switch (valPodog) {
          case 255:
            digitalWrite(ledpol[4], HIGH);
          // break;
          case 204:
            digitalWrite(ledpol[3], HIGH);
          // break;
          case 153:
            digitalWrite(ledpol[2], HIGH);
          // break;
          case 102:
            digitalWrite(ledpol[1], HIGH);
          // break;
          case 51:
            digitalWrite(ledpol[0], HIGH);
            // break;
        }
        }  
    analogWrite(podogrPwm, valPodog);
    Serial.print("podog");
    Serial.println(valPodog);
    }
     

    Вложения:

    • Desktop.zip
      Размер файла:
      32,2 КБ
      Просмотров:
      217
    • ШИМ.jpg
      ШИМ.jpg
      Размер файла:
      611 КБ
      Просмотров:
      231
  2. Daniil

    Daniil Гуру

    У вас в самом начале идет проверка valpodog равенства нулю. Инициализируется valpodog как ноль, поэтому первое нажатие и ведет к valpodog=255
     
  3. PavelP

    PavelP Нуб

    не подскажите, как поправить?
     
  4. b707

    b707 Гуру

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

    Вместо того чтоб брать неизвестный код с неизветсным качеством - попробуйте написать сами
     
  5. PavelP

    PavelP Нуб

    Подавил, з
    Код (C++):
    const int podPlus = 2;
    const int podMinus = 3;
    const int lightbt = 4;
    const int podogrPwm = 5;
    const int lightPwm = 6;

    /*
    const int ledpol1 = 9;
    const int ledpol2 = 10;
    const int ledpol3 = 11;
    const int ledpol4 = 12;
    const int ledpol5 = 13;
    */


    /* Массив номеров пинов для выходных светиков. первый - младший */
    const byte ledpol[] = {
      9, 10, 11, 12, 13
    };
    /* Размер массива с номерами пинов */
    const byte leds_size = sizeof(ledpol) / sizeof(byte);

    int podPlusFl = 0;
    int podMinusFl = 0;
    int lightFl = 0;

    int podPlusState = 0;      
    int podMinusState = 0;
    int lightbtState = 0;

    int valLight = 0;
    int valPodog = 0;

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

    pinMode(podPlus, INPUT);
    pinMode(podMinus, INPUT);
    pinMode(lightbt, INPUT);
    pinMode(podogrPwm, OUTPUT);
    pinMode(lightPwm, OUTPUT);

    /* Инициализируем выходные пины */
      for (byte i = 0; i < leds_size; ++i) {
        pinMode(ledpol[i], OUTPUT);
        }
    /*  
    pinMode(ledpol1, OUTPUT);
    pinMode(ledpol2, OUTPUT);
    pinMode(ledpol3, OUTPUT);
    pinMode(ledpol4, OUTPUT);
    pinMode(ledpol5, OUTPUT);
    */

    }
    void clear_leds() {
      for (byte i = 0; i < leds_size; ++i) {
        digitalWrite(ledpol[i], LOW);
      }
    }
    void loop()
    {
    podPlusState = digitalRead(podPlus);
    podMinusState = digitalRead(podMinus);
    lightbtState = digitalRead(lightbt);
    clear_leds();
      if(podPlusState == LOW && podPlusFl==0) {
           podPlusFl=1;
           }
      if (podPlusState == HIGH && podPlusFl==1){
                if (valPodog < 255){
                  valPodog = valPodog + 51;
                 }
                 else{
                valPodog = 255;
                 }
           podPlusFl=0;
           }
         
           if(podMinusState == LOW && podMinusFl==0) {
           podMinusFl=1;
           }
      if (podMinusState == HIGH && podMinusFl==1){
                if (valPodog > 0){
                  valPodog = valPodog - 51;
                }
           podMinusFl=0;
           }
          if (valPodog != 0) {
        /* Здесь чем выше уровень, тем больше светиков горят */
        /* Если раскомемнтарить break, то будет гореть только один светодиод, соответствующий своему уровню */
       
           switch (valPodog) {
          case 255:
            digitalWrite(ledpol[4], HIGH);
          // break;
          case 204:
            digitalWrite(ledpol[3], HIGH);
          // break;
          case 153:
            digitalWrite(ledpol[2], HIGH);
          // break;
          case 102:
            digitalWrite(ledpol[1], HIGH);
          // break;
          case 51:
            digitalWrite(ledpol[0], HIGH);
            // break;
        }
        }  
    analogWrite(podogrPwm, valPodog);
    Serial.print("podog");
    Serial.println(valPodog);
    }
    аработало, Спасибо.