製作arduino機器人

硬件

arduino主控板
舵機 *6
蜂鳴器
RGB三色LED模塊
2位全綵RGB
溫度傳感器
光線傳感器
按鍵 *4
紅外接收模塊
紅外遙控器
電機 *2

環境

arduino IDE

構思

  1. 紅外遙控功能
    —— 1 小夜燈
    —— 2 鬧鐘
    —— 3 照明檢測
    —— 4 溫度檢測
    —— 5 遙控編舞
  2. 頭部按鍵功能
    —— 1 眼睛切換
    —— 2 扭腰動作
    —— 3 伸展運動
    —— 4 1分鐘beat it舞蹈

一、陪伴小夜燈
首先選擇小夜燈模式,遙控器按下1,接下來我們通過←鍵或→鍵是切換機器人胸口的全綵RGB燈光,↑鍵或↓鍵是調節燈光亮度,按下0鍵後退出當前模式,回到五個功能的菜單選擇。

二、定時鬧鐘
遙控器按下2鍵,進入定時鬧鐘模式,先按下★鍵,接着按下數字鍵(09)來選擇需要定時多少小時,確定時鐘時間後,按下OK鍵確認,接着通過按下#鍵後,選擇數字鍵(09)設置定時的分鐘,確定分鐘的時間後,按下OK鍵確認,時鐘和分鐘均確認後,再次按下OK鍵確認後,機器人開始計時。如果只需要計時分鐘,只需設置分鐘部分便可,退出當前模式則按下0鍵,回到五個功能的菜單選擇。

三、室溫檢測
遙控器按下3鍵,機器人進入室溫檢測模式,當溫度大於25℃,小於30℃爲正常狀態,胸口指示燈光爲紫色,當溫度大於30℃爲悶熱狀態,胸口指示燈光爲紅色,當溫度小於25℃爲涼爽狀態,胸口指示燈光爲藍色。退出當前模式則按下0鍵,回到五個功能的菜單選擇。

四、照明檢測
遙控器按下4鍵,機器人進入照明檢測模式,當光線較亮是,機器人眼睛爲紅色,當光線適度時,機器人眼睛爲紅綠色,當光線較弱時,機器人眼睛爲綠色。退出當前模式則按下0鍵,回到五個功能的菜單選擇。

五、遙控編舞
遙控器按下5鍵,機器人進入遙控編舞模式,每次選擇動作前,需先按下★鍵,接着通過數字鍵(16)選擇動作,動作選擇完成後,通過數字鍵(19)選擇執行次數時,需先按下#鍵,當動作與執行次數均確定後,按下OK鍵確認,機器人開始表演舞蹈。退出當前模式則按下0鍵,回到五個功能的菜單選擇。

注意:
1.機器人收到遙控信號時,眼睛將會紅光閃爍,如按下後眼睛未閃爍,請重新遙控控制。
2.0鍵均爲退出當前模式

程序在這裏插入圖片描述

電路

傳感器 機器人
18b20溫度 A2
紅外遙控接收 D2
光敏 A1
胸口RGB D13
蜂鳴器 D8
眼睛RGB D7、D9、D10
頭部那件 D4、D5、D6、D7
電機 D3、A3、D11、D12

在這裏插入圖片描述

程序

#include <IRremote.h>//紅外
#include <IRremoteInt.h>

#include "Timer.h"        //計時器頭文件
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS A2 //溫度 使用A2端口

Timer t;                //計時器對象
int buzzer_pin=8;     //蜂鳴器的pin
boolean buzzer_state=true;       //蜂鳴器狀態
boolean hours_state=false;      //小時設置
boolean minutes_state=false;   //分鐘設置
long hours=0;   //默認0小時
long minutes=600000; //默認十分鐘
long Ttime;    //定時總時間
int a=1;  //count方法傳入個數

#include <Adafruit_NeoPixel.h>//RGB
#define PIN 13
#define MAX_LED 9
//#define add_length sizeof(key_add)/sizeof(key_add[0])+1
Adafruit_NeoPixel strip = Adafruit_NeoPixel( MAX_LED, PIN, NEO_RGB + NEO_KHZ800 );

int key_add[100] ;
int init_light=100;//初始亮度
int init_color = 0;//初始顏色
uint32_t color_green = strip.Color(255,0,0); 
uint32_t color_red = strip.Color(0,255,0); 
uint32_t color_blue = strip.Color(0,0,255); 
uint32_t color_yellow = strip.Color(255,255,0); 
uint32_t color_white = strip.Color(255,255,255); 
uint32_t color[] = {color_red,color_green,color_blue,color_yellow,color_white};
int length = sizeof(color)/sizeof(color[0])-1;//顏色數組長度
int add_length=0;

int RECV_PIN = 2;
int GM=A1;
int WD=A2;
bool flag;
bool flag_n=true;
int gm;
float wd;
int key;
int second;

int label;
int _add_;
int next;
bool flag_add=false;
bool flag_next=false;
int _ok;
int w=0;
IRrecv irrecv(RECV_PIN);//紅外
OneWire oneWire(ONE_WIRE_BUS);//溫度
DallasTemperature sensors(&oneWire);//溫度
decode_results results;

/*****************語音動作相應********************************/
int yu_ying[6];
int i=0;
int j=0;
bool flag_sing=false;                  //唱歌類       0X02
bool flag_awaken=false;                //喚醒語句     0X01
bool flag_dialogue=false;              //對話類       0X03
bool flag_common_sense =false;         //常識類       0X04    
bool flag_English=false;               //英語類       0X05
bool flag_arithmetic=false;            //算術類       0X06
bool flag_weather=false;               //天氣類       0X07
bool flag_qita=false;                  //其他類       0X08
//+++++++++++電機++++++++++++++++++++++++++++++++++
#define forward 1
#define backoff 2
#define leftturn 3
#define rightturn 4
#define M1 3
#define M2 11


