← 返回首页

第七课:自定义函数与随机变量

第七课:自定义函数与随机变量

回到arduino,如果我们有三个数字电路通道想控制3个LED灯依次显示1不亮,2、3亮(情况1);2不亮,1、3亮和3不亮(情况2),1、2亮(情况3)以及所有灯都亮。(实际情况X中可能存在更复杂的控制)且我们希望建立一个映射表,使得每次我们只需要调用情况X即可让程序自动执行情况X内包含的工作语句内容,从而简化不必要的基本重复语句调用。这时我们就需要自定义函数,可以规定输入变量和返回变量,默认为void空或者return默认为0。

//以下函数均放在void loop() {}后即可
//根据输入内容建立映射的函数,有输入和执行,无输出
void ControlLED(int LEDoff) {
  switch (LEDoff) {
    case 1:
      Shut_down_LED(1);
      break;
    case 2:
      Shut_down_LED(2);
      break;
    case 3:
      Shut_down_LED(3);
      break;
    default: //这就不用break了
      Close_all_LED();
  }
}
//关闭特定LED并点亮其余LED,有输入和执行,无输出
void Shut_down_LED(int LED_Num) {
  int i = 1;
  for (i = 1; i <= 3; i++) {
    if (i = LED_Num) {
      digitalWrite(i, LOW);
      continue;
    }
    digitalWrite(i, HIGH);
  }
}
//关闭所有LED,无输入,有执行,无输出
void Close_all_LED() {
  digitalWrite(1, LOW);
  digitalWrite(2, LOW);
  digitalWrite(3, LOW);
}

有了这些辅助的自定义函数,原先需要写一大片的loop主函数就会变得很简洁,这点在cpp的main.c文件中同样适用,其余函数可以写到其他文件中被主函数文件调用从而减小main.c修改的查找工作量。

void loop() {
  int i;
  for (i = 1; i < 4; i++) {
    delay(500);
    ControlLED(i);
    delay(500);
    Close_all_LED();
  }
}

除了让小灯依次亮起和被数字电路Input端口相关的上拉电路开关控制,我们可以通过arduino的random函数为控制结果增加一些“伪sudo随机性”,虽然不像python里的random和randint一样区分float和int,而且如果不更新randomseed的话每次刷出来的“随机数”都是固定序列,但有总比没有强。
random: 单独使用random()函数。每次程序运行所产生的随机数字都是同一系列数字。并非真实的随机数,而是所谓的伪随机数。

randNumber = random(1, 5);
//产生min1-5max间的整数随机数,含1,2,3,4不含5
//randNumber是random函数的输出,格式为long
randNumber = random(3);
//产生不大于3max的整数随机数,含0,1,2不含3

在实际应用时,可以通过调用analogRead()函数读取一个空引脚,作为随机种子数值。randomSeed(seedVal: 随机种子数值)但是这个随机种子也得从一个能产生随机数的来源读取而不是固定一个数,要不然产生的还是固定序列伪随机数,这一点在某篇被举报用随机数种子造假的顶刊妙文里得到验证,内部人士称他们全篇造假用的都是randomSeed(40):-)。

long randNumber;
void setup(){
  Serial.begin(9600);
  randomSeed(analogRead(A0)); 
  //将引脚A0放空,每次程序启动时所读取的数值都是不同的。
  //这么做可以产生真正的随机种子值,从而产生随机数值。
}
void loop(){
  randNumber = random(300);  // 产生随机数
  Serial.print("randNumber = ");
  Serial.println(randNumber);
  delay(50);
}

值得注意的是,如果想在串口监视器里使用serial.print等serial相关读写功能,一定要在setup()里进行初始化!!!

👁️ 22 阅读 📝 最后修改于 2026-10-30

💬 评论 (0)