Arduino入门教程:4-1、代码基础-进阶

飞书文档https://x509p6c8to.feishu.cn/docx/NC51duj5aotuiax9GFicUv7Fnob

日志打印

需要知道芯片运行状态,运行到哪里,所以需要把信息打印到电脑。

复制代码
#include <Arduino.h> 

void setup() {
    //初始化串口,波特率位9600
    Serial.begin(9600);
    //打印"setup"字符到电脑,\n为换行符
    Serial.printf("setup\n");
}

void loop() {

}

一、数据类型**-** 变量

当我们需要芯片帮忙存储一些可能会变化的值,这时候就需要使用变量。

变量声明:

数据类型 变量名;

数据类型 变量名= 赋值;

变量赋值:

变量名= 赋值;

my_age = 19;

变量类型:

使用时,根据需要存储的数据范围,选择不同的数据类型。

复制代码
32位的芯片中:
有符号整数:
char -128 ~ 127
short -32768 ~ 32767
int -2147483648 ~ 2147483647

小数:
float是单精度浮点数,内存占4个字节,有效数字8位,表示范围是 -3.40E+38~3.40E+38。 3.40E+38 = 3.4×10的38次方。
double是双精度浮点数,内存占8个字节,有效数字16位,表示范围是-1.79E+ 308~-1.79E+308。
两者处理速度不同,CPU处理float的速度比处理double快。double的精度高,double消耗内存是float的两倍。

无符号整数:
unsigned char 0 ~ 256
unsigned short 0 ~ 65536
unsigned int 0 ~ 4294967295
无符号整数别名:
typedef unsigned char  uint8_t
typedef unsigned short uint16_t
typedef unsigned int   uint32_t

根据实际需要装的数据大小、类型进行申请即可,例如:
纸币面额: 1 5 10 20 50 100 可以使用uint8_t
你的账户余额:uint32_t
室外温度: -20.1 ~ 40.5 可以使用float

变量命名要求:

  • 建议小写字母+下划线命名 底层C类:device_name、java:类deviceName
  • 尽量不使用a b c i j k
  • 变量名的第一个字符必须是字母、下划线(_);

变量打印:

复制代码
printf("%d %f %.3f %s")

例子:

复制代码
#include <Arduino.h> 

uint8_t my_age;
long my_money = 1000000;
float my_height = 1.88;

void setup() {
    //初始化串口,波特率位9600
    Serial.begin(9600);
    //打印"setup"字符到电脑,\n为换行符
    my_age = 19;
    Serial.printf("setup\n");
    Serial.printf("age = %d\n",my_age );
    Serial.printf("money = %d\n",my_money );
    Serial.printf("height = %f\n",my_height );
}

void loop() {

}

二、数据类型**-** 常量与宏定义

需要芯片帮我们存储永远固定不变的值,这时候使用常量或宏定义。

常量:

宏定义:

例如:圆周率𝝅

复制代码
#include <Arduino.h> 

const int OPEN = 1;
const int CLOSE = 0;
const double PI_NUM = 3.1415;

#define LED_PIN 15
#define MAX_HEIGHT 100
#define SUCCESS 0
#define FAIL -1

void setup() {
    //初始化串口,波特率位9600
    Serial.begin(9600);
    //打印"setup"字符到电脑,\n为换行符
    Serial.printf("setup\n");
    //OPEN  = 2;
    Serial.printf("OPEN = %d\n",OPEN );
    Serial.printf("LED_PIN = %d\n",LED_PIN );
    Serial.printf("PI_NUM = %f\n",PI_NUM );
}

void loop() {

}

命名建议:

常量和宏定义建议使用大写字母+下划线命名

常量声明:

复制代码
const int var; //错误

const int var; //错误
var = 5;

const int var = 5; //正确

三、运算符

如何使用代码帮我们做算术呢?直接用运算符即可。

复制代码
+ - * /
++ --