/****************頭部按鍵**************************************/
int RedPin = 9; //select the pin for the red LED
int BluePin =7; // select the pin for the  blue LED
int GreenPin =10;// select the pin for the green LED

int stand_ang[6] = { 512,512,512,512,894,130 };//894=512+382  130=512-382

float stand_ang_[6] = { 512,512,512,512,894,130 };//894=512+382  130=512-382
int head_key=0;

int zuohuishou[3][6] ={ 
{ 512,512,512,512,894,130 },//初始
{512,512,512,512,130,130},//舉起左手
{512,512,512,512,360,130},//揮動左手
};

int niuyao_buf[2][6] = 
{
  {347,606,794,534,449,560},
  {441,703,477,208,448,559}
};

int ceyatui_bufs[6][6] = 
{
{388,574,737,528,681,225},

{344,620,826,528,630,300},
{425,540,668,529,300,720},//you

{468,641,484,328,713,389},

{384,689,496,216,630,450},
{485,593,484,370,300,720}

};

int dancefs[25][6]={
{512,512,512,512,272,130},    //0
{412,512,512,512,272,130},    //1

{512,512,512,512,894,752},    //2
{512,612,512,512,894,752},    //3

{443,512,588,512,894,720},    //左Post4
{394,512,588,512,894,720},    //左Post踮腳5

{512,581,512,436,304,130},    //右Post6
{512,630,512,436,304,130},    //右Post踮腳7

{512,512,512,512,120,130},    //舉左手8
{512,512,512,512,894,904},    //舉右手9

{512,581,512,436,304,130},    //10
{512,630,512,436,204,130},    //11

{443,512,588,512,894,720},    //左Post12
{394,512,588,512,894,820},    //13

{512,512,512,512,612,612},    //舉左手14
{512,512,512,512,412,412},    //舉右手15

{470,485,546,546,512,512},    //舉左手16
{550,560,478,478,512,512},    //舉右手17

{474,550,533,491,226,780},    //18
{512,512,512,512,800,224},    //19

{512,512,512,512,612,412},    //20
{412,612,512,512,794,230},    //21

{512,512,512,512,512,512},

{512,512,512,512,420,430},    //舉左手
{512,512,512,512,594,604},    //舉右手
};

int dancef[11][6]={
{512,512,512,512,512,130},    //
{412,512,512,512,512,130},    //

{512,512,512,512,894,512},    //
{512,612,512,512,894,512},    //

{512,512,512,512,312,712},    //
{412,612,512,512,612,412},    //

{390,558,635,509,512,512},    //
{466,634,515,389,512,512},    //

{512,662,526,506,894,894},    //
{362,512,518,498,130,130},    //

{512,512,800,224,312,712},    //
};

void one(){//飛翔姿勢,踮腳雙揮手
  eyeRGB(0,0,0);
  weifen(dancef[5],dancef[4],20,10);
  eyeRGB(255,0,0);
  weifen(dancef[4],dancef[5],20,10);
}

void two(){//左踮腳舉高左手
  eyeRGB(0,0,0);
  weifen(dancefs[0],dancefs[1],20,10);
  eyeRGB(0,255,0);
  weifen(dancefs[1],dancefs[0],20,10);
}

void three(){//右踮腳舉高右手
   eyeRGB(0,0,0);
   weifen(dancefs[2],dancefs[3],20,10);
   eyeRGB(0,0,255);
   weifen(dancefs[3],dancefs[2],20,10);
}

void four(){//左踮腳舉平左手
   eyeRGB(0,0,0);
   weifen(dancef[0],dancef[1],20,10);
   eyeRGB(255,255,0);
   weifen(dancef[1],dancef[0],20,10);
}

void five(){//左踮腳舉平右手
  eyeRGB(0,0,0);
  weifen(dancef[2],dancef[3],20,10);
  eyeRGB(255,0,255);
  weifen(dancef[3],dancef[2],20,10);
}

void six(){//舉手
    eyeRGB(0,0,0);
    weifen(dancefs[8],dancefs[9],20,20);
    eyeRGB(0,255,255);
    weifen(dancefs[9],dancefs[8],20,20);
}

void seven(){//左Post踮腳
    eyeRGB(0,0,0);
    weifen(dancefs[4],dancefs[5],10,10);
    eyeRGB(60,60,60);
    weifen(dancefs[5],dancefs[4],10,10);
}

void eight(){//右Post踮腳
    eyeRGB(0,0,0);
    weifen(dancefs[6],dancefs[7],10,10);
    eyeRGB(0,255,255);
    weifen(dancefs[7],dancefs[6],10,10);
}

void nine1(){//測壓腿
    weifen(ceyatui_bufs[5],ceyatui_bufs[4],10,10);
    weifen(ceyatui_bufs[4],ceyatui_bufs[5],10,10);
}

void nine2(){//測壓腿
    weifen(ceyatui_bufs[2],ceyatui_bufs[1],10,10);
    weifen(ceyatui_bufs[1],ceyatui_bufs[2],10,10);
}

void ten(){//扭腰
    weifen(niuyao_buf[0],niuyao_buf[1],20,10);
    weifen(niuyao_buf[1],niuyao_buf[0],20,10);
}

void eleven(){
  weifen(dancefs[18],dancefs[19],10,30);
  weifen(dancefs[19],dancefs[18],10,30);
}

void twelve(){
  weifen(dancefs[20],dancefs[21],10,30);
  weifen(dancefs[21],dancefs[20],10,30);
}

void thirteen(){
  weifen(dancefs[24],dancefs[23],30,30);
  delay(300);
  weifen(dancefs[23],dancefs[24],30,30);
}

void lefr_wave_0(){
  _send(stand_ang_);
  delay(500);
  weifen(stand_ang,zuohuishou[1],30,40);
  for(int i=0;i<3;i++)
  { 
    weifen(zuohuishou[1],zuohuishou[2],20,20);
    weifen(zuohuishou[2],zuohuishou[1],20,20);
  }
  weifen(zuohuishou[1],stand_ang,50,20);
  delay(200);
}

