

1控制LED和继电器
除了PA4 PA11和PA12其他都可以
b3 b4控制继电器没作用 b6 b7可以
蜂鸣器需要3.3v供电 低电平有效
void setup() {
pinMode(PC13, OUTPUT);
pinMode(PC14, OUTPUT);
pinMode(PC15, OUTPUT);
pinMode(PA0, OUTPUT);
pinMode(PA1, OUTPUT);
pinMode(PA2, OUTPUT);
pinMode(PA3, OUTPUT);
pinMode(PA4, OUTPUT);
pinMode(PA5, OUTPUT);
pinMode(PA6, OUTPUT);
pinMode(PA7, OUTPUT);
pinMode(PA8, OUTPUT);
pinMode(PA9, OUTPUT);
pinMode(PA10, OUTPUT);
// pinMode(PA11, OUTPUT); // CAN t0 不能用
// pinMode(PA12, OUTPUT); // CAN r0 不能用
pinMode(PA15, OUTPUT);
pinMode(PB0, OUTPUT);
pinMode(PB1, OUTPUT);
pinMode(PB2, OUTPUT);
pinMode(PB3, OUTPUT);
pinMode(PB4, OUTPUT);
pinMode(PB5, OUTPUT);
pinMode(PB6, OUTPUT);
pinMode(PB7, OUTPUT);
pinMode(PB8, OUTPUT);
pinMode(PB9, OUTPUT);
pinMode(PB10, OUTPUT);
pinMode(PB11, OUTPUT);
pinMode(PB12, OUTPUT);
pinMode(PB13, OUTPUT);
pinMode(PB14, OUTPUT);
pinMode(PB15, OUTPUT);
}
void loop() {
digitalWrite(PC13, HIGH);
digitalWrite(PC14, HIGH);
digitalWrite(PC15, HIGH);
digitalWrite(PA0, HIGH);
digitalWrite(PA1, HIGH);
digitalWrite(PA2, HIGH);
digitalWrite(PA3, HIGH);
digitalWrite(PA4, HIGH);
digitalWrite(PA5, HIGH);
digitalWrite(PA6, HIGH);
digitalWrite(PA7, HIGH);
digitalWrite(PA8, HIGH);
digitalWrite(PA9, HIGH);
digitalWrite(PA10, HIGH);
// digitalWrite(PA11, HIGH);
// digitalWrite(PA12, HIGH);
digitalWrite(PA15, HIGH);
digitalWrite(PB0, HIGH);
digitalWrite(PB1, HIGH);
digitalWrite(PB2, HIGH);
digitalWrite(PB3, HIGH);
digitalWrite(PB4, HIGH);
digitalWrite(PB5, HIGH);
digitalWrite(PB6, HIGH);
digitalWrite(PB7, HIGH);
digitalWrite(PB8, HIGH);
digitalWrite(PB9, HIGH);
digitalWrite(PB10, HIGH);
digitalWrite(PB11, HIGH);
digitalWrite(PB12, HIGH);
digitalWrite(PB13, HIGH);
digitalWrite(PB14, HIGH);
digitalWrite(PB15, HIGH);
delay(1000);
digitalWrite(PC13, LOW);
digitalWrite(PC14, LOW);
digitalWrite(PC15, LOW);
digitalWrite(PA0, LOW);
digitalWrite(PA1, LOW);
digitalWrite(PA2, LOW);
digitalWrite(PA3, LOW);
digitalWrite(PA4, LOW);
digitalWrite(PA5, LOW);
digitalWrite(PA6, LOW);
digitalWrite(PA7, LOW);
digitalWrite(PA8, LOW);
digitalWrite(PA9, LOW);
digitalWrite(PA10, LOW);
// digitalWrite(PA11, LOW);
// digitalWrite(PA12, LOW);
digitalWrite(PA15, LOW);
digitalWrite(PB0, LOW);
digitalWrite(PB1, LOW);
digitalWrite(PB2, LOW);
digitalWrite(PB3, LOW);
digitalWrite(PB4, LOW);
digitalWrite(PB5, LOW);
digitalWrite(PB6, LOW);
digitalWrite(PB7, LOW);
digitalWrite(PB8, LOW);
digitalWrite(PB9, LOW);
digitalWrite(PB10, LOW);
digitalWrite(PB11, LOW);
digitalWrite(PB12, LOW);
digitalWrite(PB13, LOW);
digitalWrite(PB14, LOW);
digitalWrite(PB15, LOW);
delay(1000);
}
数字引脚读取
b3 a12 不能用来做引脚输入
int PIN_Sign = PA15;
int PIN_Alram = PA12;
void setup() {
Serial1.begin(9600);
pinMode(PIN_Sign, INPUT);
pinMode(PIN_Alram, OUTPUT);
digitalWrite(PIN_Alram, LOW);
}
void loop() {
int buttonState = digitalRead(PIN_Sign);
if(buttonState==0)
{
digitalWrite(PIN_Alram, LOW);
}
else
{
digitalWrite(PIN_Alram, HIGH);
}
Serial.println(buttonState);
delay(1);
}
2 PWM控制

