https://www.youtube.com/watch?v=ImctYI8hgq4






不收串口干扰 串口接收数据显示
1-2-5;
#include <Arduino.h>
#include <U8g2lib.h>
#ifdef U8X8_HAVE_HW_SPI
#include <SPI.h>
#endif
#ifdef U8X8_HAVE_HW_I2C
#include <Wire.h>
#endif
U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0, /* clock=*/ PB6, /* data=*/ PB7, /* reset=*/ U8X8_PIN_NONE);
//============解析函数=================
//分割结果
#define sleng 11 //数组大小 比实际多一个
String split_result[sleng];//手动动态调整数组大小,保证数组可以满足容量
/*字符串分割
输入参数
String zifuchuan, 输入字符串
String fengefu, 分隔符号-可以是多个
String result[] 输出结果
*/
void Split(String zifuchuan,String fengefu,String result[])
{
int weizhi; //找查的位置
String temps;//临时字符串
int i=0;
do
{
weizhi = zifuchuan.indexOf(fengefu);//找到位置
if(weizhi != -1)//如果位置不为空
{
temps=zifuchuan.substring(0,weizhi);//打印取第一个字符
zifuchuan = zifuchuan.substring(weizhi+fengefu.length(), zifuchuan.length());
//分隔后只取后面一段内容 以方便后面找查
}
else
{ //上面实在找不到了就把最后的 一个分割值赋值出来以免遗漏
if(zifuchuan.length() > 0)
temps=zifuchuan;
}
result[i++]=temps;
//Serial.println(result[i-1]);//在这里执行分割出来的字符下面不然又清空了
temps="";
}
while(weizhi >=0);
}
//char send_char[20]="0";
String str_msg1="0";
String str_msg2="0";
String str_msg3="0";
void u8g2_sendStrint(int x,int y,String &msg){
int c_length=msg.length();
if(c_length==0)c_length=20;
char send_char[c_length];
//char send_char[20]="0";
strcpy(send_char, msg.c_str());
u8g2.drawStr(x,y,send_char); // 绘制字符串
}
void setup(void) {
Serial1.begin(9600); //TX=PA9,RX=PA10 32的引脚
u8g2.begin(); //oled初始化
}
void loop(void) {
if (Serial1.available()){
//1 =========从串口获取命令 ;结尾 例子: sensor-on;
String split_input =Serial1.readStringUntil(';');
//Serial1.print("Recive_esp: ");Serial1.println(split_input);
//2 ========解析命令
//2-0解析数据 sensor-on
Split(split_input,"-",split_result);//分割调用
//2-1打印消息 0-sensor 1-on
for(int i=0;i<sleng;i++)
{
if(split_result[i]!="")
{
Serial.println(String(i)+"-"+split_result[i]);
}
else{
split_result[i]="0";
}
}
str_msg1=split_result[0];//
str_msg2=split_result[1];//
str_msg3=split_result[2];//
}
u8g2.clearBuffer(); // 清除oled缓存
u8g2.setFont(u8g2_font_ncenB08_tr); // 设置字体
u8g2.drawStr(0,10,"Agree:"); // 绘制字符串
u8g2_sendStrint(0,20,str_msg1);
u8g2.drawStr(0,30,"Against:"); // 绘制字符串
u8g2_sendStrint(0,40,str_msg2);
u8g2.drawStr(0,50,"Abstention:"); // 绘制字符串
u8g2_sendStrint(0,60,str_msg3);
u8g2.sendBuffer(); // 显示
delay(10); //延时1000 ms
}
液晶屏和舵机驱动同时iic