void eyeRGB(int r,int g,int b){//RGB燈光
  analogWrite(RedPin, 255-r);
  analogWrite(GreenPin, 255-g);
  analogWrite(BluePin, 255-b);
}

bool headkey(int x){//頭部按鍵
 switch(x){
    case 1:
      pinMode(6,INPUT_PULLUP);
      if(digitalRead(6)==LOW)
      return true;
      else
      return false;
      break;
    case 2:
      pinMode(4,INPUT_PULLUP);
      if(digitalRead(4)==LOW)
      return true;
      else
      return false;
      break;
    case 3:
      pinMode(5,INPUT_PULLUP);
      if(digitalRead(5)==LOW)
      return true;
      else
      return false;
      break;
    case 4:
      pinMode(A0,INPUT_PULLUP);
      if(digitalRead(A0)==LOW)
      return true;
      else
      return false;
      break;  
    default:
      return false;
  } 
  
}


void beat_it(){//舞蹈 1 minute
   for(int i=0;i<3;i++)
  one();
  for(int i=0;i<3;i++)
  two();
  for(int i=0;i<3;i++)
  three();
  weifen(dancefs[2],stand_ang,20,10);
  delay(500);
  for(int i=0;i<3;i++)
  four();
  for(int i=0;i<3;i++)
  five();
  weifen(dancef[2],stand_ang,20,10);
  delay(40);
  for(int i=0;i<3;i++)
  six();
  for(int i=0;i<5;i++)
  seven();
  six();
  weifen(dancefs[9],stand_ang,10,10);
  delay(500);
  for(int i=0;i<5;i++)
  eight();
  delay(500);
  for(int i=0;i<5;i++)
  nine1();
  delay(500); 
  for(int i=0;i<5;i++)
  nine2();
  delay(500);  
  for(int i=0;i<3;i++)
  ten();
  for(int i=0;i<2;i++)  //
  eleven();
  delay(500);
  for(int i=0;i<5;i++)  //
  twelve();
  delay(1000);
  thirteen();
  weifen(dancefs[24],dancefs[22],30,30);
  lefr_wave_0();
}





 
void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn(); //初始化紅外遙控
  strip.begin(); 
  pinMode(GM,INPUT);
  pinMode(buzzer_pin,OUTPUT);   //設置蜂鳴器的pin爲輸出模式
//  pinMode(9,OUTPUT);
//  pinMode(10,OUTPUT);
  sensors.begin();
  for(int i=0;i<3;i++)
  Initialize();
  //clean_eye();
  pinMode(RedPin, OUTPUT); //端口設置成輸出
  pinMode(BluePin, OUTPUT);
  pinMode(GreenPin, OUTPUT);
  eyeRGB(0,0,255);//初始化燈光 藍眼睛
  //蜂鳴器響一下
  for(int i=0;i<200;i++){
    digitalWrite(buzzer_pin,HIGH);
    delay(2);
    digitalWrite(buzzer_pin,LOW);
    delay(2);
  }
  
  pinMode(A0, INPUT_PULLUP);
  pinMode(4, INPUT_PULLUP);
  pinMode(5, INPUT_PULLUP);
  pinMode(6, INPUT_PULLUP);
  pinMode(M1,OUTPUT);
  pinMode(M2,OUTPUT);
  pinMode(A3,OUTPUT);
  pinMode(12,OUTPUT);
}

void loop() {
  t.update();         //必須在loop中調用,它會服務於計時器相關的事件
 // guangmi();
  //wendu();
  //Night_light();
   work();
   work2();
   work3();
}