a = 1 + 2;
b = 2 - 1;
a ++; 等同于 a = a + 1;
a --; 等同于 a = a - 1;

+ - * /
++ --

a = 1 + 2;
b = 2 - 1;
a ++; 等同于 a = a + 1;
a --; 等同于 a = a - 1;

四、控制结构**-** 判断、循环

让芯片拥有逻辑执行能力,例如:

当温度大于多少时,打印信息提醒我。

复制代码
//判断
if(a>b){

}else{

}

//循环
while(a>b){
   
}

//有限循环
for(uint8_t i = 0;i < 5;i++){

}
等价于:
uint8_t i = 0;
while(i < 5){
    //xxx
    i ++;
}

#include <Arduino.h> 

#define MAX_HEIGHT 100

uint8_t a = 10;
uint8_t b = 5;
uint8_t c = 0;

void setup() {
    //初始化串口,波特率位9600
    Serial.begin(9600);
    //打印"setup"字符到电脑,\n为换行符
    Serial.printf("setup\n");
   
    if(a > b){
        Serial.printf("a > b\n");
    }else{
        Serial.printf("a <= b\n");
    }
   
    while(a > b){
        Serial.printf("a > b\n");
        b = 15;
    }
   
    for(uint8_t i = 0;i < 5;i++){
        Serial.printf("i = %d\n",i);
    }
   
    if(a > MAX_HEIGHT){
        Serial.printf("a > MAX_HEIGHT\n");
    }else{
        Serial.printf("a <= MAX_HEIGHT\n");
    }
}

void loop() {

}

五、函数

如何把某个块代码集合到一起,复用起来呢?

函数是一组完成某个功能的语句。

setup和loop都是一个函数,我们也可以定义自己的函数,这样程序结构化才会更清晰,不同函数有不同的作用域。

复制代码
返回值类型 函数名(参数){
    函数实现;
    return 返回值;
}

void print_msg(){
    printf("i am printf msg \n");
    return;
}

uint8_t max(uint8_t a,uint8_t b){
    if(a > b){
        return a;
    }else{
        return b;
    }
}

#include <Arduino.h> 

uint8_t a = 10;
uint8_t b = 5;
uint8_t maxdata;

void print_msg(){
    printf("i am printf msg \n");
    return;
}

uint8_t max(uint8_t a,uint8_t b){
    if(a > b){
        return a;
    }else{
        return b;
    }
}

void func_1(){
    uint8_t a = 20;
    Serial.printf("func_1 a= %d\n",a);
}

void func_2(){
    uint8_t a = 30;
    Serial.printf("func_2 a= %d\n",a);
}

void setup() {
    //初始化串口,波特率位9600
    Serial.begin(9600);
    //打印"setup"字符到电脑,\n为换行符
    Serial.printf("setup\n");
    print_msg();
   
    maxdata = max(a,b);
    Serial.printf("maxdata = %d\n",maxdata);
   
    Serial.printf("a= %d\n",a);
    func_1();
    func_2():
}

void loop() {

}

六、数组(后置)

数组是同一类数据的集合,方便进行操作、管理。

比如班级学生的分数,float score[3] = {90.0,89.5,77.5};

纸币面额的集合,uint8_t money[6] = {1,5,10,20,50,100};

复制代码
uint8_t arrary[10];

void test_arrary(){
    arrary[0] = 1;
    arrary[1] = 2;
}

#include <Arduino.h> 

void setup() {
    //初始化串口,波特率位9600
    Serial.begin(9600);
    //打印"setup"字符到电脑,\n为换行符
    Serial.printf("setup\n");
   
    uint8_t money_1 = 1;
    uint8_t money_5 = 5;
    uint8_t money_10 = 10;
    uint8_t money_20 = 20;
    uint8_t money_50 = 50;
    uint8_t money_100 = 100;
    Serial.printf("money = %d\n",money_1 );
    Serial.printf("money = %d\n",money_5 );
    Serial.printf("money = %d\n",money_10 );
    Serial.printf("money = %d\n",money_20 );
    Serial.printf("money = %d\n",money_50 );
    Serial.printf("money = %d\n",money_100 );
   
    uint8_t money[6] = {1,5,10,20,50,100};
    for(uint8_t i = 0 ;i < 6;i++){
        Serial.printf("money = %d\n",money[i]);
    }
}

