平衡車上位機下位機核心程序

平衡車上位機/下位機程序,下位機使用STM32F103C8T6,PID原理,姿態芯片是MPU6050,用了DMP,中斷處理(硬件見博客,中斷飛了根線),即時準確;上位機使用QT寫的安卓APK,調用手機藍牙和平衡車通信;全部是工程文件,下位機用的cube環境,庫是HAL庫,直接可以打開運行,keil_v5和QT,完整程序見平衡車全部程序

下位機主要程序:
void CarParameter_Init(void);
void Xianfu_Pwm(void);
void Set_Pwm(int moto1,int moto2);
void beep();
int balance_UP(float Angle,float Mechanical_balance,float Gyro);
int turn(int encoder_left,int encoder_right,float gyro,uint8_t  flag);
/* USER CODE END PFP */

/* USER CODE BEGIN 0 */
uint32_t counter_1, counter_1_last, counter_2, counter_2_last; 
int16_t speed_left, speed_right; 
uint8_t RxBuffer[4], rx_len, rx_temp[4];
int16_t d_offset_left, d_offset_right;
float pitch,roll,yaw; 								 	
short gyrox,gyroy,gyroz;											 //ÍÓÂÝÒÇԭʼÊý¾Ý
int Moto1=0,Moto2=0;	
int Balance_Pwm,Velocity_Pwm,Turn_Pwm;
float Mechanical_angle=21.2;
uint8_t beep_temp;
void CarParameter_Init(void)
{
CarAngle.Kp = 390;//800
    CarAngle.Kd = 1.0;//10
	CarSpeed.Kp = 100;//100
    CarSpeed.Ki = 0.5;//0.5 
}
/* USER CODE END 0 */
int main(void)
{
  /* USER CODE BEGIN 1 */
  /* USER CODE END 1 */
  /* MCU Configuration----------------------------------------------------------*/
  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();
  /* USER CODE BEGIN Init */
  /* USER CODE END Init */
  /* Configure the system clock */
  SystemClock_Config();
  /* USER CODE BEGIN SysInit */
  /* USER CODE END SysInit */
  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_I2C1_Init();
  MX_TIM1_Init();
  MX_TIM2_Init();
  MX_TIM3_Init();
  MX_TIM4_Init();
  MX_USART2_UART_Init();
  /* USER CODE BEGIN 2 */
  MPU_6050_Init();//if no 6050 ,this will crash this program
mpu_dmp_init();
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
	HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_2);
	HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_3);
	HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_4);
	HAL_TIM_Encoder_Start(&htim2, TIM_CHANNEL_ALL);
	HAL_TIM_Encoder_Start(&htim3, TIM_CHANNEL_ALL);
	__HAL_UART_ENABLE_IT(&huart2,UART_IT_RXNE);//open uart2 RXNE
    __HAL_TIM_SET_COUNTER(&htim2,30000);
	__HAL_TIM_SET_COUNTER(&htim3,30000);
	counter_1_last = 30000;  counter_2_last = 30000; 
	CarParameter_Init();
  /* USER CODE END 2 */
  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
  /* USER CODE END WHILE */
  /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}
