Arduino Nano相关程序
1.超声波测距
车辆加测距(测距引用的库,缺点测距为整数)
#include <SPI.h> // 加载SPI库 #include <Wire.h> // 加载Wire库 #include <Adafruit_GFX.h> // 加载Adafruit_GFX库3 #include <Adafruit_SSD1306.h> // 加载Adafruit_SSD1306库 #include "String.h" // 定义 OLED屏幕分辨率 #include <DFRobot_URM10.h>//超声波测距 Adafruit_SSD1306 display = Adafruit_SSD1306(128, 64, &Wire); DFRobot_URM10 urm10; int ceju_0=0; int ceju_1=0; void setup() {
pinMode(2,OUTPUT); pinMode(4,OUTPUT); pinMode(6,OUTPUT); pinMode(7,OUTPUT); ///初始化IO,模式为INPUT 输入模式 ///默认电机停止转动,全部设置为低电平 digitalWrite(2,0); digitalWrite(4,LOW); digitalWrite(6,LOW); digitalWrite(7,LOW);
// put your setup code here, to run once:
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.display(); // 使更改的显示生效
}
void loop() {
// put your main code here, to run repeatedly:
ceju_0=(urm10.getDistanceCM(10, 11)); //超声波测距
display.clearDisplay(); // 清空屏幕
xianshi(); //调用显示程序
ceju();
display.display(); // 使更改的显示生效
}
void xianshi(){
display.setCursor(0,0); // 设置开始显示文字的坐标
display.println("ceju");
display.setCursor(50,0); // 设置开始显示文字的坐标
if(ceju_1==1){
display.println("wuxiao");}
if(ceju_1==0){
display.println(ceju_0);}
}
void ceju(){
if(ceju_0<=1100){
ceju_1=0; //当超声波测距小于等于1100时,则ceju_2=0,并执行以下程序
if(ceju_0<=10) {
houtui();Serial.println("后退");}
if(ceju_0>=15) {
qianjin();Serial.println("前进");}
analogWrite(3,map(ceju_0-10,15,1100,100,255));//左轮速运行,map函数映射
analogWrite(5,map(ceju_0-10,15,1100,100,255));//右轮速运行
if(10<ceju_0 and ceju_0<15) {
zhidong();Serial.println("制动");}
}
if(ceju_0>1100){
ceju_1=1;}
}
void qianjin(){
digitalWrite(2,0); //给低电平
digitalWrite(4,1); //给高电平
digitalWrite(6,1);
digitalWrite(7,0);
Serial.println("前进"); // 串口输出
}
void houtui(){
digitalWrite(2,1); //给高电平
digitalWrite(4,0); //给低电平
digitalWrite(6,0);
digitalWrite(7,1);
Serial.println("后退");
}
void zhidong(){
digitalWrite(2,1); //给高电平
digitalWrite(4,1);
digitalWrite(6,1);
digitalWrite(7,1);
Serial.println("制动");
}
2.蓝牙控制
使用蓝牙控制小车
#include <SPI.h> // 加载SPI库
#include <Wire.h> // 加载Wire库
#include <Adafruit_GFX.h> // 加载Adafruit_GFX库3
#include <Adafruit_SSD1306.h> // 加载Adafruit_SSD1306库
#include "String.h"
// 定义 OLED屏幕的分辨率
Adafruit_SSD1306 display = Adafruit_SSD1306(128, 64, &Wire);
String comdata = "";//接收到的字符串
int a=100; //使能1初始脉冲
int a_1=145; //使能2初始脉冲
int c=0;
int x=0;
void setup() {
Serial.begin(9600); // 设置串口波特率
Serial.println("OLED FeatherWing test"); // 串口输出
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // 设置OLED的I2C地址
display.setTextSize(1); // 设置字体大小
display.setTextColor(SSD1306_WHITE); // 设置字体颜色
//初始化各IO,模式为OUTPUT 输出模式
pinMode(2,OUTPUT);
pinMode(4,OUTPUT);
pinMode(6,OUTPUT);
pinMode(7,OUTPUT);
//初始化各IO,模式为INPUT 输入模式
//默认电机停止转动,全部设为低电平
digitalWrite(2,0);
digitalWrite(4,LOW);
digitalWrite(6,LOW);
digitalWrite(7,LOW);
}
void loop() {
// put your main code here, to run repeatedly:
display.clearDisplay(); // 清空屏幕
chuankou();
xianshi();
analogWrite(3,a);//左轮速运行
analogWrite(5,a_1);//右轮速运行
display.display(); // 使更改的显示生效
}
void xianshi(){
display.setCursor(20,0); // 设置开始显示文字的坐标
display.println("xiaoche");
display.setCursor(0,10); // 设置开始显示文字的坐标
display.println("moshi:");
display.setCursor(50,10);
if(x==0) {
display.println("zhidong");} //当x不同值时,OLED打印不同状态
if(x==1) {
display.println("qianjin");}
if(x==2) {
display.println("houtui");}
if(x==3) {
display.println("zuozhuan");}
if(x==4) {
display.println("youzhuan");}
display.setCursor(0,20);
display.println("zuo:");
display.setCursor(30,20);
display.println(String(a));
display.setCursor(64,20);
display.println("you:");
display.setCursor(94,20);
display.println(String(a_1));
display.setCursor(0,30);
display.println("kaiguan:");
display.setCursor(50,30);
if(c==1) {
display.println("ON");}
if(c==0) {
display.println("OFF");}
}
void chuankou(){
while (Serial.available() > 0) // 串口收到字符数大于零
{
comdata += char(Serial.read()); //每次读一个char字符,并相加
delay(2);
}
if (comdata.length() > 0) //当字符串长度大于零时
{
Serial.println(comdata); //打印接收到的字符串
if(comdata=="ON"){
c=1;}
if(comdata=="OFF"){
c=0;}
if(c==1){
if(comdata=="a"){
a=a+5;if(a>255){
a=255;}} //接收到a时,则a+5,当a>255时a=255
if(comdata=="b"){
a=a-5;if(a<0){
a=0;}}
if(comdata=="c"){
a_1=a_1+5;if(a_1>255){
a_1=255;}}
if(comdata=="d"){
a_1=a_1-5;if(a_1<0){
a_1=0;}}
if(comdata=="e"){
zhidong();} //接收到e时,则执行zhidong();
if(comdata=="f"){
qianjin();}
if(comdata=="g"){
houtui();}
if(comdata=="h"){
zuozhuan();}
if(comdata=="r"){
youzhuan();}
}
comdata = ""; //清空字符串
}
}
void qianjin(){
digitalWrite(2,0); //给低电平
digitalWrite(4,1); //给高电平
digitalWrite(6,1);
digitalWrite(7,0);
Serial.println("前进"); // 串口输出
x=1;}
void houtui(){
digitalWrite(2,1); //给高电平
digitalWrite(4,0); //给低电平
digitalWrite(6,0);
digitalWrite(7,1);
Serial.println("后退");
x=2;}
void zuozhuan(){
digitalWrite(2,0);
digitalWrite(4,1); //给低电平
digitalWrite(6,0); //给高电平
digitalWrite(7,0);
Serial.println("左转");
x=3;}
void youzhuan(){
digitalWrite(2,0); //给高电平
digitalWrite(4,0); //给低电平
digitalWrite(6,1);
digitalWrite(7,0);
Serial.println("右转");
x=4;}
void zhidong(){
digitalWrite(2,1); //给高电平
digitalWrite(4,1);
digitalWrite(6,1);
digitalWrite(7,1);
Serial.println("制动");
x=0;}
3.寻迹
int y_1,y_2,y_3,y_4,y_5,y_6;
int i;
int x;
int a=100; //使能1初始脉冲
int a_1=125; //使能2初始脉冲
void setup() {
// put your setup code here, to run once:
Serial.begin(9600); // 设置串口波特率
pinMode(2,OUTPUT);
pinMode(4,OUTPUT);
pinMode(6,OUTPUT);
pinMode(7,OUTPUT);
//初始化各IO,模式为INPUT 输入模式
//默认电机停止转动,全部设为低电平
digitalWrite(2,0);
digitalWrite(4,LOW);
digitalWrite(6,LOW);
digitalWrite(7,LOW);
}
void loop() {
// put your main code here, to run repeatedly:
xunji();
analogWrite(3,a);//左轮速运行
analogWrite(5,a_1);//右轮速运行
}
void xunji(){
y_1=digitalRead(12);//传感器接收到红外信号输出高电平,传感器没有接收到红外信号输出低电平
y_2=digitalRead(13);
if(analogRead(A0)>900)