Создать номер

Я хочу сделать набросок для генерации числа, представляющего значение датчика, в диапазоне от высокого (900) до низкого (670), это число уменьшается в диапазоне от 1 до 10 и с некоторой задержкой числа переключения в диапазоне от 5 до 15 секунд:

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

    void number(){
      int sensor = 0;                  //переменная датчика
      int a = random(0, 10);           //значение датчика вычитания диапазона
      int delay = random(5000, 15000); //значение переключения диапазона задержки
      for(sensor = 900; sensor >= 670; sensor -=a){ // повторение значения датчика в диапазоне 670-900
        Serial.println(sensor);
        delay(delay);}
    }

    void loop() {
    number();
    }

с выводом:

  • 900 (задержка 7 сек.)
  • 894 (задержка 3 сек.)
  • 988 (задержка 5 секунд)
  • 979 (задержка 9 секунд)

Приведенный выше скетч тоже работал, но я все еще не могу использовать результат переменной "sensor" после итерации "for" в пустом цикле. Я надеюсь, что вы можете мне помочь, спасибо.

, 👍0

Обсуждение

голосование за хорошо представленный вопрос... это вопрос программирования, поэтому тег c++ действителен, но остальные 4 тега недействительны... не совсем понятно, о чем вы спрашиваете, но это, похоже, потому что языковой разницы, @jsotola

я просто хочу сгенерировать случайное число с диапазоном, может быть, у меня есть другой альтернативный скетч?, @Ulinnuha Luthfi

Чтобы использовать переменную итерации цикла for() после окончания цикла, она должна быть определена *вне* цикла. Определение переменной в цикле удобно, когда она нужна только внутри цикла., @JRobert

как проголосовать? так что мне нужно сделать переменную вне цикла?, @Ulinnuha Luthfi


1 ответ


Лучший ответ:

2
int sensor = 900;                 //переменный датчик

void setup() {
  Serial.begin(9600);
  while (!Serial);
  randomSeed(analogRead(A0));
}

int number() {
  int a = random(0, 10);          //сенсор дальности Pengurang nilai
  int d = random(500, 1500); //диапазон задержки perubahan nilai
  if (sensor < 670) {
    sensor = 900;
  }
  sensor -= a;
  delay(d);
  return sensor;
}

void loop() {
  int val = number();
  Serial.println(val);
}

Я изменил задержку для проверки.

randomSeed обеспечивает разные случайные значения при каждом запуске

EDIT: неблокирующая версия, которая возвращает те же значения для случайного интервала:

int sensor = 900;                 //переменный датчик
unsigned long nextChangeMillis = 0;

void setup() {
  Serial.begin(9600);
  while (!Serial);
  randomSeed(analogRead(A0));
}

int number() {

  if (millis() < nextChangeMillis)
    return sensor;

  int a = random(0, 10);          //сенсор дальности Pengurang nilai
  int d = random(500, 1500); //диапазон задержки perubahan nilai
  if (sensor < 670) {
    sensor = 900;
  }
  sensor -= a;
  nextChangeMillis += d;
  return sensor;
}

void loop() {
  int val = number();
  Serial.println(val);
}
,

@Juraj Почему ты скопировал мой ответ? Кстати, вам не нужно возвращать датчик в number(), так как это все равно глобальная переменная., @Michel Keijzers

@MichelKeijzers, ваша функция возвращает только последнее значение. функция number() должна имитировать значения, возвращаемые датчиком, @Juraj

@Juraj ... спасибо ... я думал, что это было намерением, но я думаю, вопрос был не так ясен. Проголосовал!, @Michel Keijzers

@UlinnuhaLuthfi (я удалил свой ответ, этот ответ уже должен ответить на ваш вопрос., @Michel Keijzers

и когда на практике аналоговый порт A0 использовался фактическим датчиком, могу ли я переключить значение со случайного начального значения на постоянное значение?, @Ulinnuha Luthfi

@UlinnuhaLuthfi, не постоянно. вы всегда будете получать одну и ту же «случайную» последовательность, @Juraj

извините все, я только понял, как голосовать, @Ulinnuha Luthfi

Чтобы «скрыть» переменную sensor, вы можете поместить ее внутрь number() и сделать ее static. Таким образом, становится ясно, что никому не разрешен доступ к нему., @the busybee

@thebusybee, да, я знаю. но тогда я должен был бы объяснить это, @Juraj

большое спасибо, ребята, этот скетч работал хорошо, но у меня снова возникла проблема, когда скетч работает, задержка диапазона 5-15 секунд слишком велика и прерывает всю систему, есть ли альтернативные способы заменить функцию «задержки» ?, @Ulinnuha Luthfi

@Juraj, спасибо, @Ulinnuha Luthfi

ты так быстро отреагировал чувак, круто, @Ulinnuha Luthfi

@UlinnuhaLuthfi, я понял, что датчик не блокируется, а возвращает то же значение, поэтому я добавил улучшенную версию за несколько часов до вашего запроса., @Juraj