Arduino
一、模块使用
1.DFPlayer Mini MP3音乐播放模块
接线图,注意*在TX,RX与MP3模块的RX,TX之间连一个1k电阻。因为DFPlayer Mini模块工作电压应该是3.3V,而主控板传入电压为5V,因此需要1K左右电阻分压。*
内存卡文件配置,非常重要!!!!!!!
注意:文件夹命名需要是mp3,放置在SD卡根目录下,而mp3文件命名需要是4位
数字,例如"0001.mp3",放置在mp3文件夹下。 如需中英文命名,可以添加在
数字后,例如"0001hello.mp3"或者"0001后来.mp3"。
例如:
一定是要有延时要不然播放不完整!!!!!!!!
代码块:
代码:
/*!
* MindPlus
* uno
*
*/
#include <DFRobot_PlayerMini.h>
#include <SoftwareSerial.h>
// 创建对象
DFRobot_PlayerMini mp3;
SoftwareSerial softSerialmp3(2, 3);
// 主程序开始
void setup() {
mp3.begin(&softSerialmp3);
mp3.volume(100);
mp3.start();
}
void loop() {
mp3.playMp3Folder(1);
delay(5000);
}
2.舵机
有PWM功能引脚才能用!!!!!!
程序贴在这里了
#include <Servo.h>
#define PIN_SERVO 10
Servo myservo;
void setup()
{
myservo.attach(PIN_SERVO);
}
void loop()
{
myservo.write(0);
delay(1000);
myservo.write(80);
delay(1000);
myservo.write(160);
delay(1000);
myservo.write(80);
delay(1000);
myservo.write(0);
delay(1000);
}
3.L298N
1.无调速功能
但是没有调速功能。小白先实现这个吧。
//LingShun Lab
int input1 = 5; // 定义uno的pin 5 向 input1 输出
int input2 = 6; // 定义uno的pin 6 向 input2 输出
int input3 = 9; // 定义uno的pin 9 向 input3 输出
int input4 = 10; // 定义uno的pin 10 向 input4 输出
void setup() {
// Serial.begin (9600);
//初始化各IO,模式为OUTPUT 输出模式
pinMode(input1,OUTPUT);
pinMode(input2,OUTPUT);
pinMode(input3,OUTPUT);
pinMode(input4,OUTPUT);
}
void loop() {
//forward 向前转
digitalWrite(input1,HIGH); //给高电平
digitalWrite(input2,LOW); //给低电平
digitalWrite(input3,HIGH); //给高电平
digitalWrite(input4,LOW); //给低电平
delay(1000); //延时1秒
//stop 停止
digitalWrite(input1,LOW);
digitalWrite(input2,LOW);
digitalWrite(input3,LOW);
digitalWrite(input4,LOW);
delay(500); //延时0.5秒
//back 向后转
digitalWrite(input1,LOW);
digitalWrite(input2,HIGH);
digitalWrite(input3,LOW);
digitalWrite(input4,HIGH);
delay(1000);
}
2.加上调速功能
void setup() {
Serial.begin(115200);
//初始化各IO,模式为OUTPUT 输出模式
pinMode(2,OUTPUT);
pinMode(3,OUTPUT);
pinMode(4,OUTPUT);
pinMode(5,OUTPUT);
//默认电机停止转动,全部设为低电平
digitalWrite(2,LOW);
digitalWrite(3,LOW);
digitalWrite(4,LOW);
digitalWrite(5,LOW);
analogWrite(9,255);//左轮速运行
analogWrite(10,250);//右轮速运行
}
void loop() {
if (Serial.available() > 0)
{
Serial.println(char(Serial.read()))
if(char(Serial.read())=='a'){a1();}
if(char(Serial.read())=='b'){a2();}
if(char(Serial.read())=='c'){a3();}
if(char(Serial.read())=='d'){a4();}
if(char(Serial.read())=='e'){a5();}
if(char(Serial.read())=='f'){a6();}
if(char(Serial.read())=='g'){a7();}
if(char(Serial.read())=='i'){a8();}
delay(2);
}
//forward 前进
}
viod a1()//左上
{
}
viod a2()
{
}
viod a3()
{
}
viod a4()
{
}
viod a5()
{
}
viod a6()
{
}
viod a7()
{
}
viod a8()
{
}
5.OLED0.96
#include <SPI.h> // 加载SPI库
#include <Wire.h> // 加载Wire库
#include <Adafruit_GFX.h> // 加载Adafruit_GFX库
#include <Adafruit_SSD1306.h> // 加载Adafruit_SSD1306库
// 定义 OLED屏幕的分辨率
Adafruit_SSD1306 display = Adafruit_SSD1306(128, 64, &Wire);
void setup() {
Serial.begin(9600); // 设置串口波特率
Serial.println("OLED FeatherWing test"); // 串口输出
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // 设置OLED的I2C地址
display.clearDisplay(); // 清空屏幕
display.setTextSize(1); // 设置字体大小
display.setTextColor(SSD1306_WHITE); // 设置字体颜色
display.setCursor(0,0); // 设置开始显示文字的坐标
display.println("Hello World!"); // 输出的字符
display.println(" by Lingshunlab.com");
display.display(); // 使更改的显示生效
}
void loop() {
}
6.SYN6288
https://zhuanlan.zhihu.com/p/66314323/
arduino要转字符类型,GB2312
1.先转码
https://www.107000.com/T-Hex/
char Chinese_1[50] = {0xB2,0xBB,0xD4,0xDA,0xB4,0xF2,0xBF,0xA8,0xCA,0xB1,0xBC,0xE4,0xB7,0xB6,0xCE,0xA7,0x00};//不在打卡时间范围
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
delay(1000);
//SYN_FrameInfo(0,Chinese_GB2312);
}
void loop() {
// put your main code here, to run repeatedly:
Serial.println(Chinese_1);
delay(4000);
}
7.SU-03T语音模块(串行通讯)
const byte b1[]={0XAA,0X55,0X01,0X01,0X55,0XAA};
const byte b2[]={0XAA,0X55,0X02,0X02,0X55,0XAA};
const byte b3[]={0XAA,0X55,0X03,0X03,0X55,0XAA};
const byte b4[]={0XAA,0X55,0X04,0X04,0X55,0XAA};
const byte b5[]={0XAA,0X55,0X05,0X05,0X55,0XAA};
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
Serial.write(b1,(sizeof(b1) / sizeof(b1[0])))
}
void loop() {
// put your main code here, to run repeatedly:
}
8.sim800c模块(串行通讯)
void sendMeg()
{
Serial.println("AT");
delay(3000);
Serial.println("AT+CMGF=1");
delay(4000);
Serial.println("AT+CMGS=\"18953474779\"");//这里改成你的号码 \"转义
delay(4000);
Serial.print("fire");//这里写内容
delay(4000);
Serial.write(0x1A);//发送:0x1A,即“CTRL+Z”的键值,用于告诉 Serial,要执行发送操作
//发送: 0x1B,即“ESC”的键值,用于告诉 Serial,取消本次操作,不执行发送。
}
二、函数,库…
1.字符串操作函数(太牛逼了,强烈推荐,给爷好好学!!!!!!!!)
先贴出来原链接:https://www.cnblogs.com/1996jiwei/p/6666818.html
String.h库函数 贴出来两个比较常用的吧!
1.寻找字符串第几个
str.charAT(n)
描述
获取字符串的第n个字符
参数
n :是一个索引,作为下标
2.截取字符串
描述
用来截取字符串中间的某一位置。另外是决定那里结束
用法:
string1.substring(from); //返回 from 之后的
string1.substring(from,to); //返回 from 和 to 之间的
参数:
string1:原本的字符串
from:要截取的字符串从第几个字开始。
to:要截取后面的第几个字
3.实战
#include "String.h"
String a_1,a_2,S;
void setup()
{
Serial.begin(9600);//打开串口,设置波特率9600
a_1 = "hello";
}
void loop()
{
S = a_1.charAt(3); //取对象里面的方法charAt
a_2=a_1.substring(0,3);
Serial.print(a_2);
Serial.println();//输出换行符
delay(200);
}
2、串口接收字符串
String comdata = "";
void setup()
{
Serial.begin(9600);
}
void loop()
{
while (Serial.available() > 0)
{
comdata += char(Serial.read());
delay(2);
}
if (comdata.length() > 0)
{
Serial.println(comdata);
comdata = "";
}
}
2.1接受16进制数
只需要直接int就可以
void setup()
{
Serial.begin(9600);
}
void loop()
{
if (Serial.available() > 0)
{
Serial.println(int(Serial.read()));
delay(2);
}
}
3.软串口冷知识
除HardwareSerial外,Arduino还提供了SoftwareSerial类库,它可以将你的其他数字引脚通过程序模拟成串口通信引脚。
通常我们将Arduino UNO上自带的串口称为硬件串口,而使用SoftwareSerial类库模拟成的串口,称为软件模拟串口(简称软串口)。
在Arduino UNO上,提供了0(RX)、1(TX)一组硬件串口,可与外围串口设备通信,如果要连接更多的串口设备,可以使用软串口。
软串口是由程序模拟实现的,使用方法类似硬件串口,但有一定局限性:在Arduino UNO MEGA上部分引脚不能被作为软串口接收引脚,且软串口接收引脚波特率建议不要超过57600。
#include <SoftwareSerial.h>
//实例化软串口
SoftwareSerial mySerial(2, 3); // RX, TX
void setup()
{
Serial.begin(115200);
while (!Serial) {
}
Serial.println("Goodnight moon!");
mySerial.begin(9600);
mySerial.println("Hello, world?");
}
void loop()
{
if (mySerial.available())
Serial.write(mySerial.read());
if (Serial.available())
mySerial.write(Serial.read());
}
多个软串口怎么用?###很重要
当需要连接多个串口设备时,可以建立多个软串口,但限于软串口的实现原理,Arduino UNO只能同时监听一个软串口,当存在多个软串口设备时,你需要使用listen() 函数指定需要监听的设备。如程序中存在portOne、portTwo两个软串口对象时,你欲监听portOne,便需要使用portOne.listen() 语句,要切换监听port2,便使用portTwo.listen() 语句。
示例程序如下:
/*
Arduino UNO软串口通信
通过listen()切换监听软串口
*/
#include <SoftwareSerial.h>
SoftwareSerial portOne(10, 11);
SoftwareSerial portTwo(8, 9);
void setup() {
Serial.begin(9600);
while (!Serial) {
}
portOne.begin(9600);
portTwo.begin(9600);
}
void loop() {
//监听1号软串口
portOne.listen();
Serial.println("Data from port one:");
while (portOne.available() > 0) {
char inByte = portOne.read();
Serial.write(inByte);
}
Serial.println();
//监听2号软串口
portTwo.listen();
Serial.println("Data from port two:");
while (portTwo.available() > 0) {
char inByte = portTwo.read();
Serial.write(inByte);
}
Serial.println();
}
4.millis()函数
unsigned long previousMillis;
int ledState;
void setup() {
// put your setup code here, to run once:
pinMode(LED_BUILTIN, OUTPUT);
}
void ledBlink( int ledPin, uint32_t period )
{
unsigned long currentMillis = millis(); /* 记录当前时间 */
if ( currentMillis - previousMillis >= period ) /* 检查 "period" ms是否通过 */
{
ledState = digitalRead( ledPin );
previousMillis = currentMillis; /* 保存上次闪烁LED时 */
if ( ledState == LOW ) /* 如果LED关闭,则打开,反之亦然 */
{
ledState = HIGH;
} else {
ledState = LOW;
}
digitalWrite( ledPin, ledState ); /* LED为ledState状态 */
}
}
void loop() {
// put your main code here, to run repeatedly:
ledBlink(LED_BUILTIN,500);
}
/* 利用millis()函数做成闪灯效果的函数 */
4.1
unsigned long previousMillis;
int ledState;
int a=1;
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
pinMode(LED_BUILTIN, OUTPUT);
}
void ledBlink(uint32_t period )
{
unsigned long currentMillis = millis(); /* 记录当前时间 */
if ( currentMillis - previousMillis >= period ) /* 检查 "period" ms是否通过 */
{
a=a*-1;
if (a==1){Serial.println("1");}
if (a==-1){Serial.println("-1");}
previousMillis = currentMillis; /* 保存上次闪烁LED时 */
}
}
void loop() {
// put your main code here, to run repeatedly:
ledBlink(500);
}
5.按键消抖(状态机)
https://blog.csdn.net/hp150119/article/details/114358170
#include <Bounce2.h>
int BUTTON_PIN = 32;//按钮连接的针脚
Bounce2::Button button = Bounce2::Button();//实例化一个抖动对象
int ledState = LOW;
void setup() {
button.attach( BUTTON_PIN, INPUT_PULLUP);
button.interval(5);//间隔是5ms
Serial.begin(9600);//用于串口输出
}
void loop() {
button.update();//更新
if ( button.pressed() ) {
Serial.println("按下了");
}
}
6、10进制转16进制
long decimalToHex_big(long decimal)
{
long hex = 0;
int i = 0;
char temp_buff[20];
sprintf(temp_buff, "%lX", decimal);//换为字符串的16进制
//根据字符串长度一直转换
for( i =0 ; temp_buff[i] != '\0'; i++ )
{
//如果是数字
if( temp_buff[i] >= '0' && temp_buff[i] <= '9' )
{
hex = (hex << 4) | temp_buff[i]-'0';
}
else//如果是字母
{
switch( temp_buff[i] )
{ //先左移再转换
case 'A': hex = (hex << 4) | 0x0A; break;
case 'B': hex = (hex << 4) | 0x0B; break;
case 'C': hex = (hex << 4) | 0x0C; break;
case 'D': hex = (hex << 4) | 0x0D; break;
case 'E': hex = (hex << 4) | 0x0E; break;
case 'F': hex = (hex << 4) | 0x0F; break;
}
}
}
return hex;
}
7、串口接受16进制
if (Serial2.available() > 31)
{
char a = Serial2.read();
byte Buf[31];
Serial2.readBytes(Buf, 31);
distance1 = Buf[5] * 256 + Buf[6];
Serial.print("Distance2:");
Serial.println(distance1);
}
三、ESP8266+BILNKER
1、配置环境
第一:下载arduino:
下载地址:https://www.arduino.cc/en/software
第二步:下载并安装blinker Arduino库
https://diandeng.tech/dev
Windows:将下载好的blinker库解压到
我的电脑>文档>Arduino>libraries 文件夹中
第三步:下载blinker
Android下载:
点击下载
或 在android应用商店搜索“blinker”下载安装
IOS下载:
点击下载
或 在app store中搜索“blinker”下载
第四步:打开后自己注册后登录
2、添加设备
每一个设备在blinker上都有一个唯一的密钥,blinker设备会使用该密钥认证设备身份,从而使用blinker云平台上的相关服务。
进入blinker App,点击“添加设备”,进行设备添加。
选择独立设备,再选择WiFi接入,即可获取一个唯一的密钥。暂存这个密钥,此后程序中会使用到它。
本示例可以将设备端采集的温湿度数据,通过心跳包同步数据的方式,显示到APP上。
通过界面编辑功能,添加两个数据组件,将数据键值分别设为humi和temp,两个组件分别对应温湿度数据。 如图:
这个组件名要记得,是和arduino交互的!
OK,添加完成
3、arduino程序编写以及上传
先更改自己的信息
char auth[] = "Your Device Secret Key";
char ssid[] = "Your WiFi network SSID or name";
char pswd[] = "Your WiFi network WPA password or WEP key";
复制到arduino ide编辑器
#define BLINKER_WIFI
#include <Blinker.h>
char auth[] = "Your Device Secret Key";
char ssid[] = "Your WiFi network SSID or name";
char pswd[] = "Your WiFi network WPA password or WEP key";
BlinkerNumber HUMI("humi");
BlinkerNumber TEMP("temp");
float humi_read = 0, temp_read = 0;
void heartbeat()
{
HUMI.print(humi_read);
TEMP.print(temp_read);
}
void setup()
{
Serial.begin(115200);
BLINKER_DEBUG.stream(Serial);
BLINKER_DEBUG.debugAll();
Blinker.begin(auth, ssid, pswd);
Blinker.attachHeartbeat(heartbeat);
}
void loop()
{
Blinker.run();
humi_read = 54.3;
temp_read = 16.5;
Blinker.delay(2000);
}
OK,完成
4.常用模式
#define BLINKER_WIFI
#define TEXTE_1 "TextKey"
#include <Blinker.h>
char auth[] = "c16512f65b14";
char ssid[] = "ESP8266";
char pswd[] = "12345678";
BlinkerText Text1("TEXTE");
BlinkerText Text2("TEXTE1");
BlinkerText Text3("TEXTE2");
BlinkerText Text4("TEXTE3");
BlinkerText Text5("TEXTE4");
String comdata = "";//声明字符串变量
String aa,bb,cc,dd;
String ee;
int gg=0;
void heartbeat()
{
Text1.print(aa);
Text2.print(bb);
Text3.print(cc);
Text4.print(dd);
Text5.print(ee);
}
void setup()
{
Serial.begin(9600);
BLINKER_DEBUG.stream(Serial);
BLINKER_DEBUG.debugAll();
Blinker.begin(auth, ssid, pswd);
Blinker.attachHeartbeat(heartbeat);
}
void loop()
{
Blinker.run();
while (Serial.available() > 0)
{
comdata+= char(Serial.read());
delay(2);
}
if (comdata.length() > 0)
{
gg=comdata.toInt();
Serial.println(gg);
if(gg==1)
{
aa="已满";
}
if(gg==2)
{
aa="未满";
}
if(gg==3)
{
bb="已满";
}
if(gg==4)
{
bb="未满";
}
if(gg==5)
{
cc="已满";
}
if(gg==6)
{
cc="未满";
}
if(gg==7)
{
dd="已满";
}
if(gg==8)
{
dd="未满";
}
comdata = "";
}
Blinker.delay(500);
}
4.json
/**
* 编写Json字符串
* @author 单片机菜鸟
* @date 2019/06/02
*/
#include <ArduinoJson.h>
void setup() {
Serial.begin(115200);
while (!Serial) continue;
// Json对象对象树的内存工具 静态buffer
// 200 是大小 如果这个Json对象更加复杂,那么就需要根据需要去增加这个值.
StaticJsonDocument<256> doc;
JsonObject root = doc.to<JsonObject>();
root["id"] = "123";
root["version"] = "1.0";
JsonObject weather = root.createNestedObject("params");
JsonObject weather1 = weather.createNestedObject("A_4");
weather1["value"] = 1;
root["method"] = "thing.event.property.post";
serializeJsonPretty(root, Serial);
}
void loop() {
// not used in this example
}
//MN Maker
//Laser Temp Gun
//10.6.19
#include <Wire.h>
#include <Adafruit_MLX90614.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
const int Laser_Pin=5; //Laser Pin
int buttonState = 0;
const int buttonPin = 2; // the number of the pushbutton pin
// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
Adafruit_MLX90614 mlx = Adafruit_MLX90614();
void setup() {
Serial.begin(9600);
Serial.println("Adafruit MLX90614 test");
pinMode(Laser_Pin,OUTPUT);
pinMode(buttonPin, INPUT);
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3D for 128x64
Serial.println(F("SSD1306 allocation failed"));
for(;;);
}
display.clearDisplay();
display.setRotation(2);
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0, 35);
display.println("Initializing Temp");
display.display();
delay(250);
display.clearDisplay();
mlx.begin();
}
void loop() {
buttonState = digitalRead(buttonPin);
Serial.println(buttonState);
Serial.print("Ambient = "); Serial.print(mlx.readAmbientTempC());
Serial.print("*C\tObject = "); Serial.print(mlx.readObjectTempC()); Serial.println("*C");
Serial.print("Ambient = "); Serial.print(mlx.readAmbientTempF());
Serial.print("*F\tObject = "); Serial.print(mlx.readObjectTempF()); Serial.println("*F");
// check if the pushbutton is pressed. If it is, the buttonState is HIGH:
if (buttonState == HIGH) {
// turn LED on:
digitalWrite(Laser_Pin, HIGH);
display.clearDisplay();
display.setTextSize(2); //Size 2 means each pixel is 12 width and 16 high
display.setCursor(25, 10);
display.print(mlx.readObjectTempC());
display.setCursor(95, 10);
display.print("C");
display.setTextSize(2);
display.setCursor(25, 36);
display.print(mlx.readObjectTempF());
display.setCursor(95, 36);
display.print("F");
display.display();
} else {
// turn LED off:
digitalWrite(Laser_Pin, LOW);
display.clearDisplay();
display.setTextSize(2); //Size 2 means each pixel is 12 width and 16 high
display.setCursor(35, 10);
display.print("-----");
display.setCursor(105, 10);
display.print("");
display.setTextSize(2);
display.setCursor(35, 36);
display.print("-----");
display.setCursor(105, 36);
display.print("");
display.display();
}
Serial.println();
delay(500);
}
1.UDP接收字符并解析
void UDP(){
//**********解析Udp数据包
int packetSize = Udp.parsePacket();
if (packetSize)
{
// 收到Udp数据包
//Serial.printf("Received %d bytes from %s, port %d\n", packetSize, Udp.remoteIP().toString().c_str(), Udp.remotePort());
// 读取Udp数据包
int len = Udp.read(incomingPacket, 255);
if (len > 0)
{
incomingPacket[len] = 0;
}
//向串口调试器打印信息
Serial.printf("UDP packet contents: %s\n", incomingPacket);
String q_1=incomingPacket;
if(incomingPacket[0]=='A'){Serial.println("1");shuiwei_max=q_1.substring(1).toInt(); //返回 from 之后的}
if(incomingPacket[0]=='B'){Serial.println("2");}
if(incomingPacket[0]=='C'){Serial.println("3");}
if(incomingPacket[0]=='D'){Serial.println("4");}
if(incomingPacket[0]=='E'){Serial.println("5");}
if(incomingPacket[0]=='F'){Serial.println("6");}//灯关
if(incomingPacket[0]=='G'){Serial.println("7");}//灯
//往udp 远端发送应答信息
}
}