void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct;
  RCC_ClkInitTypeDef RCC_ClkInitStruct;
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL2;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }
    /**Initializes the CPU, AHB and APB busses clocks 
    */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              | RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }
    /**Configure the Systick interrupt time 
    */
  HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);
  HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
  /* SysTick_IRQn interrupt configuration */
  HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
}
/* USER CODE BEGIN 4 */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
	  /* Prevent unused argument(s) compilation warning */
	  UNUSED(GPIO_Pin);
	  mpu_dmp_get_data(&pitch,&roll,&yaw);
	  MPU_Get_Gyroscope(&gyrox,&gyroy,&gyroz);
	  counter_1 = __HAL_TIM_GET_COUNTER(&htim2);
	  counter_2 = __HAL_TIM_GET_COUNTER(&htim3);
	  speed_left =  counter_1 - counter_1_last;
	  speed_right = counter_2_last - counter_2;
	  counter_1_last = counter_1;
	  counter_2_last = counter_2;	
	  Balance_Pwm = balance_UP(pitch,Mechanical_angle,gyroy);   
	  Velocity_Pwm = velocity(speed_left,speed_right);       	
	  if(((rx_temp[0] == 0x35) && (rx_temp[1] == 0x36)) || ((rx_temp[0] == 0x36) && (rx_temp[1] == 0x35)))
	  {
			Turn_Pwm =turn(speed_left,speed_right,gyroz,1);        //left
		    beep();
		    HAL_GPIO_WritePin(GPIOB,led_back_Pin|led_right_Pin,GPIO_PIN_SET);
		    HAL_GPIO_WritePin(GPIOB, led_forward_Pin, GPIO_PIN_RESET);
		    HAL_GPIO_WritePin(GPIOC, led_left_Pin, GPIO_PIN_RESET);
	  }
	  else if(((rx_temp[0] == 0x37) && (rx_temp[1] == 0x38)) || ((rx_temp[0] == 0x38) && (rx_temp[1] == 0x37)))
	  {
			Turn_Pwm =turn(speed_left,speed_right,gyroz,2); //right
		    beep();
	HAL_GPIO_WritePin(GPIOB,led_back_Pin|led_right_Pin,GPIO_PIN_RESET);
		  HAL_GPIO_WritePin(GPIOB, led_forward_Pin, GPIO_PIN_SET);
		    HAL_GPIO_WritePin(GPIOC, led_left_Pin, GPIO_PIN_SET);
	  }
	  else if(((rx_temp[0] == 0x39) && (rx_temp[1] == 0x41)) || ((rx_temp[0] == 0x41) && (rx_temp[1] == 0x39)))
	  {
		    HAL_GPIO_TogglePin(GPIOA, PA12_Pin);
			Turn_Pwm =0; //stop
		    beep();
		    HAL_GPIO_WritePin(GPIOB, led_back_Pin|led_right_Pin|led_forward_Pin, GPIO_PIN_RESET);
		    HAL_GPIO_WritePin(GPIOC, led_left_Pin, GPIO_PIN_RESET);
	  }
	  else  Turn_Pwm = 0;
	  Moto1=Balance_Pwm-Velocity_Pwm-Turn_Pwm;                 
	  Moto2=Balance_Pwm-Velocity_Pwm+Turn_Pwm;                 
	  Xianfu_Pwm();  	
	  Set_Pwm(Moto1,Moto2);  
}
void beep()
{
	static uint8_t beep_num, beep_flag;
	if(beep_num ++ < 20)
	  HAL_GPIO_WritePin(GPIOB, BZ_Pin, GPIO_PIN_SET);
	else HAL_GPIO_WritePin(GPIOB, BZ_Pin, GPIO_PIN_RESET), beep_num = 20;
	if(rx_temp[0] != beep_flag)
		beep_num = 0;
	 beep_flag = rx_temp[0];
}
void Xianfu_Pwm(void)
{
    if(Moto1<-7000 ) Moto1=-7000 ;
	if(Moto1>7000 )  Moto1=7000 ;
	if(Moto2<-7000 ) Moto2=-7000 ;
	if(Moto2>7000 )  Moto2=7000 ;
	if(pitch<-5||pitch>45) 			Moto1 = 0,Moto2 = 0;     				
}
void Set_Pwm(int moto1,int moto2)
{
    	if(moto1<0)	     
      __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, 0),
      __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_2, -moto1);
	else 	      
      __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, moto1),
      __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_2, 0);
	   if(moto2<0)	       
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_3, 0),
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_4, -moto2);
	else 	              
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_3, moto2),
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_4, 0);
}
int balance_UP(float Angle,float Mechanical_balance,float Gyro)
{  
         float Bias;
	 int balance;
	 Bias=Angle-Mechanical_balance;    							 
	 balance=CarAngle.Kp*Bias+CarAngle.Kd*Gyro;  
	 return balance;
}
int turn(int encoder_left,int encoder_right,float gyro,uint8_t  flag)
 {
	 static float Turn_Target,Turn,Encoder_temp,Turn_Convert=0.9,Turn_Count;
	 float Turn_Amplitude=20,Kp=10,Kd=0;     //44 20 0
  	if(flag == 1|| flag == 2)                       
	{
			if(++Turn_Count==1)
			{
				Encoder_temp=encoder_left+encoder_right; 
				if(Encoder_temp < 0)	Encoder_temp = -Encoder_temp;	
			}				
			Turn_Convert=35/Encoder_temp;//55
			if(Turn_Convert<0.7)Turn_Convert=0.7;//0.6
			if(Turn_Convert>2.5)Turn_Convert=2.5;//3
	 }	
	else
	{
			Turn_Convert=0.75;
			Turn_Count=0;
			Encoder_temp=0;
	}			
	if(flag == 1)	           Turn_Target += Turn_Convert;
	else if(flag == 2)	     Turn_Target -= Turn_Convert; 
	else Turn_Target = 0;
    if(Turn_Target>Turn_Amplitude)  Turn_Target = Turn_Amplitude * 0.4 ;    
	if(Turn_Target<-Turn_Amplitude) Turn_Target = -Turn_Amplitude * 0.4;
	Turn = -Turn_Target * Kp - gyro * Kd;                 
	return Turn;
}
int velocity(int encoder_left,int encoder_right)
{  
    static float Velocity,Encoder_Least,Encoder,Movement;
	  static float Encoder_Integral;
	  if(((rx_temp[0] == 0x31) && (rx_temp[1] == 0x32)) || ((rx_temp[0] == 0x32) && (rx_temp[1] == 0x31)))
	  {
			Movement = 19;//up
		    beep();
	   HAL_GPIO_WritePin(GPIOB,led_right_Pin|led_forward_Pin,GPIO_PIN_RESET);
		    HAL_GPIO_WritePin(GPIOB, led_back_Pin, GPIO_PIN_SET);
		    HAL_GPIO_WritePin(GPIOC, led_left_Pin, GPIO_PIN_SET);
	  }
		else if(((rx_temp[0] == 0x33) && (rx_temp[1] == 0x34)) || ((rx_temp[0] == 0x34) && (rx_temp[1] == 0x33)))
		{
			Movement = -19;//back
			beep();
			HAL_GPIO_WritePin(GPIOB, led_right_Pin|led_forward_Pin, GPIO_PIN_SET);
		    HAL_GPIO_WritePin(GPIOB, led_back_Pin, GPIO_PIN_RESET);
		    HAL_GPIO_WritePin(GPIOC, led_left_Pin, GPIO_PIN_RESET);
		}
		else if(((rx_temp[0] == 0x39) && (rx_temp[1] == 0x41)) || ((rx_temp[0] == 0x41) && (rx_temp[1] == 0x39)))
			Movement = 0;//stop
		Encoder_Least =(speed_left+speed_right)-0;                    
		Encoder *= 0.8;		                                                    
		Encoder += Encoder_Least*0.2;	                                    
		Encoder_Integral +=Encoder;                                       
		Encoder_Integral=Encoder_Integral-Movement;                       		if(Encoder_Integral>10000)  	Encoder_Integral=10000;             
		if(Encoder_Integral<-10000)		Encoder_Integral=-10000;            
		Velocity=Encoder*CarSpeed.Kp+Encoder_Integral*CarSpeed.Ki;        
	  if(pitch<-5||pitch>45) 			Encoder_Integral=0;     					
	  return Velocity;
}
void USART2_IRQHandler(void)
{
  HAL_UART_IRQHandler(&huart2);
  /* USER CODE BEGIN USART2_IRQn 1 */
  if((__HAL_UART_GET_FLAG(&huart2,UART_FLAG_RXNE)!=RESET))
	{
   rx_temp[rx_len++] = (uint8_t)(huart2.Instance->DR&(uint8_t)0x00FF);
	 __HAL_UART_ENABLE_IT(&huart2,UART_IT_IDLE);  //open IDLE
	}
	else if((__HAL_UART_GET_FLAG(&huart2,UART_FLAG_IDLE)!=RESET))
	{
		__HAL_UART_DISABLE_IT(&huart2,UART_IT_IDLE);   //close IDLE
		if(rx_len == 2)	
		{
			if(((rx_temp[0] == 0x42) && (rx_temp[1] == 0x43)) || ((rx_temp[0] == 0x43) && (rx_temp[1] == 0x42)))
			{
	 HAL_GPIO_TogglePin(GPIOB,led_back_Pin|led_right_Pin|led_forward_Pin|BZ_Pin);
		        HAL_GPIO_TogglePin(GPIOC, led_left_Pin);
			}
		}
    else 
		memset(&rx_temp, 0, sizeof(rx_temp));//clear temp
		rx_len = 0;//again save
	}
  /* USER CODE END USART2_IRQn 1 */
}
/* USER CODE END 4 */
上位機主要程序:
#include "BLE.h"
#include "ui_BLE.h"
#include <QPainter>
#include <QMessageBox>
#include <QTime>
#include <QTimer>
#include <QBrush>
bool BLE_flag::socket_ok = false;
/* 設置藍牙的UUID碼 */
static const QLatin1String serviceUuid("00001101-0000-1000-8000-00805F9B34FB");
/* 全局變量 方便控制端調用藍牙連接成功後的socket發送數據 */
QBluetoothSocket *socket;
BLE::BLE(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::BLE)
{
    ui->setupUi(this);
    ui->listWidget->installEventFilter(this);
    ui->listWidget->setStyleSheet("background-color:transparent");
    ui->pushButton_openBLE->setFlat(true);
    QPalette  palette (this->palette());
    QPixmap pixmap = QPixmap("://image/背景.jpg").scaled(1090,1850);
    //palette.setColor(QPalette::Background, Qt::black);
    palette.setBrush(QPalette::Background, QBrush(pixmap));
    this->setPalette( palette );
    if(false == BLE_flag::socket_ok)
    {
        //定時器檢測是否連接成功
        myTime = new QTimer();
        myTime->setInterval(7000);//7s定時
        connect(myTime,SIGNAL(timeout()),this,SLOT(Confail()));
        discoveryAgent = new QBluetoothDeviceDiscoveryAgent();
        localDevice = new QBluetoothLocalDevice();
        /* 給socket分配內存,限定套接字協議 */
        socket = new QBluetoothSocket(QBluetoothServiceInfo::RfcommProtocol);
        /* 判斷藍牙是否開啓,若開啓則不可被選中並掃描周圍藍牙設備 */
        if( localDevice->hostMode() == QBluetoothLocalDevice::HostPoweredOff )
        {
            ui->pushButton_openBLE->setEnabled(true);
            ui->pushButton_upDateBLE->setEnabled(false);
    //        /* 開始掃描藍牙設備 */
    //        discoveryAgent->start();
        }
        else
        {
            ui->pushButton_openBLE->setEnabled(false);
            ui->pushButton_upDateBLE->setEnabled(true);
            discoveryAgent->start();
        }
        /* 發現設備時會觸發deviceDiscovered信號,轉到槽顯示藍牙設備 */
        connect(discoveryAgent, SIGNAL(deviceDiscovered(QBluetoothDeviceInfo)),
                this, SLOT(addBlueToothDevicesToList(QBluetoothDeviceInfo)));
        connect(discoveryAgent, SIGNAL(finished()), this, SLOT(findFinish()));
        /* 雙擊listwidget的項目,觸發連接藍牙的槽 */
        connect(ui->listWidget, SIGNAL(itemActivated(QListWidgetItem*)),
                this, SLOT(connectBLE(QListWidgetItem*)));
        connect(socket, SIGNAL(connected()), this, SLOT(connectOK()));
        connect(socket, SIGNAL(disconnected()), this, SLOT(connectNot()));
    }
    else {
        ui->pushButton_openBLE->setEnabled(false);
        ui->pushButton_upDateBLE->setEnabled(false);
        ui->pushButton_upDateBLE->setText(tr("已連接"));
    }
}
BLE::~BLE()
{
    delete ui;
}
/* 打開藍牙並查找藍牙設備 */
void BLE::on_pushButton_openBLE_clicked()
{
    localDevice->powerOn();
    ui->pushButton_openBLE->setEnabled(false);
    ui->pushButton_upDateBLE->setEnabled(true);
    /* 開始掃描藍牙設備 */
    discoveryAgent->start();
    Delay_MSec(2000);
    discoveryAgent->start();
}
/* 刷新 重新查找藍牙設備 */
void BLE::on_pushButton_upDateBLE_clicked()
{
    discoveryAgent->start();
    ui->pushButton_upDateBLE->setEnabled(false);
}
/* 返回控制頁面 */
void BLE::on_pushButton_return_clicked()
{
    socket->write(_start.toLatin1());
    this->hide();
    Start *s = new Start();
    s->show();
}
/* 在ListWidget上顯示查找到的藍牙設備 */
void BLE::addBlueToothDevicesToList(const QBluetoothDeviceInfo &info)
{
    QString label = QString("%1 %2").arg(info.address().toString()).arg(info.name());
    QList<QListWidgetItem *> items = ui->listWidget->findItems(label, Qt::MatchExactly);
    if (items.empty()) {
        QListWidgetItem *item = new QListWidgetItem(label);
        QBluetoothLocalDevice::Pairing pairingStatus = localDevice->pairingStatus(info.address());
        /* 藍牙狀態pairingStatus,Pairing枚舉類型 0:Unpaired沒配對 1:Paired配對但沒授權 2:AuthorizedPaired配對且授權 */
        if (pairingStatus == QBluetoothLocalDevice::Paired || pairingStatus == QBluetoothLocalDevice::AuthorizedPaired )
            item->setTextColor(QColor(Qt::green));
        else
            item->setTextColor(QColor(Qt::black));
        ui->listWidget->addItem(item);
    }
}
/* 刷新完成 */
void BLE::findFinish()
{
    ui->pushButton_upDateBLE->setEnabled(true);
}
/* 藍牙連接 */
void BLE::connectBLE(QListWidgetItem *item)
{
    myTime->start();//開始啓動定時器
    QString text = item->text();
    int index = text.indexOf(' ');
    if (index == -1)
        return;
    QBluetoothAddress address(text.left(index));
    QString name(text.mid(index + 1));
//    QMessageBox::information(this,tr("Info"),tr("The device is connecting..."));
    ui->pushButton_openBLE->setText(tr("正在連接•••\n"));
    ui->pushButton_openBLE->setStyleSheet("background-color:transparent");

    socket->connectToService(address, QBluetoothUuid(serviceUuid) ,QIODevice::ReadWrite);
}
/* 連接成功 */
void BLE::connectOK()
{
    discoveryAgent->stop();  //停止搜索設備
//    QMessageBox::information(this, tr("HBU"), tr("<h1><font color=red size=400>連接成功!</font></h1>"));

//    QMessageBox *msgBox = new QMessageBox();
//    QPixmap iconImg("://image/背景.jpg");
//    QIcon icon(iconImg);
//    msgBox->setWindowIcon(icon);
//    msgBox->setText(tr("HBU"));
//    QPushButton *btn_sure = msgBox->addButton("確定", QMessageBox::AcceptRole);
//    msgBox->setStyleSheet("background-color:white");
//    msgBox->exec();
    Delay_MSec(1000);//延時發送指令,緩衝時間
    BLE_flag::socket_ok = true;
    socket->write(_start.toLatin1());
    this->hide();
    Start *s = new Start();
    s->show();
}
/* 連接失敗 */
void BLE::connectNot()
{
    QMessageBox::information(this, tr("錯誤"), tr("<h1><font color=red size=400>連接失敗!</font></h1>"));
}
bool BLE::eventFilter(QObject *watched, QEvent *event)
{
    if(watched == ui->listWidget && event->type() == QEvent::Paint)
    {
        magicTime();
    }
    return QWidget::eventFilter(watched,event);
}
void BLE::magicTime()
{
    QPainter painter(ui->listWidget);
    painter.drawPixmap(0,0,ui->listWidget->width(),ui->listWidget->height(),QPixmap("://image/背景.jpg"));
//    painter.setPen(Qt::gray);
//    painter.setBrush(Qt::green);
//    painter.drawRect(0,0,width(),height());
}
void BLE::paintEvent(QPaintEvent *)
{
  QPainter  painter(this);
//  painter.setPen(Qt::gray);
//  painter.setBrush(Qt::black);
//  painter.drawRect(0,0,width(),height());
painter.drawPixmap(0,0,width(),ui->listWidget->height()+228,QPixmap("://image/背景.jpg"));
}
void BLE::Delay_MSec(unsigned int msec)
{
    QTime _Timer = QTime::currentTime().addMSecs(msec);
    while( QTime::currentTime() < _Timer )
    QCoreApplication::processEvents(QEventLoop::AllEvents, 100);
}
void BLE::Confail()
{
    myTime->stop();//斷開定時器
    ui->pushButton_openBLE->setText(tr("連接失敗"));
    ui->pushButton_openBLE->setStyleSheet("background-color:transparent");
}
#include "Start.h"
#include "ui_Start.h"
#include "Control.h"
#include <QMovie>//創建動畫對象
#include <QTime>
#include <QTimer>
Start::Start(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Start)
{
    ui->setupUi(this);
    //創建動畫
    QMovie *myMovie = new QMovie("://image/自行車撞車.gif");
    //設置動畫
    ui->labelGif->setMovie(myMovie);
    //啓動動畫
    myMovie->start();
    //讓動畫自動適應大小
    ui->labelGif->setScaledContents(true);
    //定時器進行小車啓動
    myTime = new QTimer();
    myTime->setInterval(4000);//10s定時
    connect(myTime,SIGNAL(timeout()),this,SLOT(Start_car()));
    myTime->start();
    //定時滾屏顯示
    pTimer = new QTimer(this);
    connect(pTimer,  SIGNAL(timeout()),  this,  SLOT(scrollCaption()));
    pTimer->start(400);
}
Start::~Start()
{
    delete ui;
}
void Start::Start_car()
{
    myTime->stop();//斷開定時器
    myTime->destroyed();
    pTimer->stop();
    pTimer->destroyed();
    this->hide();
    Control *c = new Control();
    c->show();
}
void Start::scrollCaption()
{
    static int nPos = 0;
    const QString strScrollCation = QString:: fromUtf8("                ...........( ̄▽ ̄)");
    // 當截取的位置比字符串長時,從頭開始
    if (nPos > strScrollCation.length())
        nPos = 0;
    if(nPos < 4)
    {
        ui->label_2->setStyleSheet("color:black");
        ui->label->setStyleSheet("color:black");
    }
    else if(nPos < 8)
    {
         ui->label_2->setStyleSheet("color:red");
         ui->label->setStyleSheet("color:red");
    }
    else if(nPos < 11)
    {
        ui->label_2->setStyleSheet("color:purple");
        ui->label->setStyleSheet("color:purple");
    }
    else
    {
        ui->label_2->setStyleSheet("color:blue");
        ui->label->setStyleSheet("color:blue");
    }
    ui->label_2->setText(strScrollCation.mid(nPos));
    nPos++;
}
#include "Control.h"
#include "ui_Control.h"
#include <QMessageBox>
#include <QPixmap>
/* 外部變量,定義在BLE.cpp裏 藍牙連接成功後的socket */
extern QBluetoothSocket *socket;
Control::Control(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Control)
{
    ui->setupUi(this);
//    ui->pushButton_right->setEnabled(false);
    QPalette  palette (this->palette());
    QPixmap   pixmap = QPixmap("://image/自行車.jpg").scaled(1090,1850);
    //palette.setColor(QPalette::Background, Qt::black);
    palette.setBrush(QPalette::Background, QBrush(pixmap));
    this->setPalette( palette );
    ui->toolButton->setIconSize(QSize(200, 200));
    ui->toolButton->setStyleSheet("border-image:url(://image/ibluetooth.png);");
    ui->toolButton_beep->setIconSize(QSize(200, 200));
    ui->toolButton_beep->setStyleSheet("border-image:url(://image/喇叭.png);");
    ui->toolButton_pause->setIconSize(QSize(250, 150));
    ui->toolButton_pause->setStyleSheet("border-image:url(://image/自行車圖標.jpg);");
    ui->toolButton_foward->setIconSize(QSize(250, 250));
    ui->toolButton_foward->setStyleSheet("border-image:url(://image/上.png);");
    ui->toolButton_back->setIconSize(QSize(250, 250));
    ui->toolButton_back->setStyleSheet("border-image:url(://image/下.png);");
    ui->toolButton_right->setIconSize(QSize(250, 250));
    ui->toolButton_right->setStyleSheet("border-image:url(://image/右.png);");
    ui->toolButton_left->setIconSize(QSize(250, 250));
    ui->toolButton_left->setStyleSheet("border-image:url(://image/左.png);");
    ui->label->setScaledContents(true);
    ui->label->setPixmap(*img1);

}
Control::~Control()
{
    delete ui;
}