void loop() {

}

七、结构体(后置)

结构体可以让我们更容易描述一个接近现实的数据模型。

复制代码
//长方形的属性 长 宽 颜色等
uint8_t length;
uint8_t width;
uint8_t height;

typedef struct{
    uint8_t length;
    uint8_t width;
    uint8_t height; 
}t_cuboid;

#include <Arduino.h> 

typedef struct{
    uint8_t length;
    uint8_t width;
    uint8_t height; 
}t_cuboid;

t_cuboid m_cuboid= {10,5,1};

void setup() {
    //初始化串口,波特率位9600
    Serial.begin(9600);
    //打印"setup"字符到电脑,\n为换行符
    Serial.printf("setup\n");
   
    Serial.printf("length=%d width=%d height=%d\n",m_cuboid.length,m_cuboid.width,m_cuboid.height);
}

void loop() {

}

八、关于二进制、十进制、十六进制(后置)

复制代码
10进制(逢十进一)
0、1、2、3、4、5、6、7、8、9 -> 10 ... 19 -> 20
二进制(逢二进一)
0:0000 0000
1:0000 0001
2:0000 0010
3:0000 0011
4:0000 0100
5:0000 0101
6:0000 0110
7:0000 0111
8:0000 1000
9:0000 1001
10:0000 1010
16进制(逢十六进一)
0、1、2、3、4、5、6、7、8、9、a、b、c、d、e、f -> 10 ... 1f ->20
0x21 = 2*16+1 = 33 = 0010 0001

代码中的表示:10=0x0a
uint8_t a = 10;
uint8_t a = 0x0a;
不带 0x 的是十进制,带了 0x 符号的是十六进制。

十进制 主要运用于日常生活当中,而 二进制、十六进制 主要运用于电子技术行业。
二进制 是数字电路、处理器等最直接的语言,十六进制 由于有着方便转化记录的意义而使用

九、更多函数&语法参考

arduino官方文档:

https://www.arduino.cc/reference/en/

arduino参考手册:参考飞书文档

相关推荐
三佛科技-134163842122 小时前
高速风筒方案开发 高速风筒MCU控制方案设计
单片机·嵌入式硬件·智能家居·pcb工艺
清风6666667 小时前
基于单片机的螺旋藻生长大棚PH智能控制设计
单片机·嵌入式硬件·毕业设计·课程设计
ting_zh9 小时前
微控制器(Micro Controller Unit, MCU)基础整理
单片机·嵌入式硬件
清风6666669 小时前
基于单片机的图书馆智能座位管理平台
数据库·单片机·嵌入式硬件·毕业设计·课程设计
得单片机的运10 小时前
STM32的以太网的搭建
stm32·单片机·嵌入式硬件·物联网·以太网·iot·w5500
酷飞飞11 小时前
RTC和看门狗基于GD32F407VE的天空星的配置
stm32·单片机·嵌入式硬件·mcu
WD1372980155713 小时前
WD5030A,24V降5V,15A 大电流,应用于手机、平板、笔记本充电器
stm32·单片机·嵌入式硬件·智能手机·汽车·电脑·51单片机
日更嵌入式的打工仔13 小时前
GPIO 中断通用配置指南
stm32·单片机·嵌入式硬件
平凡灵感码头13 小时前
基于 STM32 的智能门锁系统,系统界面设计
stm32·单片机·嵌入式硬件
Truffle7电子14 小时前
STM32理论 —— 存储、中断
stm32·嵌入式硬件·嵌入式·存储·中断