0

I wanna make some sketch to generate number to represent sensor value, with range from high (900) to low (670), that number decrease with range between 1-10 and with some delay of switching number with range from 5-15 seconds:

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

    void number(){
      int sensor = 0;                  //sensor variable
      int a = random(0, 10);           //range subtraction sensor value
      int delay = random(5000, 15000); //range delay switching value
      for(sensor = 900; sensor >= 670; sensor -=a){ //iteration sensor value with range 670-900
        Serial.println(sensor);
        delay(delay);}
    }

    void loop() {
    number();
    }

with output:

  • 900 (delay 7 sec)
  • 894 (delay 3 sec)
  • 988 (delay 5 sec)
  • 979 (delay 9 sec)

The sketch above was work as well, but i still can't using variable "sensor" result after iteration "for" in void loop. I hope you can help me, thanks.

4
  • upvote for well presented question ... this is a programming question, so the c++ tag is valid, but the other 4 tags are not valid ... it is not completely clear what you are asking, but that appears to be because of language difference
    – jsotola
    Jan 8, 2020 at 19:25
  • i just wanna generate random number, with range, maybe had another alternative sketch? Jan 8, 2020 at 19:34
  • To use the for() loop iteration variable after the end of the loop, it has to be defined outside of the loop. Defining a variable in the loop is a convenience for when you only need it inside the loop.
    – JRobert
    Jan 8, 2020 at 20:31
  • how to upvote? so i need to make variable utside the loop? Jan 8, 2020 at 20:50

1 Answer 1

2
int sensor = 900;                 //variabel sensor

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

int number() {
  int a = random(0, 10);          //range pengurang nilai sensor
  int d = random(500, 1500); //range delay perubahan nilai
  if (sensor < 670) {
    sensor = 900;
  }
  sensor -= a;
  delay(d);
  return sensor;
}

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

I modified the delay for test.

randomSeed ensures different random values at every run

EDIT: a not blocking version which returns the same values for random interval:

int sensor = 900;                 //variabel sensor
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);          //range pengurang nilai sensor
  int d = random(500, 1500); //range delay perubahan nilai
  if (sensor < 670) {
    sensor = 900;
  }
  sensor -= a;
  nextChangeMillis += d;
  return sensor;
}

void loop() {
  int val = number();
  Serial.println(val);
}
13
  • @Juraj Why did you kind of copied my answer? Btw, you don't need to return sensor in number(), since it's a global variable anyway. Jan 8, 2020 at 20:39
  • 1
    @MichelKeijzers, your function returns only the last value. the function number() should simulate values returned from a sensor
    – Juraj
    Jan 8, 2020 at 20:44
  • @Juraj ... thanks ... I thought that was the intention, but I guess the question was not so clear. Upvoted! Jan 8, 2020 at 20:46
  • @UlinnuhaLuthfi (I removed my answer, this answer should answer your question already. Jan 8, 2020 at 20:47
  • 1
    sorry everyone, i just realize how to upvote Jan 8, 2020 at 21:03

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Not the answer you're looking for? Browse other questions tagged or ask your own question.