//void Control::on_pushButton_right_clicked()
//{
////    ui->pushButton_right->hide();
//    socket->write(_right.toLatin1());
//}
/* 藍牙連接頁面 */
void Control::on_toolButton_clicked()
{
    this->hide();
    BLE *w = new BLE();
    w->show();
}
void Control::on_toolButton_foward_pressed()
{
    ui->label->setPixmap(*img2);
    socket->write(_forward_p.toLatin1());
}
void Control::on_toolButton_foward_released()
{
    ui->label->setPixmap(*img1);
    socket->write(_forward_r.toLatin1());
}
void Control::on_toolButton_back_pressed()
{
    ui->label->setPixmap(*img2);
    socket->write(_back_p.toLatin1());
}
void Control::on_toolButton_back_released()
{
    ui->label->setPixmap(*img1);
    socket->write(_back_r.toLatin1());
}
void Control::on_toolButton_left_pressed()
{
    ui->label->setPixmap(*img2);
    socket->write(_left_p.toLatin1());
}
void Control::on_toolButton_left_released()
{
    ui->label->setPixmap(*img1);
    socket->write(_left_r.toLatin1());
}
void Control::on_toolButton_right_pressed()
{
    ui->label->setPixmap(*img2);
    socket->write(_right_p.toLatin1());
}
void Control::on_toolButton_right_released()
{
    ui->label->setPixmap(*img1);
    socket->write(_right_r.toLatin1());
}
void Control::on_toolButton_pause_pressed()
{
    ui->label->setPixmap(*img2);
    socket->write(_pause_p.toLatin1());
}
void Control::on_toolButton_pause_released()
{
    ui->label->setPixmap(*img1);
    socket->write(_pause_r.toLatin1());
}
void Control::on_toolButton_beep_pressed()
{
    ui->label->setPixmap(*img2);
    socket->write(_beep_p.toLatin1());
}
void Control::on_toolButton_beep_released()
{
    ui->label->setPixmap(*img1);
    socket->write(_beep_r.toLatin1());
}


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章