//--------------------舵机初始化开始-----------------
#include <Wire.h>
#include <Arduino.h>
#include <U8g2lib.h>
U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0, /* clock=*/ PB8, /* data=*/ PB9, /* reset=*/ U8X8_PIN_NONE);
int i=0;
void u8g2_sendStrint(int x,int y,String &msg){
int c_length=msg.length();
if(c_length==0)c_length=20;
char send_char[c_length];
//char send_char[20]="0";
strcpy(send_char, msg.c_str());
u8g2.drawStr(x,y,send_char); // 绘制字符串
}
#include <Adafruit_PWMServoDriver.h>
// called this way, it uses the default address 0x40
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();
//根据您的伺服品牌,最小和最大脉冲宽度可能会有所不同 调整它
//底部舵机-0号口-水平旋转
#define SERVOMIN1 150 //150 // 对应0度
#define SERVOMAX1 600 //150 // 对应180度
//底部舵机-1号口-俯仰旋转
#define SERVOMIN2 150//150 // 对应0度
#define SERVOMAX2 600//600 // 对应180度
#define SERVO_FREQ 50 // Analog servos run at ~50 Hz updates
int curent_d1=90;
int curent_d2=90;
void servo_int()
{
pwm.begin();
//理论上内部振荡器是25MHz,但实际上不是非常精确。你可以调整这个数字直到
//你得到了你期望的频率!
pwm.setOscillatorFrequency(27000000); // The int.osc. is closer to 27MHz
pwm.setPWMFreq(SERVO_FREQ); // Analog servos run at ~50 Hz updates
pwm.setPWM(0, 0, int((SERVOMAX1+SERVOMIN1)/2));// 初始化90度
delay(50);
pwm.setPWM(1, 0, int((SERVOMAX2+SERVOMIN2)/2));//初始化90度
delay(50);
}
//控制引脚号servonum的舵机
// 0-180 dushu/180*(SERVOMAX-SERVOMIN)
//pwm.setPWM(servonum, 0, pulselen);
//--------------------舵机初始化结束-----------------
String comdata = "";
/*
分割字符串-获取数据类型+数据
数据格式: 名字-数据(混合数据);(分号结尾)
普通灯 开 NomLED-on; 关 NomLED-off;
1个舵机 开 DuoJi-90;(数据范围0-180)
控制个舵机
模式1 直接过去 开 DuoJiMore-90-90;(数据范围0-180)
模式2 每一度循环过去 DuoJifor-90-90;
*/
int speeed=20;
void Fenge(String str){
int index = str.indexOf('-');
String sensor_class=str.substring(0, index);
Serial.println(sensor_class);
String sensor_data=str.substring(index + 1, str.length());
Serial.println(sensor_data);
// DuoJiMore-90-90-; DuoJiMore-0-0-;
if(sensor_class=="DuoJiMore"){
if (sensor_data){
int nindex = sensor_data.indexOf('-');
String data1=sensor_data.substring(0, nindex);
sensor_data=sensor_data.substring(nindex + 1, sensor_data.length());
nindex = sensor_data.indexOf('-');
String data2=sensor_data.substring(0, nindex);
//String data3=sensor_data.substring(nindex + 1, sensor_data.length());
//Serial.println(data1.toInt());
//Serial.println(data2.toInt());
//Serial.println(data3.toInt());
int s1=int(float(data1.toInt())/180.0*float(SERVOMAX1-SERVOMIN1))+SERVOMIN1;
int s2=int(float(data2.toInt())/180.0*float(SERVOMAX2-SERVOMIN2))+SERVOMIN2;
//int s3=int(data3.toInt()/180*(SERVOMAX-SERVOMIN));
Serial.println(s1);
Serial.println(s2);
pwm.setPWM(0, 0, s1);
delay(50);
pwm.setPWM(1, 0, s2);
delay(50);
}
}
}
String msg="11";
void setup() {
Serial.begin(9600);
while(Serial.read()>= 0){} //clear serialbuffer
servo_int();//舵级初始化
u8g2.begin();// 屏幕初始化
}
void loop() {
if(Serial.available()>0){
//delay(1);
comdata = Serial.readStringUntil(';');
//Serial.println(comdata);
Fenge(comdata);
}
comdata = "";
i=i+10;
if(i>=180)i=0;
comdata="DuoJiMore-"+String(i)+"-"+String(i)+"-;";
Fenge(comdata);
msg="i: "+String(i);
u8g2.clearBuffer(); // 清除oled缓存
u8g2.setFont(u8g2_font_ncenB08_tr); // 设置字体
u8g2.drawStr(0,10,"Hello World!"); // 绘制字符串
u8g2_sendStrint(0,30,msg); // 绘制字符串
u8g2.sendBuffer(); // 显示
delay(1000); //延时1000 ms
}
浙公网安备 33010602011771号