PWM引脚简易测试程序,总共有12个PWM引脚,16bit即65536级PWM,很精密了:
延迟给100微妙 多了少了都有问题,不正常转
void setup()
{
pinMode(PB0, PWM);
pinMode(PA7, PWM);
pinMode(PA6, PWM);
pinMode(PA3, PWM);
pinMode(PA2, PWM);
pinMode(PA1, PWM);
pinMode(PA0, PWM);
pinMode(PB7, PWM);
pinMode(PB6, PWM);
pinMode(PA10, PWM);
pinMode(PA9, PWM);
pinMode(PA8, PWM);
}
void loop()
{
for (int i = 1000; i < 65536; i++)
{
//delayMicroseconds(100);
// delay(1);
delay(20);
pwmWrite(PB0, i);
pwmWrite(PA7, i);
pwmWrite(PA6, i);
pwmWrite(PA3, i);
pwmWrite(PA2, i);
pwmWrite(PA1, i);
pwmWrite(PA0, i);
pwmWrite(PB7, i);
pwmWrite(PB6, i);
pwmWrite(PA10, i);
pwmWrite(PA9, i);
pwmWrite(PA8, i);
}
for (int i = 65536; i > 1000; i--)
{
// delayMicroseconds(100);
// delay(1);
delay(20);
pwmWrite(PB0, i);
pwmWrite(PA7, i);
pwmWrite(PA6, i);
pwmWrite(PA3, i);
pwmWrite(PA2, i);
pwmWrite(PA1, i);
pwmWrite(PA0, i);
pwmWrite(PB7, i);
pwmWrite(PB6, i);
pwmWrite(PA10, i);
pwmWrite(PA9, i);
pwmWrite(PA8, i);
}
}
int pins[12] = {0, 1, 2, 3, 6, 7, 8, 9, 10, 16, 22, 23};
void setup()
{
for (int i = 0; i < 12; i++)
{
pinMode(pins[i], PWM);
}
}
void loop()
{
for (int i = 0; i < 100; i++)
{
for (int j = 0; j < 12; j++)
{
pwmWrite(pins[j], i * i);
}
delay(20);
}
}
IO引脚读取
int value = digitalRead(pin);
ADC引脚
实际测试 0-4096 2的10次方

