上网查了一下,STM32F411这颗芯片已经被Arduino支持了。心中不由窃喜。使用Vscode+platformIO搭建起了开发环境。使用arduino,编程变得简单多啦!
任务1:使用单片机定时器实现1s翻转LED验证开发板时钟晶振是否正确
使用platformio创建一个项目,板卡选择“nucleo_f411re”,烧写方式选择stlink。这里修改了platformio的配置文件,学习网上的一个项目实现多个例程的功能。首先是实现LED灯的翻转。
查看文档可知,板子上板载了一颗LED灯,对应管脚为PA5,在arduino中映射到D13。
#include <Arduino.h> #define LED_BUILTIN D13 void setup(void) { Serial.begin(115200); pinMode(LED_BUILTIN, OUTPUT); } void loop(void) { digitalWrite(LED_BUILTIN, HIGH); delay(1000); digitalWrite(LED_BUILTIN, LOW); delay(1000); Serial.println("Hello World!"); }
2. 实现OLED屏幕显示信息。这次搭配的屏幕是一款双色0.96寸的OLED屏幕,分辨率为128X64;接口为I2C接口。
参考着说明文档,将OLED接到板子的I2C接口上去。SCL->D15(PB8),SDA->D14(PB9),先用杜邦线接好连线。OLED屏幕使用5v供电,魏雷方便后边的拓展,使用了个I2C的拓展卡来方便接线。
修改platfomio.ini配置文件,增加一个oled的例程。这里使用了U8g2的驱动OLED的例程库。使用这个例程库的好处是,可以很轻松地支持起中文
; PlatformIO Project Configuration File ; ; Build options: build flags, source filter ; Upload options: custom upload port, speed and extra flags ; Library options: dependencies, extra library storages ; Advanced options: extra scripting ; ; Please visit documentation for the other options and examples ; https://docs.platformio.org/page/projectconf.html ; NUCLEO-F411RE [env] platform = ststm32 board = nucleo_f411re framework = arduino monitor_speed = 115200 upload_protocol = stlink [platformio] ; default_envs = 41_LEDBLANK default_envs = 42_IIC_SSD1306_OLED lib_deps = olikraus/U8g2 @ ^2.36.5 src_dir = examples/${platformio.default_envs} [env:41_LEDBLANK] [env:42_IIC_SSD1306_OLED]
#include <Arduino.h> #include <U8g2lib.h> #include <Wire.h> // iic驱动方式 U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE); // U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0, /* clock=*/ PB3, /* data=*/ PB5, /* reset=*/ U8X8_PIN_NONE); // 使用软件IIC,SCL PB6,SDA PB7 void setup(void) { Serial.begin(115200); u8g2.begin(); u8g2.enableUTF8Print(); // enable UTF8 support for the Arduino print() function } void loop(void) { u8g2.setFont(u8g2_font_unifont_t_chinese2); // use chinese2 u8g2.firstPage(); do { u8g2.setCursor(5, 15); u8g2.print("Let's do 2025"); // Chinese "Hello World" u8g2.setCursor(4, 30); u8g2.print("电子产品世界"); // Chinese "Hello World" } while (u8g2.nextPage()); delay(1000); }
任务3. 使用开发板实现对INA219的负载测量5V,12V电压电流并显示在OLED。
这个是INA219电流检测模块 - SEN0291 。原理是,在负载上串联了一颗电阻(阻值为:10毫欧),通过测量电阻两端的电压值,计算负载的电流值大小。使用I2C接口通讯。所以这里就直接接到了I2C扩展板上了。与OLED使用同一组I2C接口。
; NUCLEO-F411RE [env] platform = ststm32 board = nucleo_f411re framework = arduino monitor_speed = 115200 upload_protocol = stlink [platformio] ; default_envs = 41_LEDBLANK ; default_envs = 42_IIC_SSD1306_OLED ; lib_deps = ; olikraus/U8g2 @ ^2.36.5 ; default_envs = 43_INA219 default_envs = 44_POWER src_dir = examples/${platformio.default_envs} [env:41_LEDBLANK] [env:42_IIC_SSD1306_OLED] [env:43_INA219] [env:44_POWER]
这个电流模块可以在DFRobot的官网找到Arduino下的驱动代码,下载后参考着例程使用。
#include <Wire.h> #include "DFRobot_INA219.h" #define LED_BUILTIN D13 DFRobot_INA219_IIC ina219(&Wire, INA219_I2C_ADDRESS4); float ina219Reading_mA = 1000; float extMeterReading_mA = 1000; void setup(void) { Serial.begin(115200); //Open the serial port while(!Serial); Serial.println(); //Initialize the sensor while(ina219.begin() != true) { Serial.println("INA219 begin faild"); delay(2000); } //Linear calibration ina219.linearCalibrate(/*The measured current before calibration*/ina219Reading_mA, /*The current measured by other current testers*/extMeterReading_mA); Serial.println(); } void loop(void) { Serial.print("BusVoltage: "); Serial.print(ina219.getBusVoltage_V(), 2); Serial.println("V"); Serial.print("ShuntVoltage: "); Serial.print(ina219.getShuntVoltage_mV(), 3); Serial.println("mV"); Serial.print("Current: "); Serial.print(ina219.getCurrent_mA(), 1); Serial.println("mA"); Serial.print("Power: "); Serial.print(ina219.getPower_mW(), 1); Serial.println("mW"); Serial.println(""); delay(1000); }
上电后,电流模块不接负载,不接电,OLED显示