void work3(){
    Serial.begin(9600);
  delay(200);
  if(Serial.available()>0){
    yu_ying[i]=Serial.read(); 
    Serial.println(yu_ying[i],HEX);
   if(yu_ying[0]==0xFF){
      i++;
    }
  } else if(yu_ying[0]==0xFF&&yu_ying[1]==0xFF&&yu_ying[2]==0x02&&yu_ying[3]==0x02&&yu_ying[4]==0x02)//唱歌類
  {
     flag_sing=true;
  }
  else if(yu_ying[0]==0xFF&&yu_ying[1]==0xFF&&yu_ying[2]==0x02&&yu_ying[3]==0x02&&yu_ying[4]==0x01)//喚醒語句
  {
     flag_awaken=true;
     flag_sing=false;
  }
   else if(yu_ying[0]==0xFF&&yu_ying[1]==0xFF&&yu_ying[2]==0x02&&yu_ying[3]==0x02&&yu_ying[4]==0x03)//對話類
  {
     flag_dialogue=true;
     flag_sing=false;
  }
   else if(yu_ying[0]==0xFF&&yu_ying[1]==0xFF&&yu_ying[2]==0x02&&yu_ying[3]==0x02&&yu_ying[4]==0x04)//常識類
  {
     flag_common_sense=true;
     flag_sing=false;
  }
   else if(yu_ying[0]==0xFF&&yu_ying[1]==0xFF&&yu_ying[2]==0x02&&yu_ying[3]==0x02&&yu_ying[4]==0x05)//英語類
  {
     flag_English=true;
     flag_sing=false;
  }
   else if(yu_ying[0]==0xFF&&yu_ying[1]==0xFF&&yu_ying[2]==0x02&&yu_ying[3]==0x02&&yu_ying[4]==0x06)//算術類
  {
     flag_arithmetic=true;
     flag_sing=false;
  }
   else if(yu_ying[0]==0xFF&&yu_ying[1]==0xFF&&yu_ying[2]==0x02&&yu_ying[3]==0x02&&yu_ying[4]==0x07)//天氣類
  {
     flag_weather=true;
     flag_sing=false;
  }
   else if(yu_ying[0]==0xFF&&yu_ying[1]==0xFF&&yu_ying[2]==0x02&&yu_ying[3]==0x02&&yu_ying[4]==0x08)//其他類
  {
     flag_qita=true;
     flag_sing=false;
  }else if(i>5){
    yu_ying[0]=0x00;
    yu_ying[4]=0x00;
    i=0;
   }else{
    i=0;
    yu_ying[0]=0x00;
    yu_ying[4]=0x00;
   }

  if(flag_sing){
    Serial.println(222);
    delay(6000);
    eyeRGB(0,20,255);
    for(int k=0; k<1;k++){
//      dian_jiao();
    Right_wave();
    Letf_wave(); 
    left_foot_hand();
    right_foot_hand();
    two_foot_head();
    niuyao();
    beat_it();//舞蹈
    }
    delay(1000);
    flag_sing=false;
    yu_ying[0]=0x00;
    yu_ying[4]=0x00;
    i=0;
  }

  if(flag_qita){
    Serial.println(888);
    delay(1000);
//    right_foot_hand();
    for(int i=0;i<2;i++){
      eyeRGB(0,255,0);
      delay(500);
      eyeRGB(0,0,0);
    }
    flag_qita=false;
    yu_ying[0]=0x00;
    yu_ying[4]=0x00;
    i=0;
  }

 if(flag_awaken){
    Serial.println(111);
    delay(1000);
//    Letf_wave();
    for(int i=0;i<2;i++){
        eyeRGB(255,0,255);
        delay(500);
        eyeRGB(0,0,0);
      }
    flag_awaken=false;
    yu_ying[0]=0x00;
    yu_ying[4]=0x00;
    i=0;
    
  }

  if(flag_dialogue){
    Serial.println(333);
    delay(1000);
//    Right_wave();
    for(int i=0;i<2;i++){
      eyeRGB(0,255,255);
      delay(500);
      eyeRGB(0,0,0);
    }
    flag_dialogue=false;
    yu_ying[0]=0x00;
    yu_ying[4]=0x00;
    i=0;
  }

  if(flag_common_sense){
    Serial.println(444);
    delay(1000);
//    Right_wave();
    for(int i=0;i<2;i++){
      eyeRGB(255,255,255);
      delay(500);
      eyeRGB(0,0,0);
    }
    flag_common_sense=false;
    yu_ying[0]=0x00;
    yu_ying[4]=0x00;;
    i=0;
  }

  if(flag_English){
    Serial.println(555);
    delay(1000);
//    left_foot_hand();
  for(int i=0;i<2;i++){
      eyeRGB(255,255,0);
      delay(500);
      eyeRGB(0,0,0);
    }
    flag_English=false;
    yu_ying[0]=0x00;
    yu_ying[4]=0x00;
    i=0;
  }

 if(flag_arithmetic){
    Serial.println(666);
    delay(1000);
    Tiptoe();
    flag_arithmetic=false;
    yu_ying[0]=0x00;
    yu_ying[4]=0x00;
    i=0;
  }
  
  if(flag_weather){
    Serial.println(777);
    delay(1000);
//    Right_wave();
   for(int i=0;i<2;i++){
        eyeRGB(255,0,0);
        delay(500);
        eyeRGB(0,0,0);
      }
    flag_weather=false;
    yu_ying[0]=0x00;
    yu_ying[4]=0x00;;
    i=0;
  }

  if(j==0){
    Initialize();
    j++;
  }
   

  
  
}


void work2(){//頭部按鍵工作
   if(headkey(1)){//燈光切換 RGB
     head_key+=1;
     delay(500);
  }

 if(headkey(2)){//扭腰動作
  _send(stand_ang_);//發送初始化動作
  delay(500);
  for(int i=0;i<3;i++)
  ten();
  delay(500);
  _send(stand_ang_);
  delay(500);
  }
 if(headkey(3)){//側壓腿動作
  _send(stand_ang_);
  delay(500);
  for(int i=0;i<5;i++)
  nine1();
  delay(500); 
  for(int i=0;i<5;i++)
  nine2();
  _send(stand_ang_);
  delay(500);
  }
  if(headkey(4)){
     beat_it();//舞蹈
  }
  if(head_key==1){
    eyeRGB(255,0,0);
  }
  if(head_key==2){
     eyeRGB(0,255,0);
  }
  if(head_key==3){
     eyeRGB(0,0,255);
  }
  if(head_key==4){
    head_key=0;
    eyeRGB(0,0,0);
  }
}