在pa7接一个光敏电阻,完全遮盖4095 手机强光基本几十
void setup()
{
Serial.begin(115200);
pinMode(PB0, INPUT_ANALOG);
pinMode(PA7, INPUT_ANALOG);
pinMode(PA6, INPUT_ANALOG);
pinMode(PA5, INPUT_ANALOG);
pinMode(PA4, INPUT_ANALOG);
pinMode(PA3, INPUT_ANALOG);
pinMode(PA2, INPUT_ANALOG);
pinMode(PA1, INPUT_ANALOG);
pinMode(PA0, INPUT_ANALOG);
pinMode(PB1, INPUT_ANALOG);
}
void loop()
{
delay(50);
Serial.print("\tPB0="); Serial.print(analogRead(PB0));
Serial.print("\tPA7="); Serial.print(analogRead(PA7));
Serial.print("\tPA6="); Serial.print(analogRead(PA6));
Serial.print("\tPA5="); Serial.print(analogRead(PA5));
Serial.print("\tPA4="); Serial.print(analogRead(PA4));
Serial.print("\tPA3="); Serial.print(analogRead(PA3));
Serial.print("\tPA2="); Serial.print(analogRead(PA2));
Serial.print("\tPA1="); Serial.print(analogRead(PA1));
Serial.print("\tPA0="); Serial.print(analogRead(PA0));
Serial.print("\tPB1="); Serial.println(analogRead(PB1));
}
采集光照的代码
int LightValue=4095-analogRead(Light_pin);//最大值4095 黑暗
中断(不靠谱 自己写)
stm32中断函数中不能有 串口输出函数 终端会导致死掉
void onChange()
{
if ( digitalRead(PA8) == LOW )
Serial.println("Key Down");
else
Serial.println("Key UP");
}
void setup()
{
Serial.begin(9600); //打开串口
pinMode( PA8, INPUT);//设置管脚为输入
//Enable中断管脚, 中断服务程序为onChange(), 监视引脚变化
/*
LOW 低电平触发
CHANGE 电平变化,高电平变低电平、低电平变高电平
RISING 上升沿触发
FALLING 下降沿触发
HIGH 高电平触发(该中断模式仅适用于Arduino due)
*/
attachInterrupt( PA8, onChange, CHANGE);
}
void loop()
{
// 模拟长时间运行的进程或复杂的任务。
for (int i = 0; i < 100; i++)
{
// 什么都不做,等待10毫秒
delay(10);
}
}
多中断
change中断不靠谱
int pin_door=PB5;
int pin_RED1=PB4;
int pin_RED2=PA15;
int pin_RED3=PA11;
int state_door=0;
int state_RED1=0;
int state_RED2=0;
int state_RED3=0;
void onChange_door()
{
if ( digitalRead(pin_door) == LOW )
{state_door=1;}
else
{state_door=0;}
}
void onChange_red1()
{
if ( digitalRead(pin_RED1) == LOW )
{state_RED1=1;}
else
{ state_RED1=0;}
}
void onChange_red2()
{
if ( digitalRead(pin_RED2) == LOW )
{state_RED2=1;}
else
{state_RED2=0;}
}
void onChange_red3()
{
if ( digitalRead(pin_RED3) == LOW )
{state_RED3=1;}
else
{state_RED3=0;}
}
void setup() {
Serial1.begin(9600);
pinMode(pin_door, INPUT);
pinMode(pin_RED1, INPUT);
pinMode(pin_RED2, INPUT);
pinMode(pin_RED3, INPUT);
//int buttonState = digitalRead(pin_door);
attachInterrupt( pin_door, onChange_door, CHANGE);
attachInterrupt( pin_RED1, onChange_red1, CHANGE);
attachInterrupt( pin_RED2, onChange_red2, CHANGE);
attachInterrupt( pin_RED3, onChange_red3, CHANGE);
}
void loop() {
String state="门状态:"+String(state_door)+" 车位1:"+String(state_RED1)+" 车位2:"+String(state_RED2)+" 车位3:"+String(state_RED3);
Serial.println(state);
delay(1000);
}
两个红外 检测进出人数
不用中断模式
#include <Adafruit_SSD1306.h>
#include <Adafruit_Sensor.h>
Adafruit_SSD1306 display = Adafruit_SSD1306(128, 64, &Wire);
int pin_RED1=PA0;
int pin_RED2=PA1;
int people_useNum=0;
int state_RED1=0;
int state_RED2=0;
int car_state[2]={0,0};
int car_oldstate[2]={0,0};
void setup(){
Serial.begin(9600);
pinMode(pin_RED1, INPUT);
pinMode(pin_RED2, INPUT);
// SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3C for 128x32
//Serial.println(F("oled allocation failed"));
for (;;)
; // Don't proceed, loop forever
}
display.display();
delay(500); // Pause for 2 seconds
display.setTextSize(1);
display.setTextColor(WHITE);
display.setRotation(0);
}
void loop(){
display.clearDisplay();
display.setCursor(0, 0);
String Lightmsg="People Num:"+String(people_useNum);
display.println(Lightmsg);
display.println("------");
String Lightmsg1="IN_RED1:"+String(state_RED1);
display.println(Lightmsg1);
display.println("------");
String Lightmsg2="OUT_RED2:"+String(state_RED2);
display.println(Lightmsg2);
display.println("------");
state_RED1=!digitalRead(pin_RED1);
state_RED2=!digitalRead(pin_RED2);
car_state[0]=state_RED1;
car_state[1]=state_RED2;
if( car_state[0]==1){
if(car_oldstate[0]==0){
Serial.println("有人进入入口闸机");
car_oldstate[0]=1;
}
else{
Serial.println("人在入口闸机尚未离开");
}
}
else{
if(car_oldstate[0]==0){
Serial.println("入口等待有人进来");
}
else{
Serial.println("人已经离开入口闸机,人数+1");
people_useNum=people_useNum+1;
car_oldstate[0]=0;
}
}
if( car_state[1]==1){
if(car_oldstate[1]==0){
Serial.println("有人进入出口闸机");
car_oldstate[1]=1;
}
else{
Serial.println("人在出口闸机尚未离开");
}
}
else{
if(car_oldstate[1]==0){
//Serial.println("出口闸机等待有人进来");
}
else{
Serial.println("人已经离开出口闸机,人数-1");
people_useNum=people_useNum-1;
if(people_useNum<0){people_useNum=0;}
car_oldstate[1]=0;
}
}
Serial.print("当前人数:");Serial.println(people_useNum);
display.display();
delay(1000);
}
旧状态对比 判断是否离开

