помогите с кодом!!!

gonzales
Offline
Зарегистрирован: 13.07.2015

Доброго времени суток!!

Бьюсь второй день, не могу понять в чем прикол.

Есть переменная

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 работают абсолютно корректно.

Помогите советом, уже всю голову сломал

 

Radjah
Offline
Зарегистрирован: 06.08.2014

Напрмиер

byte CurrentSceneNumber = 0;

и

CurrentSceneNumber++

beve
Offline
Зарегистрирован: 15.07.2015

По данному куске кода могу сказать,что в нем ошибок нет (на всякий случай перепроверил в своей ардуинке, немного изменив код для проверки). Все таки ошибка у вас где то в другом месте.

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;        
	}
}

 

gonzales
Offline
Зарегистрирован: 13.07.2015

beve пишет:

По данному куске кода могу сказать,что в нем ошибок нет 

Я даже больше скажу, провел эксперимент

      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;        

    }



  }

}

К сожалению вывести значение в монитор не могу, так как микроконтроллер распаян на плате, а не на ардуинке.

 

Radjah
Offline
Зарегистрирован: 06.08.2014

Код:

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 и т.д.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Как только она у Вас станет (в case 15), а затем попадёт в case 99, то там она сначала станет 6, а только потом Вы её сравните с 5 (разумеется не сравнится). Затем она постоянно будет попадать в case 99 и постоянно увеличиваться пока не переполнится. А когда переполнится - пойдёт обратно. 

Отсюда и такое поведение.

gonzales
Offline
Зарегистрирован: 13.07.2015

Нашел причину такого поведения.

if (mySwitch.available()) {
    int value = mySwitch.getReceivedValue();

это строка получения данных с радиоприемника 433МГц, а оказалось, так как связь передетчик-приемник одностороняя, то по умолчанию посылка транслируется несколько раз, а так как у меня невозможно использовать delay, то case успевал выполнится несколько раз, прежде чем посылка прекращалась.

Установил кол-во повторов на передатчике меньше

 mySwitch.enableTransmit(10);
 mySwitch.setPulseLength(350);
 mySwitch.setRepeatTransmit(4); //---по умолчанию 10

и сделал дополнительно счетчик для создания задержки

 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:
///----------------------------

И все стало работать правильно

Спасибо всем, кто откликнулся!!!!