помогите с кодом!!!
- Войдите на сайт для отправки комментариев
Ср, 15/07/2015 - 14:08
Доброго времени суток!!
Бьюсь второй день, не могу понять в чем прикол.
Есть переменная
byte CurrentSceneNumber;
В секции setup есть установка начального значения
CurrentSceneNumber = 0;
В основном цикле по условию хочу менять значения этой переменной от 0 до 5
switch (value) {
case 99:
CurrentSceneNumber=CurrentSceneNumber+1;
if (CurrentSceneNumber == 5) CurrentSceneNumber = 0;
needtochange = true;
break;
case 10:
CurrentSceneNumber = 0;
needtochange = true;
break;
case 11:
CurrentSceneNumber = 1;
needtochange = true;
break;
case 12:
CurrentSceneNumber = 2;
needtochange = true;
break;
case 13:
CurrentSceneNumber = 3;
needtochange = true;
break;
case 14:
CurrentSceneNumber = 4;
needtochange = true;
break;
case 15:
CurrentSceneNumber = 5;
needtochange = true;
break;
}
Не правильно срабатывает строка CurrentSceneNumber=CurrentSceneNumber+1; Если выполнять условие value==99 при том, что CurrentSceneNumber==0 то после инкриментирования выдает значения 4, 3, 2, 1, 0 то есть как будто инвертированные значения. Все операторы присвоения CurrentSceneNumber = 4 работают абсолютно корректно.
Помогите советом, уже всю голову сломал
Напрмиер
byte CurrentSceneNumber = 0;
и
CurrentSceneNumber++
По данному куске кода могу сказать,что в нем ошибок нет (на всякий случай перепроверил в своей ардуинке, немного изменив код для проверки). Все таки ошибка у вас где то в другом месте.
byte CurrentSceneNumber; void setup() { Serial.begin(9600); CurrentSceneNumber = 0; } void loop() { _Test(); delay(1000); } void _Test(){ int value=99; int needtochange; switch (value) { case 99: CurrentSceneNumber=CurrentSceneNumber+1; if (CurrentSceneNumber == 5) CurrentSceneNumber = 0; needtochange = true; Serial.print("CurrentSceneNumber: "); Serial.println(CurrentSceneNumber); break; case 10: CurrentSceneNumber = 0; needtochange = true; break; case 11: CurrentSceneNumber = 1; needtochange = true; break; case 12: CurrentSceneNumber = 2; needtochange = true; break; case 13: CurrentSceneNumber = 3; needtochange = true; break; case 14: CurrentSceneNumber = 4; needtochange = true; break; case 15: CurrentSceneNumber = 5; needtochange = true; break; } }По данному куске кода могу сказать,что в нем ошибок нет
Я даже больше скажу, провел эксперимент
case 99: if (CurrentSceneNumber == 0) { CurrentSceneNumber=CurrentSceneNumber+1; // if (CurrentSceneNumber == 5) CurrentSceneNumber = 0; // needtochange = true; } break;работает корректно, но отрабатывает естественно только один раз, когда CurrentSceneNumber == 0
case 99: if (CurrentSceneNumber >= 0) { CurrentSceneNumber=CurrentSceneNumber+1; // if (CurrentSceneNumber == 5) CurrentSceneNumber = 0; // needtochange = true; } break;выдает опять лажу
Вот код практически полный, что касается этого куска
Пояснение: так как невозможно в коде использовать delay, поэтому в основном цикле идет счетчик, по срабатыванию которого вызывается функция ChangeScene с аргументом CurrentSceneNumber.
void loop() { if (needtochange == true) { currentMillis = millis(); if (currentMillis - previousMillis > fadespeed) { // сохраняем время последнего переключения previousMillis = currentMillis; ChangeScene(CurrentSceneNumber); } } if (mySwitch.available()) { int value = mySwitch.getReceivedValue(); switch (value) { case 99: CurrentSceneNumber=CurrentSceneNumber+1; if (CurrentSceneNumber == 5) CurrentSceneNumber = 0; needtochange = true; break; case 10: CurrentSceneNumber = 0; needtochange = true; break; case 11: CurrentSceneNumber = 1; needtochange = true; break; case 12: CurrentSceneNumber = 2; needtochange = true; break; case 13: CurrentSceneNumber = 3; needtochange = true; break; case 14: CurrentSceneNumber = 4; needtochange = true; break; case 15: CurrentSceneNumber = 5; needtochange = true; break; } } }К сожалению вывести значение в монитор не могу, так как микроконтроллер распаян на плате, а не на ардуинке.
Код:
byte CurrentSceneNumber = 0; void setup() { Serial.begin(9600); } void loop() { static int value = 99; Serial.println(value); switch (value) { case 99: CurrentSceneNumber = CurrentSceneNumber + 1; if (CurrentSceneNumber == 5) CurrentSceneNumber = 0; Serial.println("Hello from 99!"); break; case 10: CurrentSceneNumber = 0; Serial.println("Hello from 10!"); break; case 11: CurrentSceneNumber = 1; Serial.println("Hello from 11!"); break; case 12: CurrentSceneNumber = 2; Serial.println("Hello from 12!"); break; case 13: CurrentSceneNumber = 3; Serial.println("Hello from 13!"); break; case 14: CurrentSceneNumber = 4; Serial.println("Hello from 14!"); break; case 15: CurrentSceneNumber = 5; Serial.println("Hello from 15!"); break; default: break; } Serial.println(CurrentSceneNumber); value--; delay(100); }Вывод http://vpaste.net/sKMoq
На 15 - 5 сцена, 14 - 4, 13 - 3 и т.д.
Как только она у Вас станет (в case 15), а затем попадёт в case 99, то там она сначала станет 6, а только потом Вы её сравните с 5 (разумеется не сравнится). Затем она постоянно будет попадать в case 99 и постоянно увеличиваться пока не переполнится. А когда переполнится - пойдёт обратно.
Отсюда и такое поведение.
Нашел причину такого поведения.
if (mySwitch.available()) { int value = mySwitch.getReceivedValue();это строка получения данных с радиоприемника 433МГц, а оказалось, так как связь передетчик-приемник одностороняя, то по умолчанию посылка транслируется несколько раз, а так как у меня невозможно использовать delay, то case успевал выполнится несколько раз, прежде чем посылка прекращалась.
Установил кол-во повторов на передатчике меньше
и сделал дополнительно счетчик для создания задержки
if (mySwitch.available()) { value = mySwitch.getReceivedValue(); mySwitch.resetAvailable(); if (value!=0) commandiscomming = true; } if (commandiscomming == true) { currentMillis1 = millis(); if (currentMillis1 - previousMillis1 > 1000) { // сохраняем время последнего переключения previousMillis1 = currentMillis1; commandiscomming = false; switch (value) { case 99: ///----------------------------И все стало работать правильно
Спасибо всем, кто откликнулся!!!!