//五大功能工作
void work(){
  if(hongwai(1)){//小夜燈
    while(!hongwai(0)){
     if(w==0){
     Rgb();
     w++;
     }
    Night_light();
    }
   clean_RGB();
    a=0;
    w=0;
  }
 
  if(hongwai(2)){//定時鬧鐘
     setTime();//進入鬧鐘模式
  }
  
  if(hongwai(3)){//溫室檢測
    while(!hongwai(0)){
      wendu();
      strip.setBrightness(250);
      if(wd>=30){
       strip.setPixelColor(0,0,255,0);
       strip.setPixelColor(1,0,255,0);
       strip.show();
      }else if(wd<30&&wd>25){
       strip.setPixelColor(0,0,255,255);
       strip.setPixelColor(1,0,255,255);
       strip.show();
      }else{
       strip.setPixelColor(0,0,0,255);
       strip.setPixelColor(1,0,0,255);
       strip.show();
      }
    }
    clean_RGB();
  }

  if(hongwai(4)){//照明檢測
    while(!hongwai(0)){
      guangmi();
      if(gm>=900){
        eye_light(1);
      }else if(gm<900&&gm>500){
        eye_light(2);
      }else{
        eye_light(3);
      }
    }
    clean_eye();
  }
  
  if(hongwai(5)){//遙控編舞
     key=0;
     second=0;
     int i=0;
    while(!hongwai(0)){
      
      //動作組合邏輯
      if(_add_==16){
        flag_add=true;
      }
      if(key!=0&&flag_add){
//        Serial.print("key1: ");
//        Serial.println(key);
//        delay(500);
         key_add[i]=key;
//        Serial.print("key2: ");
//        Serial.println(key);
//        delay(500);
         Serial.print("key_add: ");
        Serial.println(key_add[i]);
          i++;
          flag_add=false;
          _add_=0;
           key=0;
//        Serial.print("key3: ");
//        Serial.println(key);
          Serial.println("88");
        }
        //發送次數,執行動作次數
        if(next==17){
           flag_next=true;
        }
        if(key!=0&&flag_next){
          second=key;
          Serial.print("---");
          Serial.print(second);
          Serial.println("---");
          flag_add=false;
           key=0;
        }
        if(second==0){
          second=1;
        }

      //確認發送,執行相應動作
      if(_ok==15){
        add_length=0;
        shuzu_length(key_add);
        while(second--){
          for(int q =0;q<add_length;q++){
          key=key_add[q];
          duoji_action();
          Serial.println(key_add[q],DEC);
         }
        }
        for(int j=0;j<add_length;j++){
           key_add[j]={}; 
        }
//         Serial.print("-#-");
//         Serial.print(second,DEC);
//         Serial.println("-#-");
        key=0;
       _ok=0;
       i=0;
       second=0;
      } 
    }
//    add_length=0;
//   shuzu_length(key_add);
//     for(int q =0;q<add_length;q++)
//    Serial.println(key_add[q],DEC);
//    key_add[100]={};
  }

  if(hongwai(6)){//照明檢測
    while(!hongwai(0)){
      if(hongwai(11)){
         move_(forward,255);
      } 
      if(hongwai(12)){
        move_(backoff,255);
      }
      if(hongwai(13)){
        move_(leftturn,255);
      }
      if(hongwai(14)){
        move_(rightturn,255);;
      }
      if(hongwai(15)){
         move_(forward,0);
      }
    }
    clean_eye();
  }

  if(hongwai(17)){
    
  }
   
}

/**************語音動作相應***********************/
//左揮手踮腳
void left_foot_hand_w(){
   int buf5_dz1[6]={490,512,512,512,900,124};
  int buf5_dz2[6]={380,512,512,512,400,124};
  int buf5_dz3[6]={490,512,512,512,600,124};
   weifen(buf5_dz1,buf5_dz2,20,10);
   for(int i=0;i<2;i++){
    weifen(buf5_dz2,buf5_dz3,20,5);
    weifen(buf5_dz3,buf5_dz2,20,5);
   }
   weifen(buf5_dz2,buf5_dz1,20,10);
//    for(int j=0;j<2;j++){
//      sendangle(1,400);
//      sendangle(5,400);
//      delay(500);
//      sendangle(1,512);
//      sendangle(5,600);
//      delay(500);       
//    }
//    sendangle(5,900);
    delay(500);
}

//右揮手踮腳
void right_foot_hand_w(){
  int buf5_dz1[6]={490,512,512,512,900,124};
  int buf5_dz2[6]={490,624,512,512,900,624};
  int buf5_dz3[6]={490,512,512,512,900,400};
   weifen(buf5_dz1,buf5_dz2,20,10);
   for(int i=0;i<2;i++){
    weifen(buf5_dz2,buf5_dz3,20,5);
    weifen(buf5_dz3,buf5_dz2,20,5);
   }
   weifen(buf5_dz2,buf5_dz1,20,10);
    delay(500);
}


void Letf_wave(){//左揮手
  int buf5_dz1[6]={490,512,512,512,900,124};
  int buf5_dz2[6]={490,512,512,512,900,870};
  int buf5_dz3[6]={490,512,512,512,900,729};
  weifen(buf5_dz1,buf5_dz2,20,10);
  for(int i=0;i<1;i++){
  weifen(buf5_dz2,buf5_dz3,20,5);
  weifen(buf5_dz3,buf5_dz2,20,5);
//  weifen(buf5_dz2,buf5_dz1,20,10);
//    sendangle(6,870);
//    delay(500);
//    sendangle(6,729);
//    delay(500);
  }
   Initialize();
}

void Right_wave(){//右揮手
  int buf5_dz1[6]={490,512,512,512,900,124};
  int buf5_dz2[6]={490,512,512,512,205,124};
  int buf5_dz3[6]={490,512,512,512,300,124};
  weifen(buf5_dz1,buf5_dz2,20,10);
  for(int i=0;i<2;i++){
  weifen(buf5_dz2,buf5_dz3,20,5);
  weifen(buf5_dz3,buf5_dz2,20,5);
//    sendangle(5,205);
//    delay(500);
//    sendangle(5,300);
//    delay(500);
  }
   Initialize();
}

void Tiptoe(){//踮腳
  int buf5_dz1[6]={490,512,512,512,900,124};
  int buf5_dz2[6]={350,620,512,512,900,124};
     
     for(int i =0;i<1;i++){
        eyeRGB(20,255,60);
        weifen(buf5_dz1,buf5_dz2,20,10);
        eyeRGB(0,0,0);
        weifen(buf5_dz2,buf5_dz1,20,10);
      }
      delay(500); 
//  for(int i=0;i<2;i++){
//    sendangle(1,430);
//    sendangle(2,572);
//    delay(500);
//    sendangle(1,512);
//    sendangle(2,512);
//    delay(500);
//  }
   Initialize();
}

void Shaking_hands(){//擺手
  for(int i=0;i<12;i++){
    sendangle(5,450);
//    sendangle(1,380);
//   sendangle(2,620);
    sendangle(6,870);
    delay(1000);
    sendangle(5,200);
//    sendangle(1,490);
//    sendangle(2,512);  
    sendangle(6,600);
    delay(1000);
  }
   Initialize();
}

void dian_jiao(){
  int buf5_dz1[6]={490,512,512,512,900,124};
  int buf5_dz2[6]={350,620,512,512,900,124};

      for(int i =0;i<20;i++){
        weifen(buf5_dz1,buf5_dz2,20,10);
        weifen(buf5_dz2,buf5_dz1,20,10);
      }
      delay(500); 
}




