Arduino开发环境搭建
1. 打开ArduinoIDE。点击 “文件” 菜单,然后点击 “首选项”。
2. “首选项” 对话框将打开,然后将以下链接添加到 “其它开发板管理器地址”字段, 并点击 “确定”: https://github.com/stm32duino/BoardManagerFiles/raw/main/package_stmicroelectronics_index.json
3. 点击 “工具” 菜单,然后点击 “开发板 > 开发板管理器” 或使用左侧栏带下划线的图标。
4. 在搜索栏输入 stm32 选择 “STM32 MCU based boards”,并点击安装。我这里的环境已经安装好了 2.9.0版本,而最新版本为 2.10.1 此处显示的是更新,如果没有安装过,则会显示最新版本,旁边按钮字样为 安装。
基础任务1:使用单片机定时器实现1s翻转LED验证开发板时钟晶振是否正确;
搭建好开发环境之后,就可以使用 Arduino 进行愉快地玩耍了,按照基础任务1的要求,先来点个灯吧!
代码实现
/** * 任务1:使用单片机定时器实现1s翻转LED验证开发板时钟晶振是否正确; */ void task1() { Serial.begin(115200); pinMode(LED_BUILTIN, OUTPUT); // 设置LED引脚为输出 while(1) { Serial.println(millis()); // 打印当前执行毫秒数值 digitalToggle(LED_BUILTIN); // 翻转LED delay(1000); // 延时1秒 } }
效果展示
基础任务2:实现OLED屏幕显示信息;
硬件准备
NUCLEO-F411RE 开发板 1 块
Grove - 0.96英寸黄蓝双色OLED显示屏 1 个
面包板 1 块
杜邦线 若干
Grove - 0.96英寸黄蓝双色OLED显示屏 默认情况下是通过 IIC 连接,按照如下图所示,连接到开发板即可。
代码实现
#include <Wire.h> #include <U8g2lib.h> static U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0, /* clock=*/ SCL, /* data=*/ SDA, /* reset=*/ U8X8_PIN_NONE); // All Boards without Reset of the Display /** * 任务2:实现OLED屏幕显示信息; */ void task2() { Serial.begin(115200); delay(1000); // 延时一秒后初始化OLED屏 // U8g2 初始化 while(!u8g2.begin()) { Serial.println(F("SSD1306 allocation failed")); delay(2000); // 不要继续,永远循环下去 } u8g2.enableUTF8Print(); // 启用UTF8 u8g2.setFont(u8g2_font_unifont_t_chinese2); // 设置字体,支持中文 Serial.println("OLED init finished."); while(1) { u8g2.firstPage(); do { u8g2.setCursor(2, 15); u8g2.print("Hello EEPW!"); u8g2.setCursor(2, 32); u8g2.print("你好 EEPW!"); u8g2.setCursor(2, 48); u8g2.printf("millis: %d", millis()); } while(u8g2.nextPage()); delay(1000); } }
效果展示
基础任务3:使用开发板实现对INA219的负载测量5V,12V电压电流并显示在OLED。
硬件准备
NUCLEO-F411RE 开发板 1 块
Grove - 0.96英寸黄蓝双色OLED显示屏 1 个
Gravity I2C数字功率计模块 1个
面包板 1 块
杜邦线 若干
Gravity I2C数字功率计 也是通过 IIC 连接到开发板,在基础任务2的基础上,参考上图的功率测量负载连接方案增加 Gravity I2C数字功率计 的连接。按照如下图所示,连接到开发板即可。
代码实现
#include <Wire.h> #include <U8g2lib.h> #include <DFRobot_INA219.h> // OLED 显示屏定义 static U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0, /* clock=*/ SCL, /* data=*/ SDA, /* reset=*/ U8X8_PIN_NONE); // All Boards without Reset of the Display // INA219 static DFRobot_INA219_IIC ina219(&Wire, INA219_I2C_ADDRESS4); // 测量结果 static float busVoltage = 0.0; // 总线电压 static float shuntVoltage = 0.0; // 分线电压 static float current = 0.0; // 电流 static float power = 0.0; // 功率 /** * 任务3:使用开发板实现对INA219的负载测量5V,12V电压电流并显示在OLED。 */ void task3() { Serial.begin(115200); delay(1000); // 延时一秒后继续初始化 // INA219 初始化 while(ina219.begin() != true) { Serial.println("INA219 begin faild"); delay(2000); // 不要继续,永远循环下去 } // U8g2 初始化 while(!u8g2.begin()) { Serial.println(F("SSD1306 allocation failed")); delay(2000); // 不要继续,永远循环下去 } u8g2.enableUTF8Print(); // 启用UTF8 u8g2.setFont(u8g2_font_unifont_t_chinese3); // 设置字体,支持中文 Serial.println("OLED init finished."); while(1) { // 读取 INA219 数据 busVoltage = ina219.getBusVoltage_V(); shuntVoltage = ina219.getShuntVoltage_mV(); current = ina219.getCurrent_mA(); power = ina219.getPower_mW(); // OLED 显示当前电压电流,以及功率信息。 u8g2.firstPage(); do { u8g2.setCursor(5, 14); u8g2.print(" 电压电流表"); u8g2.setCursor(2, 31); u8g2.print("电压: "); u8g2.print(busVoltage); u8g2.print(" V"); u8g2.setCursor(2, 48); u8g2.print("电流: "); u8g2.print(current); u8g2.print(" mA"); u8g2.setCursor(2, 63); u8g2.print("Power: "); u8g2.print(power); u8g2.print(" mW"); } while(u8g2.nextPage()); // 串口打印 Serial.print("BusVoltage: "); Serial.print(busVoltage, 2); Serial.println("V"); Serial.print("ShuntVoltage: "); Serial.print(shuntVoltage, 3); Serial.println("mV"); Serial.print("Current: "); Serial.print(current, 1); Serial.println("mA"); Serial.print("Power: "); Serial.print(power, 1); Serial.println("mW"); Serial.println(""); delay(1000); } }
效果展示