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参考手册:参考飞书文档

相关推荐
星辰pid3 小时前
STM32控制四自由度机械臂(SG90舵机)(硬件篇)(简单易复刻)
stm32·单片机·嵌入式硬件·机械臂
威桑4 小时前
STM32 专有名词缩写整合
stm32·单片机·嵌入式硬件
星源~5 小时前
tree 命令集成到 Git Bash:可视化目录结构的指南
git·单片机·物联网·嵌入式·项目开发
SKYDROID云卓小助手6 小时前
无人设备遥控器之自动调整编码技术篇
人工智能·嵌入式硬件·算法·自动化·信号处理
所念皆星海9116 小时前
图灵完备之路(数电学习三分钟)----数据选择器与总线
嵌入式硬件·通信·数电
智者知已应修善业7 小时前
【51单片机节日彩灯控制器设计】2022-6-11
c语言·经验分享·笔记·单片机·嵌入式硬件·51单片机
大美B端工场-B端系统美颜师8 小时前
多模态数据融合预警:从IoT传感器到卫星监测的可视化方案升级
物联网·交互·数据预警
开-悟8 小时前
嵌入式编程-使用AI查找BUG的启发
c语言·人工智能·嵌入式硬件·bug
许白掰10 小时前
【stm32】HAL库开发——CubeMX配置RTC,单片机工作模式和看门狗
stm32·单片机·嵌入式硬件·学习·实时音视频
DIY机器人工房11 小时前
0.96寸OLED显示屏 江协科技学习笔记(36个知识点)
笔记·科技·stm32·单片机·嵌入式硬件·学习·江协科技