/*********************************************************************
stm32 - ssd 128*64 for Oled display ssd1306
SCL-B6
sda-B7
*********************************************************************/
int pin_door=PB5;
int pin_RED1=PB4;
int pin_RED2=PA15;
int pin_RED3=PA11;
int state_door=0;
int state_RED1=0;
int state_RED2=0;
int state_RED3=0;
int car_useNum=0;
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306_STM32.h>
#define OLED_RESET 4 // for Oled display ssd1306
Adafruit_SSD1306 display(OLED_RESET);
void onChange_door()
{
if ( digitalRead(pin_door) == LOW )
{
// state_door=1;
}
else
{
// state_door=0;
}
//delay(1000);
}
void onChange_red1()
{
}
void onChange_red2()
{
}
void onChange_red3()
{
}
void setup() {
Serial1.begin(9600);
pinMode(pin_door, INPUT);
pinMode(pin_RED1, INPUT);
pinMode(pin_RED2, INPUT);
pinMode(pin_RED3, INPUT);
//int buttonState = digitalRead(pin_door);
/*
LOW 低电平触发
CHANGE 电平变化,高电平变低电平、低电平变高电平
RISING 上升沿触发
FALLING 下降沿触发
HIGH 高电平触发(该中断模式仅适用于Arduino due)
*/
attachInterrupt( pin_door, onChange_door, FALLING);
attachInterrupt( pin_RED1, onChange_red1, FALLING);
attachInterrupt( pin_RED2, onChange_red2, FALLING);
attachInterrupt( pin_RED3, onChange_red3, FALLING);
//初始化
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // initialize with the I2C addr 0x3D (for the 128x64)
//刷新
display.display();
//等待刷新结束
delay(2000);
//清空
display.clearDisplay();
}
int car_state[3]={0,0,0};
int car_oldstate[3]={0,0,0};
void loop() {
state_RED1=!digitalRead(pin_RED1);
state_RED2=!digitalRead(pin_RED2);
state_RED3=!digitalRead(pin_RED3);
car_state[0]=state_RED1;
car_state[1]=state_RED2;
car_state[2]=state_RED3;
//获取总数目
car_useNum=0;
for(int i=0;i<3;i++){
if(car_state[i]==1){
car_useNum=car_useNum+1;
}
else if(car_state[i]==0){
}
}
if(digitalRead(pin_door) == LOW){
if(car_useNum>=3){
//Serial.println("车位已满,不给开门");
state_door=0;
}
else{
//Serial.println("车位空缺,允许开门");
state_door=1;
}
}
// String state="占用车位数目:"+String(car_useNum)+" 闸门状态:"+String(state_door)+" 车位1:"+String(state_RED1)+" 车位2:"+String(state_RED2)+" 车位3:"+String(state_RED3);
// Serial.println(state);
//对比当前和上一次的状态
for(int i=0;i<3;i++){
if(car_state[i]==car_oldstate[i])
{ //按键触发
if(car_state[i]==1){
Serial.print(i);Serial.print("车位占用中 ");
}
else{
Serial.print(i);Serial.print("车位空闲中 ");
}
}
else
{
if(car_state[i]==1){
Serial.print(i);Serial.print("车位进入 ");
}
else{
Serial.print(i);Serial.print("车位驶出 ");
}
car_oldstate[i]=car_state[i];
}
}
Serial.println(" ");
//初始化
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
//清空
display.clearDisplay();
display.setTextSize(1);//1设置字体大小
display.setTextColor(WHITE);//2颜色
display.setCursor(0,0);//3位置0列 0行
display.print("Can in:");display.println(state_door);//正文4
display.print("Use num:");display.print(car_useNum);display.print("/");display.println(3);//正文4
display.print("Car1:");display.println(state_RED1);
display.print("Car2:");display.println(state_RED2);
display.print("Car3:");display.println(state_RED3);
display.display();
delay(100);
}
允许的串口
总共3个硬件外接串口Serial1、Serial2、Serial3,一个USB虚拟串口Serial:
void setup()
{
Serial.begin(115200);
Serial1.begin(115200); //TX=PA9,RX=PA10 32的引脚
Serial2.begin(115200); //TX=PA2,RX=PA3
Serial3.begin(115200); //TX=PB10,RX=PB11
}
void loop()
{
delay(100);
Serial.println("Test Serial");
Serial1.println("Test Serial1");
Serial2.println("Test Serial2");
Serial3.println("Test Serial3");
}
多机设备串口通信
https://www.cnblogs.com/gooutlook/p/14747562.html
例程 单串口发送数据和接收
发送体重数据,接收舵机数据
#include <Servo.h>
Servo myservo; // 定义Servo对象来控制
#include "HX711.h"
// HX711 circuit wiring
const int LOADCELL_DOUT_PIN = PB1;
const int LOADCELL_SCK_PIN = PB10;
HX711 scale;
void setup() {
Serial.begin(9600);
myservo.attach(PB0); // 控制线连接数字9
scale.begin(LOADCELL_DOUT_PIN, LOADCELL_SCK_PIN);
scale.set_scale(2280.f); // this value is obtained by calibrating the scale with known weights; see the README for details
scale.tare(); // reset the scale to 0
myservo.write(0);
}
String comdata="0";
void loop() {
float zhongliang=scale.get_units(3);
if (zhongliang<0)zhongliang=0;
String msg=String(zhongliang)+"-";
Serial.println(zhongliang);
if (Serial1.available()){
comdata =Serial1.readStringUntil(';');
//Serial.println(comdata);
int du=comdata.toInt();
if(du>180)du=180;
else if(du<0)du=0;
myservo.write(du);
}
}
综合例程

