• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
MKT-porter
博客园    首页    新随笔    联系   管理    订阅  订阅
(8)STM32开发例程 oled显示屏和舵机板
 
 
 
 

 

 

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
      
}

  

 

posted on 2023-03-05 23:32  MKT-porter  阅读(167)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3