Добрый день. Помогите решить проблему. Есть светодиод у кот. рег. яркость (подключен к пину 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); }
У вас в самом начале идет проверка valpodog равенства нулю. Инициализируется valpodog как ноль, поэтому первое нажатие и ведет к valpodog=255
убрать проверку на ноль Но при этом возможны другие глюки, так как скеитч вообще написан довольно неграмотно. Вместо того чтоб брать неизвестный код с неизветсным качеством - попробуйте написать сами
Подавил, з Код (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); } аработало, Спасибо.