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 }