尘埃小站 糯米一家的日常生活记录 - arduino
Arduino开发板arduino官网 https://www.arduino.cc/arduino 内置函数文档说明 https://docs.arduino.cc/learn/programming/reference/太极中文对照价函数文档说明 http://www.taichi-maker.com/homepage/reference-index/arduino-code-reference/一、认识arduino​ 图为arduion uno开发板在Arduino中，PWM（脉冲宽度调制）数字端口和模拟（Analog）端口具有不同的功能和特点。PWM（脉冲宽度调制）数字端口：PWM数字端口是指能够产生PWM信号的特殊数字引脚，如Arduino Uno的3、5、6、9、10和11号引脚。其他Arduino板可能有不同的PWM引脚。PWM引脚通过模拟输出的方式产生模拟信号，但它们仍然是数字引脚，只能输出逻辑高或逻辑低电平。PWM信号的特点是可以通过改变脉冲的占空比来模拟出不同的模拟电压，从而控制外部设备的亮度、速度等，例如控制LED的亮度或舵机的位置。模拟端口：模拟端口是指能够读取模拟信号的引脚，如Arduino Uno的A0到A5引脚。这些引脚可以接收来自传感器、电位器等模拟信号，并将它们转换为数字值。模拟端口上的模拟输入被Arduino内置的ADC（模拟数字转换器）转换为数字值。这些数字值的范围通常是0到1023（10位ADC），代表输入模拟信号的电压在0到5V之间的值。模拟端口还可以通过使用PWM来模拟模拟输出。虽然这些引脚通常用于模拟输入，但是某些Arduino板上的模拟端口也具有PWM功能。例如，Arduino Uno的引脚A0到A5也可以产生PWM信号。总的来说，PWM数字端口用于产生PWM信号以控制外部设备的亮度、速度等，而模拟端口用于读取传感器信号并将其转换为数字值。某些Arduino板上的模拟端口也可以用于产生PWM信号，但是它们的主要功能还是模拟输入。二、C++前置知识2.1创建变量名要求变量名称注意事项变量名不能有空格变量名不能有特殊符号不能以数字开头不能使用关键字只能使用数字字母以及下划线命名，且不能以数字开头三、物理，电路硬件前置知识3.1欧姆定律V=I*R V表示电压（单位为伏特），I表示电流（单位为安培），R表示电阻（单位为欧姆）3.2电子元件3.2.1 发光二极管区分正负极，长边为正极，短边为负极，电流很小可以忽略不计(20mA)，因此需要在电路中配合电阻使用3.2.2 四角微动开关相连不同侧，同侧不相连3.2.3 上拉电阻当外部信号未连接到输入引脚时，输入引脚处于悬空状态，容易受到干扰而产生不确定的电平。这种情况下，如果没有上拉电阻，输入引脚可能会随机地处于高电平或低电平状态，从而导致系统错误或不可预测的行为上拉电阻的作用是确保输入引脚在未连接外部信号时保持在逻辑高电平状态，以防止悬空状态引发不确定的电平，从而提高系统的稳定性和可靠性。上拉电阻在不同的电路中取值不同，通常在arduino中使用10kΩ的电阻3.2.4 数码管3.2.5 电位器四、arduino小实验（数字引脚）arduino函数总结void setup() {} 只执行一次，通电或rest后执行一次void loop() {} 反复执行pinMode(引脚值,初始化设置)OUTPUT模式 此时引脚为低阻抗状态，可以向其他电路原件提供电流（通常为40mA以内）当引脚配置为输出模式时，它可以向外部设备发送电信号。这意味着它可以控制外部设备的状态。在输出模式下，可以通过编程将引脚设置为逻辑高电平（通常是电源电压，如5V）或逻辑低电平（通常是接地电压，如0VINPUT模式 引脚设为数字输入INPUT 状态时，此时引脚为高阻抗状态,可以识别两种状态 HIGH(高电平) LOW(低电平)当引脚配置为输入模式时，它被用于接收外部信号。这意味着它可以读取外部传感器的值或监测外部设备的状态。在输入模式下，引脚可以读取外部电平，比如读取按钮的状态（按下或释放）或读取其他数字信号。在输入模式下，引脚的电平由外部信号确定。INPUT_PULLUP模式 arduino将开启内部的上拉电阻，设置为输入上拉以后，请勿将该引脚与负压或者高于5v的电压相连，否则会损坏Arduino\这种模式下的输入引脚与普通输入模式相似，但是在此模式下引脚连接了一个内部上拉或下拉电阻，以确保在外部信号未连接时，引脚的电平稳定。当引脚配置为输入模式（带上拉电阻）时，如果外部信号未连接，则引脚会被拉向逻辑高电平（通常是电源电压，如5V）。当引脚配置为输入模式（带下拉电阻）时，如果外部信号未连接，则引脚会被拉向逻辑低电平（通常是接地电压，如0V）。digitalRead(引脚值) 读取当前引脚状态digitalWrite(引脚值, HIGH);HIGH 高电平 5vLOW 低电平 0Vdelay(1000); 等待时间，毫秒值串口函数Serial.begin(9600); 初始化串口通信，波特率调为9600Serial.println(buttonState); 串口输出语句analogWrite(引脚值,范围值) 必须是pwm引脚将一个模拟信号值写入arduino引脚，这个操作可以用来控制LED亮度，或者电机转速在调用analogWrite()前，无需使用pinMode()函数来设置引脚(设置也不影响，可以省略)4.1点亮uno内置LED实例让板载LED灯珠闪烁//当给开发板通点或者执行复位按钮后，setup函数会执行一次 void setup() { pinMode(LED_BUILTIN, OUTPUT);//初始化LED_BUILTIN数字引脚为输出模式，在uno中就是13数字引脚 } //函数会永久反复的执行 void loop() { digitalWrite(LED_BUILTIN, HIGH); // 设置高电平 点亮LED delay(1000); //等待一秒 digitalWrite(LED_BUILTIN, LOW); // 设置低电平 熄灭LED delay(1000); // 等待一秒 }4.2点亮LED让外置LED灯珠闪烁void setup() { pinMode(5, OUTPUT);//将数字5引脚设为输出引脚 } void loop() { digitalWrite(5, HIGH); //高电平 delay(1000); digitalWrite(5, LOW); //低电平 delay(1000); }电路接线 (上拉电阻选用10kΩ ,不加上拉电阻板子会烧掉ardino)4.3通过开关控制 进行数字输入，点亮LED按下开关点亮内置IED灯珠，串口输出由1变为0//读取引脚2的数字输入，将结果显示在串口监视器中 //引脚2连接有按键开关，给它一个名字： int pushButton = 2; //当你按下复位按钮后，setup流程运行一次： void setup() { //串口通讯初始化，每秒9600位 Serial.begin(9600); //设置按键引脚为输入 pinMode(pushButton, INPUT); } // loop 流程会永远的反复运行 void loop() { //读取输入引脚: int buttonState = digitalRead(pushButton); // 显示按键状态 Serial.println(buttonState); //可以在arduion串口窗口查看输出值 delay(1); // 为确保程序稳定运行进行短暂停止 }4.4按键控制Arduino ide灯开关按下开关才会点亮内置IED,使用引脚上拉模式，注意，在上拉模式下，按钮逻辑是反的，因此读数高电平1 灯灭 ，低电平0灯亮// 本示例展示如何使用pinMode(INPUT_PULLUP)。通过本程序，Arduino将读取引脚2 // 的数字输入并将结果显示在串口监视器中。 // 电路： // * 引脚2连接轻触开关，开关另一端接地 // * 引脚13上安装有开发板内置LED //与使用pinMode(INPUT)不同，我们在使用pinMode(INPUT_PULLUP)时不需要外接上拉或下拉电阻。 //开发板内置一个20K欧姆电阻，该电阻将引脚上拉到5V。开关在打开时，引脚读取到高电平。开关闭合后，引脚读取到低电平 void setup() { //开始串口通讯 Serial.begin(9600); //将引脚2设置为输入上拉模式 pinMode(2, INPUT_PULLUP); pinMode(13, OUTPUT);//关于引脚，在arduino uno中 13号引脚用LED_BUILTIN表示 } void loop() { //将开关状态数值读取到变量中 int sensorVal = digitalRead(2); //输出开关状态数值 Serial.println(sensorVal); //请留意在上拉模式下，按钮的逻辑状态是反的。 //即：开关断开时引脚读取到高电平。开关被按下后引脚读取到低电平。 //按钮被按下后，引脚13连接的LED将被点亮。按钮没有按下时，LED熄灭。 //如果按钮没有按下，熄灭LED。否则，点亮LED if (sensorVal == HIGH) { //按钮没有按下 digitalWrite(13, LOW); //熄灭LED } else { //否则 digitalWrite(13, HIGH); //点亮LED } }//代码优化 void setup() { Serial.begin(9600); pinMode(2, INPUT_PULLUP); pinMode(LED_BUILTIN, OUTPUT); } void loop() { Serial.println(digitalRead(2)); digitalRead(2)?digitalWrite(LED_BUILTIN, LOW):digitalWrite(LED_BUILTIN, HIGH);//三元运算 }4.5双控制开关测试同时按下两个按键，才能点亮uno内置ledbool b1; //设定变量 bool b2; void setup() { pinMode(2, INPUT_PULLUP); //设置引脚 pinMode(3, INPUT_PULLUP); pinMode(LED_BUILTIN, OUTPUT); } void loop() { b1 = digitalRead(2); b2 = digitalRead(3); if(!b1 && !b2){ //必须两个都是低电平才能亮灯 digitalWrite(LED_BUILTIN, HIGH); }else{ //否则都不亮 digitalWrite(LED_BUILTIN, LOW); } }4.6双控制开关，外置LED灯珠两个按键都不按下，只显示红灯，按下一个，内置LED闪烁，全部按下显示绿灯//两个按键都不按下，只显示红灯，按下一个，内置LED闪烁，全部按下显示绿灯 bool b1; bool b2; void setup() { Serial.begin(9600); pinMode(2, INPUT_PULLUP);//用于读取开关变化状态 pinMode(3, INPUT_PULLUP); pinMode(4, OUTPUT); //用于给小LED供电 接红灯 pinMode(5, OUTPUT); //接绿灯 } void loop() { b1 = digitalRead(2);//把状态值存入变量，注意开关状态 按下是0 不按是1 b2 = digitalRead(3); Serial.print(b1); Serial.println(b2); if(b1 && b2){//都没按 digitalWrite(4,HIGH); }else if(!b1 && !b2){//都按下 digitalWrite(5,HIGH); }else{//只按一个 digitalWrite(4,LOW); digitalWrite(5,LOW); } } //TODO 有一定概率红绿灯同时亮起五、arduino小实验（模拟引脚）调整小LED亮度只能使用pwm引脚(3,5,6,9,19,11)5.1 通过按键控制LED灯珠亮度bool b1; bool b2; int ledPin = 9; //led引脚 int brightness = 128;//led亮度参数 void setup() { Serial.begin(9600); pinMode(2, INPUT_PULLUP); pinMode(8, INPUT_PULLUP); pinMode(ledPin, OUTPUT); } void loop() { b1 = digitalRead(2);//把状态值存入变量，注意开关状态 按下是0 不按是1 b2 = digitalRead(8); if(!b1 && brightness>0){//按1 并且 亮度大于0 变暗 brightness--; }else if(!b2 && brightness<255){////按2 并且 亮度小于255 变亮 brightness++; } analogWrite(ledPin,brightness);//改变亮点 Serial.println(brightness); delay(10);//等待10毫秒，提高稳定性 }总结，为什么可以控制LED的亮度LED灯实际上调节的是灯明暗的时间比，只不过明暗交替非常快人眼感觉不出来，当明暗交替比50的时候，亮度就是50%。调节参数0-254，实际就是二进制一个字节的大小​ 时间间隔大的时候，人眼感觉灯的状态是闪烁​ 时间间隔小的话，人眼感觉的就是明暗的变化了5.2 使用for循环实现呼吸灯效果让led灯慢慢变亮再慢慢变暗int ledPin = 9; //led引脚 void setup() { Serial.begin(9600); } void loop() { //由暗到明 for(int brightness =0;brightness=<255;brightness++){ analogWrite(ledPin,brightness);//改变亮点 Serial.println(brightness); delay(10);//等待10毫秒，提高稳定性 } //由明道暗 for(int brightness =255;brightness>=0;brightness--){ analogWrite(ledPin,brightness);//改变亮点 Serial.println(brightness); delay(10);//等待10毫秒，提高稳定性 } }