int pinIn_btn=PA0;//按键
int pinIn_MQ2=PA1;//烟雾
int pinOut_Alram=PB0;//报警器
int pinOut_LedR=PA3;//红灯
int pinOut_LedG=PA4;//绿灯
int pinOut_LedB=PA5;//蓝灯
int pinOut_Motor1=PA6;//电机1
int pinOut_Motor2=PA7;//电机2
#include "DHT.h"
#define DHTPIN PA2 // 温湿度
#define DHTTYPE DHT11 // DHT 11
DHT dht(DHTPIN, DHTTYPE);
bool State_btn=0;
void onChange()
{
State_btn=!State_btn;
if(State_btn){
digitalWrite(pinOut_Alram, LOW);
digitalWrite(pinOut_LedR, LOW);
digitalWrite(pinOut_LedG, LOW);
digitalWrite(pinOut_LedB, LOW);
digitalWrite(pinOut_Motor1, LOW);
digitalWrite(pinOut_Motor2, LOW);
}
else{
digitalWrite(pinOut_Alram, HIGH);
digitalWrite(pinOut_LedR, HIGH);
digitalWrite(pinOut_LedG, HIGH);
digitalWrite(pinOut_LedB, HIGH);
digitalWrite(pinOut_Motor1, HIGH);
digitalWrite(pinOut_Motor2, LOW);
}
}
void setup() {
Serial.begin(9600);
Serial.println("开始运行");
pinMode(pinIn_MQ2, INPUT_ANALOG);//烟雾-模拟数据
pinMode(pinIn_btn, INPUT);//按键-数字数据
attachInterrupt( pinIn_btn, onChange, RISING);//上升沿触发
pinMode(pinOut_Alram, OUTPUT);//蜂鸣器
digitalWrite(pinOut_Alram, LOW);
pinMode(pinOut_LedR, OUTPUT);//灯
pinMode(pinOut_LedG, OUTPUT);//灯
pinMode(pinOut_LedB, OUTPUT);//灯
digitalWrite(pinOut_LedR, LOW);
digitalWrite(pinOut_LedG, LOW);
digitalWrite(pinOut_LedB, LOW);
pinMode(pinOut_Motor1, OUTPUT);//电机1
pinMode(pinOut_Motor2, OUTPUT);//电机2
digitalWrite(pinOut_Motor1, LOW);
digitalWrite(pinOut_Motor2, LOW);
dht.begin();
}
void loop() {
//int State_btn = digitalRead(pinIn_btn);//按键状态
int State_MQ2 = analogRead(pinIn_MQ2);//烟雾数据
int h = int(dht.readHumidity());//湿度
int t = int(dht.readTemperature());//温度
if (isnan(h) || isnan(t)) {
h=60;
t=23;
}
String msg=String("")
+String(State_btn)+" "
+String(State_MQ2)+" "
+String(h)+" "
+String(t)+" "
;
Serial.println(msg);
}

浙公网安备 33010602011771号