/****************************************/



void shuzu_length(int a[]){//計算組合動作個數
  for(int i=0;i<100;i++){
    if(a[i]!=0)
      add_length=add_length+1;
    else
      break; 
  } 
}

void eye_light(int color){//眼睛燈光
  pinMode(9,OUTPUT);
  pinMode(10,OUTPUT);
  switch(color){
    case 1://紅色
      digitalWrite(9,LOW);
      digitalWrite(10,HIGH);
      break;
   case 2://紅綠色
    digitalWrite(9,LOW);
    digitalWrite(10,LOW);
     break;
  case 3://綠色
     digitalWrite(10,LOW);
     digitalWrite(9,HIGH);
     break;
  default:
    clean_eye();
    break;
  }
}

void clean_eye(){//關閉眼睛
   digitalWrite(7,HIGH);
   digitalWrite(9,HIGH);
   digitalWrite(10,HIGH);
}

void clean_RGB(){//清理RGB
   strip.setPixelColor(0,0,0,0);
   strip.setPixelColor(1,0,0,0);
    strip.show();
}

void RGB_shansuo(){//閃爍提示
  //RGB閃爍提示
//  strip.setBrightness(250);
//  strip.setPixelColor(0,0,255,0);
//  strip.setPixelColor(1,0,255,0);
//  strip.show();
//  delay(500);
//  strip.setPixelColor(0,0,0,0);
//   strip.setPixelColor(1,0,0,0);
//    strip.show();

//眼睛閃爍提示
   eyeRGB(255,0,0);
   delay(500);
   eyeRGB(0,0,0);
    
}
  


void wendu(){//室溫檢測
  sensors.requestTemperatures();
  wd=sensors.getTempCByIndex(0);
  Serial.println(wd);  
  delay(200);
}



void guangmi(){//照明檢測
  gm=analogRead(GM);
  Serial.println(gm,DEC);
  delay(500);
}

//小夜燈
void Night_light(){
if (irrecv.decode(&results)) {
    Serial.println(results.value,HEX);
  switch(results.value)
  {
     //up 增加亮度
     case 0xFF18E7: RgbLight_add();RGB_shansuo();
        break;
     //down 降低亮度
      case 0xFF4AB5:RgbLight_sub();RGB_shansuo();
        break;
     //left 上個顏色
      case 0xFF10EF:color_add();RGB_shansuo();
        break;
      //right 下個顏色
      case 0xFF5AA5: color_sub();RGB_shansuo();
        break;
  }
    irrecv.resume();
  } 
}

void Rgb(){  //初始顏色亮度
//   uint32_t test = strip.Color(0,255,255); 
   strip.setPixelColor(0, color[init_color]);
   strip.setPixelColor(1, color[init_color]);
//   strip.setPixelColor(0, test);
//   strip.setPixelColor(1, test);
   strip.setBrightness(init_light);
   strip.show();
}
void RgbLight_add(){          //增加亮度
 
 init_light = init_light+50;
 Serial.println(init_light);
  if(init_light>250){init_light=250;}
  strip.setBrightness(init_light);
   delay(100);
   strip.show();
}
void RgbLight_sub(){         //降低亮度
  init_light = init_light-50;
  Serial.println(init_light);
  if(init_light==0){init_light=50;}//最低亮度
  strip.setBrightness(init_light);
  delay(100);
   strip.show();
}
void color_add(){      //上個顏色
     init_color++;
     if(init_color>length) init_color=0;
     strip.setPixelColor(0, color[init_color]);
     strip.setPixelColor(1, color[init_color]);
     strip.show();
}
void color_sub(){      //下個顏色
      init_color--;
      if(init_color<0) init_color=length;
      strip.setPixelColor(0, color[init_color]);
      strip.setPixelColor(1, color[init_color]);
      strip.show();
 
}


//紅外遙控函數
bool hongwai(int r){
  flag=false;
  if (irrecv.decode(&results)) {
//    Serial.println(results.value,HEX);
     switch(results.value){
        //1
      case 0xFFA25D:
      RGB_shansuo();
       Serial.println("1");
        label=1;
        key=1;
        break;
        //2
      case 0xFF629D:
      RGB_shansuo();
       Serial.println("2");
        label=2;
        key=2;
        break;
        //3
      case 0xFFE21D:
      RGB_shansuo();
       Serial.println("3");
        label=3;
        key=3;
        break;
        //4
      case 0xFF22DD:
      RGB_shansuo();
       Serial.println("4");
        label=4;
        key=4;
        break;
        //5
      case 0xFF02FD:
      RGB_shansuo();
       Serial.println("5");
        label=5;
        key=5;
        break;
        //6
      case 0xFFC23D:
      RGB_shansuo();
      Serial.println("6");
        label=6;
        key=6;
        break;
        //7
      case 0xFFE01F:
      RGB_shansuo();
       Serial.println("7");
        label=7;
        key=7;
        break;
        //8
      case 0xFFA857:
      RGB_shansuo();
       Serial.println("8");
        label=8;
        key=8;
        break;
        //9
      case 0xFF906F:
      RGB_shansuo();
       Serial.println("9");
        label=9;
        key=9;
        break;
        //0
      case 0xFF9867:
      RGB_shansuo();
       Serial.println("0");
        label=0;
        break;
        //up
      case 0xFF18E7:
       Serial.println("up");
        label=11;
        break;
        //down
      case 0xFF4AB5:
       Serial.println("down");
        label=12;
        break;
        //left
      case 0xFF10EF:
       Serial.println("left");
        label=13;
        break;
        //right
      case 0xFF5AA5:
       Serial.println("right");
        label=14;
        break;
        //ok
      case 0xFF38C7:
      RGB_shansuo();
       Serial.println("ok");
        label=15;
        _ok=15;
        break;  
        //*
      case 0xFF6897:
      RGB_shansuo();
       Serial.println("*");
        label=16;
        _add_=16;
        break;
        //#
      case 0xFFB04F:
      RGB_shansuo();
       Serial.println("#");
        label=17;
        next=17;
        break;
        //else
      default:
        break;
     }
  
//    if(results.value==0xFFB04F){
//       Serial.println(results.value,HEX);//獲取紅外碼值
//    }
    irrecv.resume(); // 接收下一個值
  }
    //Serial.println(key);
    if(label==r) {
      flag=true;//確定返回
      label=99;//復位
  }
  return flag;
}

