while (1) { // OLED_ShowSignedNum(1,7,Speed/20,3); if(DHT11_Read_Data(&temperature,&temp,&humidity,&humi)==0) { OLED_ShowNum(2,6,temperature,2); OLED_ShowNum(2,9,temp,1); OLED_ShowNum(3,6,humidity,2); OLED_ShowNum(3,9,humi,1); Delay_ms(20); } for (Angle = 115; Angle >= 25; Angle--) { Duoji_SetAngle(Angle); Delay_ms(20); Speed = 60; Motor_SetSpeed(Speed); if (KeyNum == 3) break; }if (KeyNum == 3) break; for (Angle = 25; Angle <= 175; Angle++) { Duoji_SetAngle(Angle); Delay_ms(20); Motor_SetSpeed(Speed); if (KeyNum == 3) break; }if (KeyNum == 3) break; for (Angle = 175; Angle >= 115; Angle--) { Duoji_SetAngle(Angle); Delay_ms(20); Motor_SetSpeed(Speed); if (KeyNum == 3) break; } } if (KeyNum == 3) break ; } Angle = 115; Duoji_SetAngle(Angle); OLED_Clear(); OLED_ShowString(2, 1, "exit"); Delay_s(1); OLED_Clear(); Speed = 0; break; }这个while循环里面嵌套3个for循环但是当KeyNum等于3的时候还是退出不了循环,是怎么回事
时间: 2024-03-19 18:42:49 浏览: 92
在给出回答之前,需要了解一下 `KeyNum` 是如何被更新的,因为这个变量的值是决定退出循环的关键。
在这段代码中,我们可以看到 `KeyNum` 没有在循环体内被更新,这意味着循环内部不能改变 `KeyNum` 的值,只能通过外部的其他代码来修改它。
如果你在循环内部修改了 `KeyNum` 的值,那么循环内部的 `if (KeyNum == 3) break;` 条件判断就会失效,因为它只会检查循环开始时的 `KeyNum` 值。
如果你想要在循环内部修改 `KeyNum` 的值,你可以使用一个标志变量来代替 `KeyNum`,并在循环内部检查这个标志变量的值来控制循环的退出。
除了上述可能的原因外,还有可能是其他问题导致无法退出循环,比如某些硬件问题或者其他的逻辑错误。在这种情况下,你需要仔细检查代码中的每一个细节,找到问题所在并进行修复。
相关问题
#include <Arduino.h> #include <U8g2lib.h> #include <Wire.h> #include "DHT.h" #include <ArduinoJson.h> #define DHTPIN A0 #define DHTTYPE DHT11 const int motorIn1 = 9; const int motorIn2 = 10; #define rank1 150 #define rank2 0 //iic驱动方式 U8G2_SSD1306_128X64_NONAME_1_SW_I2C u8g2(U8G2_R0, /* clock=*/ SCL, /* data=*/ SDA, /* reset=*/ U8X8_PIN_NONE); DHT dht(DHTPIN, DHTTYPE); StaticJsonDocument<200> sendJson; // 创建JSON对象,用来存放发送数据 StaticJsonDocument<200> readJson; // 创建JSON对象,用来存放接收到的数据 unsigned long lastUpdateTime = 0; //记录上次上传数据时间 const unsigned long updateInterval = 2000; // 在这里设置数据发送至云平台的时间间隔,单位为毫秒 long ID = 100416; // 定义设备ID号,替换成云平台生成的ID号 void setup() { u8g2.begin(); dht.begin(); pinMode(motorIn1, OUTPUT); pinMode(motorIn2, OUTPUT); Serial.begin(9600); } char h_str[3]; char t_str[3]; float h; float t; void loop() { // 该函数段可完成数据定时上报的功能,并且不会阻塞loop函数的运行 if (millis() - lastUpdateTime > updateInterval) { sendJsonData(); lastUpdateTime = millis(); } h = dht.readHumidity();//读湿度 t = dht.readTemperature();//读温度(摄氏度) strcpy(h_str, u8x8_u8toa(h, 2)); /* convert m to a string with two digits */ strcpy(t_str, u8x8_u8toa(t, 2)); /* convert m to a string with two digits */ if (t>26) { clockwise(rank1); } else { clockwise(rank2); } delay(1000); u8g2.firstPage(); do { u8g2.setFont(u8g2_font_fur20_tf); u8g2.drawStr(0, 23, "T"); u8g2.drawStr(20, 23, ":"); u8g2.drawStr(40, 23, t_str); u8g2.drawStr(90, 23, "C"); u8g2.drawStr(0, 63, "H"); u8g2.drawStr(20, 63, ":"); u8g2.drawStr(40, 63, h_str); u8g2.drawStr(90, 63, "%"); } while ( u8g2.nextPage() ); delay(1000); } //上传数值 void sendJsonData() { // 将数据添加到JSON对象中,左边为在云平台中定义的标识符,右边为变量 sendJson["ID"] = ID; sendJson["temperature"] = t; //将对象转换成字符串,并向ese8266发送消息 serializeJson(sendJson, Serial); Serial.print("\n"); } void clockwise(int Speed) { analogWrite(motorIn1, 0); analogWrite(motorIn2, Speed); }
这是一个Arduino的代码,使用了DHT11传感器来读取温湿度数据,同时使用了U8g2库来驱动OLED屏幕显示数据。还使用了一个步进电机,根据温度值的大小来控制电机的转速。代码中还使用了ArduinoJson库来处理JSON数据格式,并将数据上传到云平台。其中的sendJsonData函数可以定时上传数据到云平台,可以根据需要修改上传时间间隔。
用Keil5编写代码实现一个基于stm32f103c8t6最小系统板的工程,实现如下功能:1.DHT11传感器获取温湿度 2.MQ-135传感器获取空气质量 3.0.96寸的oled显示屏可以显示dht11传感器获取的空气温湿度以及MQ-135传感器获取的空气质量 4.当dht11传感器获取的空气温湿度以及MQ-135传感器获取的空气质量超过设定的阈值时,蜂鸣器报警 5.通过esp8266-01将dht11传感器获取的空气温湿度以及MQ-135传感器获取的空气质量上传到阿里云平台 6.通过wifi连接可以在web端显示dht11传感器获取的空气温湿度以及MQ-135传感器获取的空气质量
好的,下面是一份实现该功能的代码,需要注意的是,以下代码只是一个示例,具体的实现过程和代码编写可能会因不同的硬件环境和软件配置而有所差异。以下代码仅供参考:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "stm32f10x.h"
#include "dht11.h"
#include "MQ135.h"
#include "oled.h"
#include "esp8266.h"
#define WIFI_SSID "your_wifi_ssid" //WiFi名称
#define WIFI_PASSWORD "your_wifi_password" //WiFi密码
#define THRESHOLD_TEMP 26 //温度阈值
#define THRESHOLD_HUMI 60 //湿度阈值
#define THRESHOLD_AIR 450 //空气质量阈值
uint8_t DHT11_Data[5] = {0}; //DHT11数据
uint16_t MQ135_Data = 0; //MQ135数据
void SysTick_Handler(void)
{
static uint16_t count = 0;
if (++count >= 1000) //1秒钟更新一次数据
{
count = 0;
//获取DHT11数据
DHT11_Read_Data(DHT11_Data);
//获取MQ135数据
MQ135_Data = MQ135_Read_Data();
//显示DHT11和MQ135数据到OLED屏幕
OLED_Show_DHT11_Data(DHT11_Data[0], DHT11_Data[2]);
OLED_Show_MQ135_Data(MQ135_Data);
//判断DHT11和MQ135数据是否超过阈值
if (DHT11_Data[0] > THRESHOLD_TEMP || DHT11_Data[2] > THRESHOLD_HUMI || MQ135_Data > THRESHOLD_AIR)
{
//蜂鸣器报警
GPIO_SetBits(GPIOB, GPIO_Pin_8);
}
else
{
//关闭蜂鸣器
GPIO_ResetBits(GPIOB, GPIO_Pin_8);
}
//将DHT11和MQ135数据上传到阿里云平台
char data[100] = {0};
sprintf(data, "{\"temperature\":%d,\"humidity\":%d,\"air_quality\":%d}", DHT11_Data[0], DHT11_Data[2], MQ135_Data);
ESP8266_Send_Data(data);
}
}
int main(void)
{
//初始化系统
SystemInit();
//初始化DHT11传感器
DHT11_Init();
//初始化MQ135传感器
MQ135_Init();
//初始化OLED屏幕
OLED_Init();
//初始化ESP8266模块
ESP8266_Init(WIFI_SSID, WIFI_PASSWORD);
//初始化蜂鸣器
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
//启动系统滴答定时器
if (SysTick_Config(SystemCoreClock / 1000))
{
while (1);
}
while (1);
return 0;
}
```
以上代码中,我们使用了一些外部库,包括dht11.h、MQ135.h、oled.h和esp8266.h。这些库中包含了对DHT11传感器、MQ135传感器、OLED屏幕和ESP8266模块的初始化和操作函数,以及对阿里云平台的数据上传函数。
在主函数中,我们首先初始化了DHT11、MQ135、OLED和ESP8266模块,然后初始化了蜂鸣器,启动了系统滴答定时器。在滴答定时器的中断处理函数中,我们每秒钟更新一次DHT11和MQ135传感器的数据,并将数据显示到OLED屏幕上,判断数据是否超过设定的阈值,如果超过则触发蜂鸣器报警,否则关闭蜂鸣器,并将数据上传到阿里云平台。
需要注意的是,在程序中需要填写WiFi的SSID和密码,以及阿里云平台的访问参数,这些参数需要根据实际情况进行配置。
阅读全文