代码知识很少,试图帮助妹妹完成Arduino项目

代码知识很少,试图帮助妹妹完成Arduino项目,arduino,Arduino,这个项目涉及到用Arduino Uno板从0-500之间的数字创建一个数字猜测游戏。在猜测一个介于0和500之间的数字之前,代码似乎工作得很好,此时,当输入一个数字时,不会给出响应。我没有尝试过很多,因为我的编码知识几乎为零。该项目正在Tinkercad中运行 void setup (){ randomSeed(analogRead(A0)); Serial.begin(9600); for(int i=2 ; i<=11 ; i++) { pinMode(i,OUTPUT); } S

这个项目涉及到用Arduino Uno板从0-500之间的数字创建一个数字猜测游戏。在猜测一个介于0和500之间的数字之前,代码似乎工作得很好,此时,当输入一个数字时,不会给出响应。我没有尝试过很多,因为我的编码知识几乎为零。该项目正在Tinkercad中运行

void setup (){
 randomSeed(analogRead(A0));
Serial.begin(9600);
for(int i=2 ; i<=11 ; i++) {
pinMode(i,OUTPUT);
 }
Serial.println("");
Serial.println("Hello, whats your name?");
 while(Serial.available()==0){
}
Name=Serial.readString();
Serial.print("Hello,");
Serial.print(Name);
}

void loop(){

Serial.println("");
if (Playtime>=1){
Serial.println("Do you want to play again");
}
else{
Serial.println("Do you want to play a guessing game?");
}
while(Serial.available()==0);
Answer=Serial.readString();
if(Answer=="yes"){
 GuessCount=0;
 randNumber=random(0,500);
 Serial.println("Guess a number between 0 and 500");
 while(Serial.available()==0);
 Guess=Serial.parseInt();
 while(randNumber!=Guess){
   if(Guess>randNumber){
     GuessCount=GuessCount+1;  
     for(int i=4;i<14;i++) {
       digitalWrite(i,HIGH);
       delay(Delay1);
       digitalWrite(i,LOW);
       delay(Delay2);

    void setup (){
      randomSeed(analogRead(A0));
      Serial.begin(9600);
      for(int i=2 ; i<=11 ; i++) {
      pinMode(i,OUTPUT);
      }
       Serial.println("");
       Serial.println("Hello, whats your name?");
       while(Serial.available()==0){
        }
        Name=Serial.readString();
       Serial.print("Hello,");
        Serial.print(Name);
        }

        void loop(){

       Serial.println("");
        if (Playtime>=1){
        Serial.println("Do you want to play again");
        }
         else{
        Serial.println("Do you want to play a guessing game?");
       }
       while(Serial.available()==0);
      Answer=Serial.readString();
     if(Answer=="yes"){
     GuessCount=0;
     randNumber=random(0,500);
     Serial.println("Guess a number between 0 and 500");
     while(Serial.available()==0);
     Guess=Serial.parseInt();
     while(randNumber!=Guess){
     if(Guess>randNumber){
     GuessCount=GuessCount+1;  
     for(int i=4;i<14;i++) {
       digitalWrite(i,HIGH);
       delay(Delay1);
       digitalWrite(i,LOW);
       delay(Delay2);

所以当串行缓冲区等于零时,它必须读取一个字符串并打印它

它应该等到Serial.available>0,因此当有输入时,它将触发whileloop

第一个for循环也没有任何匹配的初始条件i=2,但没有定义i

读完剩下的,真的没有冒犯的意思!一团糟。多个无效设置已经表明有问题

因此,作为提示,试着编写简短而简单的代码片段。例如,按如下方式启动:

了解如何在串行监视器中写入内容,然后将其显示为响应。 随机化数字并显示它们 给出一个数字答案后,它会检查它是否与随机数字匹配,并显示结果。 从以前的实验中移除未使用的东西。 在Arduino IDE中正确缩进代码CTRL-T 循环就是你的循环。这不需要任何时间。在您的情况下,在等待串行输入时无需其他操作,但很快您将需要计算响应时间,并在等待响应时显示运行时间。阻塞直到响应到达 情况相当糟糕。 编写函数以使代码更易于阅读。 你如何中止那个讨厌的游戏?还是进入欺骗模式?或 一个小小的起点:

// LED pins
const byte UPLed = 2; // indicates guess too low
const byte DNLed = 4; // indicates guess too high
const byte WINLed= 3;

unsigned int games = 0;
unsigned int guess = 0; // 0 : ask for new game

const unsigned int MAX = 500;
unsigned int solution; // 1 ... MAX

void setup () {
  Serial.begin(9600);
  pinMode(UPLed,OUTPUT);
  pinMode(DNLed,OUTPUT);
  pinMode(WINLed,OUTPUT);
  greeting(); // wait for user to enter their name
  randomSeed( millis() ); // time for user response is a good random seed
}

void loop() {
  // loop duration is one guess
  if (guess == 0) { 
    startDialog();
    solution = random(1, MAX+1);
    Serial.setTimeout(10000); // 10 sec per guess, else game lost
    digitalWrite(UPLed, LOW);
    digitalWrite(DNLed, LOW);
    digitalWrite(WINLed, LOW);  
  } 
  guess++;
  Serial.print("Guess # "); Serial.print(guess); Serial.print(": ");
  long try = Serial.parseInt();
  if (try == 0) { lostGame(); guess = 0;}
  else if (try == solution) {wonGame(); guess = 0;}
  else if (try < solution) {
    digitalWrite(UPLed, HIGH);
    digitalWrite(DNLed, LOW);   
  } else { // try > solution
    digitalWrite(UPLed, LOW);
    digitalWrite(DNLed, HIGH);
  }   
}

void greeting() {
 Serial.println();
 Serial.print("Hello, whats your name? ");
 while(Serial.available()==0){ } // block until Serial receives something
 Name=Serial.readString();
 Serial.print("Hello,");
 Serial.print(Name);
}

问候语只是保持循环可读性的便利功能之一。您还必须提供startDialog LostName、wonGame count games、light WINLed。您好,您发布的代码不完整,很可能是缺少的部分出错……如果第一次猜错了,那么您就有一个完整的循环来锁定代码。如果一开始猜测不正确,while循环中就没有任何东西要求或得到另一个猜测。所以它只是不断地重复while循环,但是猜测永远不会改变。它变成了一个无限循环。研究状态机。您不必在循环函数的一个循环中讲述整个故事。你不需要整个循环,你错过了{}。Jared希望setup函数永远阻塞,直到出现响应,然后对其应用readString。那很好。你的其他评论是有效的。本地函数多个设置和循环函数应引发编译问题。
// LED pins
const byte UPLed = 2; // indicates guess too low
const byte DNLed = 4; // indicates guess too high
const byte WINLed= 3;

unsigned int games = 0;
unsigned int guess = 0; // 0 : ask for new game

const unsigned int MAX = 500;
unsigned int solution; // 1 ... MAX

void setup () {
  Serial.begin(9600);
  pinMode(UPLed,OUTPUT);
  pinMode(DNLed,OUTPUT);
  pinMode(WINLed,OUTPUT);
  greeting(); // wait for user to enter their name
  randomSeed( millis() ); // time for user response is a good random seed
}

void loop() {
  // loop duration is one guess
  if (guess == 0) { 
    startDialog();
    solution = random(1, MAX+1);
    Serial.setTimeout(10000); // 10 sec per guess, else game lost
    digitalWrite(UPLed, LOW);
    digitalWrite(DNLed, LOW);
    digitalWrite(WINLed, LOW);  
  } 
  guess++;
  Serial.print("Guess # "); Serial.print(guess); Serial.print(": ");
  long try = Serial.parseInt();
  if (try == 0) { lostGame(); guess = 0;}
  else if (try == solution) {wonGame(); guess = 0;}
  else if (try < solution) {
    digitalWrite(UPLed, HIGH);
    digitalWrite(DNLed, LOW);   
  } else { // try > solution
    digitalWrite(UPLed, LOW);
    digitalWrite(DNLed, HIGH);
  }   
}

void greeting() {
 Serial.println();
 Serial.print("Hello, whats your name? ");
 while(Serial.available()==0){ } // block until Serial receives something
 Name=Serial.readString();
 Serial.print("Hello,");
 Serial.print(Name);
}