//舞蹈動作
void duoji_action(){
  
  switch(key){
    case 1:
    Initialize();
    left_foot_hand();
    break;
    case 2:
    Initialize();
    right_foot_hand();
    break;
    case 3:
    Initialize();
    two_foot_head();
    break;
    case 4:
    Initialize();
    niuyao();
    break;
    case 5:
    Initialize();
    letf_hand_light_foot();
    break;
    case 6:
    Initialize();
    light_hand_letf_foot();
    break;
  }
}

//左揮手踮腳
void left_foot_hand(){
    for(int j=0;j<3;j++){
      sendangle(1,400);
      sendangle(5,400);
      delay(500);
      sendangle(1,512);
      sendangle(5,600);
      delay(500);       
    }
    sendangle(5,900);
    delay(500);
}

//右揮手踮腳
void right_foot_hand(){
   for(int j=0;j<3;j++){
      sendangle(2,624);
      sendangle(6,624);
      delay(500);
      sendangle(2,512);
      sendangle(6,400);
      delay(500);       
    }
    sendangle(6,124);
    delay(500);
}

//左右 揮手 踮腳
void two_foot_head(){
  for(int j=0;j<3;j++){
      sendangle(1,400);
      sendangle(2,624);
      sendangle(5,200);
      sendangle(6,824);
      delay(500);
      sendangle(1,512);
      sendangle(2,512);
      sendangle(5,512);
      sendangle(6,512);
      delay(500);       
    }
    Initialize();
    delay(500);
}

//扭腰
void niuyao(){
  int buf5_dz1[6]={512,512,512,512,900,150};
  int buf5_dz2[6]={397,601,611,420,512,512};
  int buf5_dz3[6]={347,606,794,534,449,560};
  int buf5_dz4[6]={441,703,477,208,448,559};

    weifen(buf5_dz1,buf5_dz3,20,10);
      for(int i =0;i<4;i++){
        weifen(buf5_dz3,buf5_dz4,20,10);
        weifen(buf5_dz4,buf5_dz3,20,10);
      }
      weifen(buf5_dz3,buf5_dz1,20,10);
      delay(500); 
}
//左揮手 有踮腳
void letf_hand_light_foot(){
   for(int j=0;j<3;j++){
      sendangle(2,624);
      sendangle(5,400);
      delay(500);
      sendangle(2,512);
      sendangle(5,600);
      delay(500);       
    }
    sendangle(5,900);
    delay(500);
}

//右揮手 左踮腳
void light_hand_letf_foot(){
  for(int j=0;j<3;j++){
      sendangle(1,400);
      sendangle(6,624);
      delay(500);
      sendangle(1,512);
      sendangle(6,400);
      delay(500);       
    }
    sendangle(6,124);
    delay(500);
}

//動作初始化
void Initialize(){
   int b=512;
  for(int i=1;i<=6;i++){
    if(i==5){
      b=900;
    }else if(i==6){
      b=150;    
    }
    sendangle(i,b);      
  } 
  delay(500); 
}

//發送6個舵機
void _send(float *buff){
  for(int i=0;i<6;i++){
    int b=i+1;
    sendangle_(b,buff[i]);
  }
}

//微分處理舵機角度
void weifen(int *buf_1,int *buf_2,int times,int wave_time){
 float buff_1[6], buff_2[6];
  float buf[6];
  for(int i =0;i<6;i++){
    buff_1[i]=(float)(*(buf_2+i)-*(buf_1+i))/times;
    buff_2[i]=(float)*(buf_1+i);
  
  }
  for(int j=0;j<times;j++){
    //次數 
    for(int q=0;q<6;q++){
      //發送角度 
      buff_2[q]+=buff_1[q];
      buf[q]=buff_2[q];
    }
    _send(buf);
  
    delay(wave_time);
  }
}

//舵機角度函數
void sendangle(int idnumber,int value)//idnumber 舵機ID  value 舵機角度
{
 
  uint16_t result=0;
  uint8_t data[6]={0};
  uint8_t i=0;
  int z=(int)value;
  
  switch(idnumber) {
    case 1:
      z=(z>300)?z:300,z=(z<600)?z:600;//600>z>300 
      break;
    case 2:
      z=(z>300)?z:300,z=(z<600)?z:600;//600>z>300
      break;
    case 3:
      z=(z>400)?z:400,z=(z<800)?z:800;//800>z>400
      break;
    case 4:
      z=(z>200)?z:400,z=(z<600)?z:600;//600>z>200
      break;
    case 5:
      z=(z>200)?z:200,z=(z<900)?z:900;//900>z>200
      break;
    case 6:
      z=(z>150)?z:150,z=(z<824)?z:824;//824>z>150
      break;
    default:
      break;
          
      
  } 
  result=z;


    Serial.begin(111100,SERIAL_8N1);
  data[0]=255;
  data[1]=255;
  data[2]=idnumber; 
  data[4]=(uint8_t)result;
  result>>=8;
  data[3]=(uint8_t)result;  
  
  data[5]=(uint8_t)(data[2]+data[3]+data[4]);
  data[5]=~data[5];

  for(i=0;i<=5;i++)
    Serial.write(data[i]);
  delay(50);
  Serial.end();
}

//減少延遲及角度限制
void sendangle_(int idnumber,int value)//idnumber 舵機ID  value 舵機角度
{
 
  uint16_t result=0;
  uint8_t data[6]={0};
  uint8_t i=0;
  int z=(int)value;
  result=z;
  Serial.begin(111100,SERIAL_8N1);
  data[0]=255;
  data[1]=255;
  data[2]=idnumber; 
  data[4]=(uint8_t)result;
  result>>=8;
  data[3]=(uint8_t)result;  
  
  data[5]=(uint8_t)(data[2]+data[3]+data[4]);
  data[5]=~data[5];

  for(i=0;i<=5;i++)
    Serial.write(data[i]);
  delay(5);
  Serial.end();

}

void move_(int direction_,int speed_){//電機驅動
  int leftSpeed = 0;
  int rightSpeed = 0;
  if(direction_ == 1){
    digitalWrite(A3,LOW);
    digitalWrite(12,HIGH);
    analogWrite(M1,speed_);
    analogWrite(M2,speed_);
  }else if(direction_ == 2){
    digitalWrite(A3,HIGH);
    digitalWrite(12,LOW);
    analogWrite(M1,speed_);
    analogWrite(M2,speed_);
  }else if(direction_ == 3){
    digitalWrite(A3,HIGH);
    digitalWrite(12,HIGH);
    analogWrite(M1,speed_);
    analogWrite(M2,speed_);
  }else if(direction_ == 4){
    digitalWrite(A3,LOW);
    digitalWrite(12,LOW);
    analogWrite(M1,speed_);
    analogWrite(M2,speed_);
  } 
}

/*——————————定時鬧鐘—————————————*/
void callbackfun(){//蜂鳴器鬧鈴
  boolean state = true;
  while(state){
        for(int i=0;i<80;i++)//輸出一個頻率的聲音
        {
            digitalWrite(buzzer_pin,HIGH);//發聲音
            delay(1);//延時1ms
            digitalWrite(buzzer_pin,LOW);
            delay(1);
        }
         for(int i=0;i<100;i++)//輸出另一個頻率的聲音,這裏的100與前面的80一樣,用來控制頻率,可以自己調節
        {
          digitalWrite(buzzer_pin,HIGH);
          delay(2);
          digitalWrite(buzzer_pin,LOW);
          delay(2);
        }
        if (irrecv.decode(&results)) {
          if(results.value==0xFF9867) {
            state=false;
          }
        }
}
}
void  setTime(){ //設置時間           //unsigned long 0-4,294,967,295
  boolean settime_state = true; //定時狀態
  
   while(settime_state){
          if (irrecv.decode(&results)) {
                 switch(results.value){
                    //*
                  case 0xFF6897:RGB_shansuo();
                  Hours();break;
                    //#
                  case 0xFFB04F:RGB_shansuo();
                  Minutes();break;
                    //OK
                  case 0xFF38C7:RGB_shansuo();
                  StarClock();settime_state = false;break;
                  //0
                  case 0xFF9867:RGB_shansuo();
                  hours=0;
                  settime_state = false;break;
                }
          irrecv.resume();
    }
   }
}
void Hours(){   //小時
  Serial.println(111);
  boolean hours_state = true; 
  while(hours_state){
        if (irrecv.decode(&results)) {
          switch(results.value){
               //1
            case 0xFFA25D:RGB_shansuo();
            hours=3600000;break;
              //2 
            case 0xFF629D:RGB_shansuo();
            hours=7200000;break;
              //3
            case 0xFFE21D:RGB_shansuo();
            hours=10800000;break;
              //4
            case 0xFF22DD:RGB_shansuo();
            hours=14400000;break;
              //5
            case 0xFF02FD:RGB_shansuo();
            hours=18000000;break;
              //6
            case 0xFFC23D:RGB_shansuo();
            hours=21600000;break;
              //7
            case 0xFFE01F:RGB_shansuo();
            hours=25200000;break;
              //8
            case 0xFFA857:RGB_shansuo();
            hours=28800000;break;
              //9
            case 0xFF906F:RGB_shansuo();
            hours=32400000;break;
              //0
           case 0xFF9867:RGB_shansuo();
           hours=0;break;
           //OK
           case 0xFF38C7:RGB_shansuo();
           hours_state = false;break;
          }
    irrecv.resume();
     }
  }
    Serial.println(333);
}
void Minutes(){    //分鐘
  boolean minutes_state = true; 
  
  while(minutes_state){
     if (irrecv.decode(&results)) {
          switch(results.value){
                  //1
                case 0xFFA25D:RGB_shansuo();
                count(1);break;
                  //2 
                case 0xFF629D:RGB_shansuo();
                count(2);break;
                  //3
                case 0xFFE21D:RGB_shansuo();
                count(3);break;
                  //4
                case 0xFF22DD:RGB_shansuo();
                count(4);break;
                  //5
                case 0xFF02FD:RGB_shansuo();
                count(5);break;
                  //6
                case 0xFFC23D:RGB_shansuo();
                count(6);break;
                  //7
                case 0xFFE01F:RGB_shansuo();
                count(7);break;
                  //8
                case 0xFFA857:RGB_shansuo();
                count(8);break;
                  //9
                case 0xFF906F:RGB_shansuo();
                count(9);break;
                  //0
               case 0xFF9867:RGB_shansuo();
               count(0);break;
                //OK
               case 0xFF38C7:RGB_shansuo();
               minutes_state = false;a=1;break;
          }
    irrecv.resume();
     }
  }
}
void StarClock(){       //開始定時
  Ttime = hours+minutes;
 t.after(Ttime,callbackfun);   //1000mm=1s   60000=1min;
 Serial.println(Ttime);
 Serial.println(666);
 
}
void count(int num){//計算秒數
  Serial.println(num);
  if(a==1){minutes = 60000 * num;a++;}    
  else if(a==2){int shi =minutes*10 ;int ge = 6000*num; minutes = shi + ge;a++;}  
  Serial.println(minutes);
}


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