顯示具有 Arduino 標籤的文章。 顯示所有文章
顯示具有 Arduino 標籤的文章。 顯示所有文章

2018年3月5日 星期一

Arduino (26) 主、從端HC-05藍芽互相連通+二輪智能車系統。


智能車搭配藍芽序列阜操控,

如果已經玩到現在這種程度的話就知道只是想充充版面而已,

沒什麼難度,只想試看看而已,順便也寫一下。



搭配一個Master。




因為要同時看螢幕和車子,只好讓他懸空轉。

程式如下 :

就只附上Slave端的就好了。

#include <SoftwareSerial.h>
SoftwareSerial BT(3, 4);
char val;
const byte IN1 = 10;  
const byte IN2 = 9;
const byte IN3 = 8;
const byte IN4 = 7;

void setup() {
  BT.begin(38400);
  pinMode(IN1, OUTPUT);
  pinMode(IN2, OUTPUT);
  pinMode(IN3, OUTPUT);
  pinMode(IN4, OUTPUT);
}
void forward()
{
    digitalWrite(IN1, HIGH);
    digitalWrite(IN2, LOW);
    digitalWrite(IN3, HIGH);
    digitalWrite(IN4, LOW);
}
//前進的函式。

void backward()
{
    digitalWrite(IN1, LOW);
    digitalWrite(IN2, HIGH);
    digitalWrite(IN3, LOW);
    digitalWrite(IN4, HIGH);
}
//後退的函式。

void turnLeft()
{
    digitalWrite(IN1, HIGH);
    digitalWrite(IN2, LOW);
    digitalWrite(IN3, LOW);
    digitalWrite(IN4, LOW);
}
//左轉的函式。

void turnRight()
{
    digitalWrite(IN1, LOW);
    digitalWrite(IN2, LOW);
    digitalWrite(IN3, HIGH);
    digitalWrite(IN4, LOW);
}
//右轉的函式。

void stop()
{
    digitalWrite(IN1, LOW);
    digitalWrite(IN2, LOW);
    digitalWrite(IN3, LOW);
    digitalWrite(IN4, LOW);
}
//停止的函式。
void loop() {
  if (BT.available()) {
    val = BT.read();
    if (val == '1') {
      forward();
      delay(100);
      BT.println("forward");
    } else if (val == '2') {
      backward();
      delay(100);
      BT.println("backward");
    }else if (val == '3') {
       turnLeft();
       delay(100);
      BT.println("turnLeft");
    }
    else if (val == '4') {
       turnRight(); 
       delay(100);
      BT.println("turnRight");
    }
    else if (val == '5') {
       stop();
       delay(100);
      BT.println("stop");
    }
    //輸入數字對應輪子轉動方式。

    delay(100);
  }
}




2018年3月4日 星期日

Arduino (25) 循跡辨識模組TCRT5000+二輪智能車系統。


智能車專案的第三種系統,辨識黑白線軌道,感應模組就是萬向輪左右那兩根。



循跡辨識模組TCRT5000,上面有一顆LED,觸發才會亮,基本原理是紅外線反射。

安裝位置愈低愈好,我一開始安裝太高反應很遲鈍。




意外的強,還以為這東西會有跟超聲波一樣反應遲鈍的問題。


程式如下:

const int SRight = 2;    
const int SLeft = 3;      
//右、左輪感測器宣告。

const int motorIn1 = 10;
const int motorIn2 = 9;
const int motorIn3 = 8;     
const int motorIn4 = 7;      
char val; 
int SRR;    
int SLL;    
byte byteSensorStatus=0;

void setup() 
{
  pinMode(SLeft, INPUT);
  pinMode(SRight, INPUT);
  pinMode(motorIn1, OUTPUT);
  pinMode(motorIn2, OUTPUT);
  pinMode(motorIn3, OUTPUT);
  pinMode(motorIn4, OUTPUT);  
}


void loop(){
 byteSensorStatus = 0;
  SRR = digitalRead(SRight);
  if(SRR == 1)
     byteSensorStatus = (byteSensorStatus | (0x01 << 1));

  SLL = digitalRead(SLeft);
  if(SLL == 1)
     byteSensorStatus = (byteSensorStatus | 0x01);
   //辨識循跡狀態的公式。

  switch(byteSensorStatus)
  {             
    case 0: 
           motorstop();
            break;
    //0、0(黑、黑,停止)。

    case 1: 
             left();  
            break;
   //1、0(白、黑,左轉)。

    case 2: 
             right(); 
            break;
   //0、1(黑、白,右轉)。

    case 3: 
           forward() ;
            break;
   //1、1(白、白,前進)。

  } 

}

void motorstop()
{
  digitalWrite(motorIn1, LOW);
  digitalWrite(motorIn2, LOW);
  digitalWrite(motorIn3, LOW);
  digitalWrite(motorIn4, LOW);
}

void forward()
{
  digitalWrite(motorIn1, HIGH);
  digitalWrite(motorIn2, LOW);
  digitalWrite(motorIn3, HIGH);
  digitalWrite(motorIn4, LOW);
}

void backward()
{
  digitalWrite(motorIn1, LOW);
  digitalWrite(motorIn2, HIGH);
  digitalWrite(motorIn3, LOW);
  digitalWrite(motorIn4, HIGH);

}

void right()
{
  digitalWrite(motorIn1, LOW);
  digitalWrite(motorIn2, LOW);
  digitalWrite(motorIn3, HIGH);
  digitalWrite(motorIn4, LOW);

}

void left()
{
  digitalWrite(motorIn1, HIGH);
  digitalWrite(motorIn2, LOW);
  digitalWrite(motorIn3, LOW);
  digitalWrite(motorIn4, LOW);
}





2018年3月1日 星期四

Arduino (24) 超聲波模組HC-SR01+二輪智能車系統。


和前一篇的差別就是將紅外線拆除,裝上了超聲波模組HC-SR01,

這看起來挺像瓦力的,兩個眼睛。

模式就是前進後,前方距離只有20CM時停止0.25秒,然後轉向,再前進。





程式如下 :

const int trigPin=11;
const int echoPin=12;
unsigned long data;
const byte IN1 = 10;   
const byte IN2 = 9;
const byte IN3 = 8;  
const byte IN4 = 7;

unsigned long ping(){
  digitalWrite(trigPin,HIGH);
  delayMicroseconds(5);
  digitalWrite(trigPin,LOW);
  return pulseIn(echoPin,HIGH);
//超聲波函式。

}
byte dir = 0;
void setup() {
  pinMode(IN1, OUTPUT);
  pinMode(IN2, OUTPUT);
  pinMode(IN3, OUTPUT);
  pinMode(IN4, OUTPUT);
  pinMode(trigPin,OUTPUT);
  pinMode(echoPin,INPUT);
  Serial.begin(9600);

}
void forward()
{
    digitalWrite(IN1, HIGH);
    digitalWrite(IN2, LOW);
    digitalWrite(IN3, HIGH);
    digitalWrite(IN4, LOW); 
}
void backward()
{
    digitalWrite(IN1, LOW);
    digitalWrite(IN2, HIGH);
    digitalWrite(IN3, LOW);
    digitalWrite(IN4, HIGH);  
}
void turnLeft()
{
    digitalWrite(IN1, HIGH);
    digitalWrite(IN2, LOW);
    digitalWrite(IN3, LOW);
    digitalWrite(IN4, LOW); 
}
void turnRight()
{
    digitalWrite(IN1, LOW);
    digitalWrite(IN2, LOW);
    digitalWrite(IN3, HIGH);
    digitalWrite(IN4, LOW);
}
void stop()
{
    digitalWrite(IN1, LOW);
    digitalWrite(IN2, LOW);
    digitalWrite(IN3, LOW);
    digitalWrite(IN4, LOW);
}
void loop() {
   data=ping()/58;
  int A=abs(data);
 //A就是距離,單位公分。

  if (A>20) { 
  if (dir != 0) {  // 如果目前的行進狀態不是「前進」
     dir = 0;        // 設定成「前進」
     stop();         // 暫停馬達0.25秒
     delay(250);
      }
    forward();    // 前進
     } else {
   if (dir != 1) { // 如果目前的狀態不是「右轉」
      dir = 1;       // 設定成「右轉」
      stop();        // 暫停馬達0.25秒
      delay(250); 
      }
     turnRight(); // 向右轉
      }
   //上面這一坨是抄書本的,比較穩定。

   delay(500); 
}



2018年2月28日 星期三

Arduino (23) 紅外線收發器+二輪智能車系統。



Arduino 玩到最後都要碰一下智能車才行。

兩輪智能車的結構大概就是兩顆減速直流馬達和一個L298N直流馬達驅動模組。

減速直流馬達是什麼??就是內建齒輪比讓輸出轉速降低,

就像是以前玩的軌道車,都會搭配1比3和1比4的齒輪比來降低輸出轉速。

而這台車送來發現兩顆輪子顏色不太一樣= =。


第一篇智能車專案就來搭配紅外線收發來控制前進、後退和方向。



程式如下 :

#include <IRremote.h>
#include <LedControl.h>
const int irReceiverPin = 2;
IRrecv irrecv(irReceiverPin);
decode_results results;

const byte IN1 = 3; 
const byte IN2 = 4;
const byte IN3 = 5;
const byte IN4 = 6;
//L298N的接腳宣告,控制兩顆馬達正反轉的輸出。 

void setup() {
  Serial.begin(115200);
  irrecv.enableIRIn();
  pinMode(IN1, OUTPUT);
  pinMode(IN2, OUTPUT);
  pinMode(IN3, OUTPUT);
  pinMode(IN4, OUTPUT);
}
void forward()
{
    digitalWrite(IN1, HIGH);
    digitalWrite(IN2, LOW);
    digitalWrite(IN3, HIGH);
    digitalWrite(IN4, LOW);
}
//前進的函式。

void backward()
{
    digitalWrite(IN1, LOW);
    digitalWrite(IN2, HIGH);
    digitalWrite(IN3, LOW);
    digitalWrite(IN4, HIGH);
}
//後退的函式。

void turnLeft()
{
    digitalWrite(IN1, HIGH);
    digitalWrite(IN2, LOW);
    digitalWrite(IN3, LOW);
    digitalWrite(IN4, LOW);
}
//左轉的函式。

void turnRight()
{
    digitalWrite(IN1, LOW);
    digitalWrite(IN2, LOW);
    digitalWrite(IN3, HIGH);
    digitalWrite(IN4, LOW);
}
//右轉的函式。

void stop()
{
    digitalWrite(IN1, LOW);
    digitalWrite(IN2, LOW);
    digitalWrite(IN3, LOW);
    digitalWrite(IN4, LOW);
}
//停止的函式。

void loop() {
  if (irrecv.decode(&results)){
            Serial.print("Protocol: "); 

            switch(results.decode_type) {
        case NEC:
          Serial.print("NEC");
          break;
        case SONY:
          Serial.print("SONY");
          break;
        case RC5:
          Serial.print("RC5");
          break;
        case RC6:
          Serial.print("RC6");
          break;
        default:
          Serial.print("Unknown encoding");
    }
  Serial.print("  irCode: ");         
  Serial.print(results.value);
//紅外線我直接沿用我前面之前寫的,我懶的在重新對編碼。

   if (results.value == 16753245) {
    forward();
    delay(100); }
   if (results.value == 16736925) {
    backward(); 
    delay(100); }
   if (results.value == 16738455) {
     turnLeft(); 
    delay(100); }
   if (results.value == 16724175) {
     turnRight(); 
    delay(100); }
   if (results.value == 16730805) {
      stop();
      }
    delay(1000);
    irrecv.resume();     
   }
}

遙控車不過就這樣而已嘛....













2018年2月21日 星期三

Arduino (22) 主、從端HC-05藍芽互相連通+PS類比搖桿+雙軸伺服馬達SG-90。


沒想到弄好一組對收藍芽後就可以變出很多種配置,

這次就來玩,主-PS搖桿,從-兩顆伺服馬達。

模組就之前介紹過了,這邊不多贅述。



至於跟(21)篇的主要差異在於這篇是傳遞類比訊號,而(21)篇是傳遞數位訊號。





上圖是Master配置。


上圖是Slave 配置。





成果感覺還行。

底座沒有固定,所以倒了,不管。


程式如下 :

Master--

#include <SoftwareSerial.h>
#include<Servo.h > 
SoftwareSerial BT(8, 9);
int valX, posX;
int valY, posY;
const byte pinX = A0;
const byte pinY = A1;

void setup() {
  Serial.begin(9600);
  Serial.println("BT is ready!");
  BT.begin(38400);
}

void loop() {
  valX = analogRead(pinX);
  valY = analogRead(pinY);
  posX = map(valX, 0, 1023, 0, 179);
  posY = map(valY, 0, 1023, 0, 179);

  BT.write(posX);
  BT.write(posY);
//從這裡將類比訊號傳到藍芽。

  delay(100);
}



Slave--
#include <SoftwareSerial.h>
#include<Servo.h > 
SoftwareSerial BT(8, 9);
Servo servo1;
Servo servo2;
int val1,val2;
void setup() {
  servo1.attach(3);
  servo2.attach(4);
  Serial.begin(9600);
  Serial.println("BT is ready!");
  BT.begin(38400);
}
void loop() {
  if (BT.available()>0) {
    val1 = BT.read(); 
    servo1.write(val1);
    delay(15);
  }
//接收類比訊號一,啟動一號馬達。

  if (BT.available()>0) {
    val2 = BT.read(); 
    servo2.write(val2);
    delay(15);
//接收類比訊號二,啟動二號馬達。
}
delay(15);
}


其實馬達還是有點抖動,delay這邊還可以再多試一下。





2018年2月18日 星期日

Arduino (21) 主、從端HC-05藍芽互相連通+紅外線觸發。


接下來這篇就不要用PC來控制藍芽風扇,

進階點來由紅外線避障模組來控制吧。


我本來想過完年去找我們公司的黃杯杯問一下Code,因為我自己寫風扇都不會動XD

結果剛剛被我寫成功了,整整寫了2天。



來看配置,下圖是Slave端。

一樣就是觸發繼電器給5V風扇。




再來是Master端,MCU用Nano,Trigger用一個紅外線避障模組。





結果就是這樣,程式寫了2天,總算成功了。

因為我C語言的能力不太好,畢竟是自學的,容易被卡小地方。


來看程式 :

Master端 :

#include <SoftwareSerial.h>
SoftwareSerial BT(8, 9);
int val;

void setup() {
  Serial.begin(9600);
  Serial.println("BT is ready!");
  pinMode(3,INPUT);
  BT.begin(38400);

}

void loop() {
  val=digitalRead(3);
  if(val!=HIGH)
//我也有卡這邊,我忘了紅外線避障是觸發低電位。
   {
     BT.write(100);
     delay(1000);
   }
delay(50);
}



Slave端 :

#include <SoftwareSerial.h>
SoftwareSerial BT(8, 9);
int val;
int pos=0;
void setup() {
  BT.begin(38400);
  Serial.begin(9600);
  pinMode(10, OUTPUT);

}

void loop() {
  if (BT.available()>0) {
    val = BT.read();
      if(val==100&&pos==0)
//這部分也可以用Boolean,切換開關模式,每次觸發改變HIGH、LOW與按下、未按下。

  {
   digitalWrite(10,HIGH);
   pos=1;
}
else if(val==100&&pos==1)
{
  digitalWrite(10,LOW);
   pos=0;
      }
   }
}


程式不長,但搞很久。








2018年2月17日 星期六

Arduino (20) 主、從端HC-05藍芽互相連通+序列阜輸入。


這東西是藍芽模組HC-05,而市面上有另一種叫HC-06的藍芽模組。

HC-05和HC-06不一樣的地方是HC-05多一個Enable-PIN,

可以進入AT模式設定Master或Slave,HC-06只能是Slave。

所以我直接用兩個HC-05比較方便。




首先先來進入AT模式,RX、TX、GND接好,Enable接3.3V,重要的是5VDC供電先不接,

還有要先灌"設定AT"的Code(如下)。

#include <SoftwareSerial.h> 

SoftwareSerial BT(8, 9);
// TX, RX (軟體RX要接硬體TX、硬體TX要接軟體RX)。

char val;

void setup() {
  Serial.begin(9600); 
  Serial.println("BT is ready!");
  BT.begin(38400);
}

void loop() {

  if (Serial.available()) {
    val = Serial.read();
    BT.print(val);
  }

  if (BT.available()) {
    val = BT.read();
    Serial.print(val);
  }
//程式LOOP主要功能就是收到什麼""指令""做什麼事。

}

按住板子上唯一的按鈕,然後插入DC5V供電,放掉按鈕,板子上的燈會呈現慢速閃動,

這樣就表示已進入AT,這時開啟序列阜就OK了。

後來有幾個程序要做,

1、輸入指令AT--確認AT連線。

2、輸入指令AT+ADDR?--回傳位置(Slave就好)。


3、輸入指令AT+ROLE=1 (Master)、輸入指令AT+ROLE=0 (Slave)。

4、輸入指令AT+BIND=儲存連線Slave藍芽位置。





Master端的Code如下:

#include <SoftwareSerial.h> 


SoftwareSerial BT(8, 9);

char val;

void setup() {
  Serial.begin(9600); 
  Serial.println("BT is ready!");

  BT.begin(38400);
//Baud Rate記得都要設38400。

}

void loop() {

  if (Serial.available()) {
    val = Serial.read();
    BT.print(val);
  }

  if (BT.available()) {
    val = BT.read();
    Serial.print(val);
  }
//這一樣是使用序列阜輸入訊息給Slave端。

}



接下來Slave端的Code如下:。

#include <SoftwareSerial.h>

SoftwareSerial BT(8, 9);

char val;

void setup() {
  BT.begin(38400);
  pinMode(10, OUTPUT);
//輸出定義在I/O 第10PIN。
}

void loop() {
  if (BT.available()) {
    val = BT.read();
    if (val == '1') {
      digitalWrite(10, 1);
      BT.println("ON");
       // Master端輸入字元"1",10PIN輸出HIGH。

    } else if (val == '0') {
      digitalWrite(10, 0);
      BT.println("OFF");
      // Master端輸入字元"0",10PIN輸出LOW。

    }
  }
}




成果像影片這樣,序列阜也會顯示開關。

這東西比較複雜點,細心點弄還是弄得出來的。


2018年2月13日 星期二

Arduino (19) WIFI MCU模組ESP8266 手機控制風扇開關。

這東西蠻厲害的,是一種物聯網的概念。

像是NANO板多了個WIFI功能,能用區域網路控制MCU的I/O輸出。


ESP8266 WiFi模塊 ESP-12E Lua 





配置就簡單的用繼電器去觸發電扇。



用IE或Chrome搜尋軟體輸入區域網路代碼就可以控制設備了。

程式如下 :

#include <ESP8266WiFi.h>
const char* ssid = "ACCOUNT"; 
//打上帳號。

const char* password = "PASSWORD";
//打上密碼。

WiFiServer server(80);
void setup() {
  Serial.begin(115200);
  delay(10);

  pinMode(2, OUTPUT);
  digitalWrite(2, 0);
//設定I/O輸出。
//這部分跟一般UNO不一樣,需要自己去插插看,
//13=D7、16=D0、上面的pinMode是2PIN,所以我們要插D4。
  
  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);
  
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");
  
  server.begin();
  Serial.println("Server started");

  Serial.println(WiFi.localIP());
}
//因為我是抄範例的,所以上面一堆的序列阜監控和啟動WIFI程序就不多說,看得懂就好了。

void loop() {
  WiFiClient client = server.available();
  if (!client) {
    return;
  }
  Serial.println("new client");
  while(!client.available()){
    delay(1);
  }
  String req = client.readStringUntil('\r');
  Serial.println(req);
  client.flush();

  int val;
  if (req.indexOf("/gpio/0") != -1)
    val = 0;
  else if (req.indexOf("/gpio/1") != -1)
    val = 1;
  else {
    Serial.println("invalid request");
    client.stop();
    return;
  }
//這部分是最重要的,宣告一個變數(val),區域網路就用這個變數去改變設備型態。

  digitalWrite(2, val);
  
  client.flush();

  String s = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n<!DOCTYPE HTML>\r\n<html>\r\nGPIO is now ";
  s += (val)?"high":"low";
  s += "</html>\n";

  client.print(s);
  delay(1);
  Serial.println("Client disonnected");
}

用手機操控舵機也很簡單,就輸了一個角度變數,讓舵機執行你要轉的角度。

這地方就簡單做一個風扇控制就好了。

如果辛苦一點寫一個GUI上面做很多網址BUTTON就可以一鍵控制囉。



2018年2月6日 星期二

Arduino (18) 無線識別裝置RFID-RC522。


無線識別裝置RFID,採用TTL數位訊號傳遞資料,頻率大概在125K~13.56MHz。

上圖是RFID讀卡機,啟動後會不停的發送電磁波,當卡片接近時,卡片的線圈會和讀卡機的

電磁場產生共振,即可傳遞資料。























這東西就是所謂的卡片鎖,公司打卡(左)、電梯解鎖(右)都很普遍在運用。























配置先這樣,因為RFID程式本身很長,就簡單一上一顆LED燈就好了。

功能就是記憶兩組編碼(卡片式、鈕扣式),接觸到讀卡機時,點亮LED燈,再接觸時關閉。



卡片式的和鈕扣式的都來玩一下。


程式如下 :

#include <MFRC522.h>   
#define RST_PIN      A0
#define SS_PIN       10 
#define LED 2

bool lockerSwitch = false;
//先預設關閉。

struct RFIDTag {
   byte uid[4];
   char *name;
};
//RFID編碼結構(4組十進位+名稱)。

struct RFIDTag tags[] = {
  {{64,97,93,89}, "Card_Type"},
  {{27,70,222,35}, "Button_Type"}
};
//卡片和鈕扣的編碼。

byte totalTags = sizeof(tags) / sizeof(RFIDTag);
MFRC522 mfrc522(SS_PIN, RST_PIN);

void locker(bool toggle) {
  if (toggle) {
      digitalWrite(LED,HIGH);
      delay(100);
  } else {
      digitalWrite(LED,LOW);
      delay(100);
  }
//開&關LED的函式。

}
void setup() {
  Serial.begin(9600);
  Serial.println();
  Serial.print("size of RFIDTag:");
  Serial.println(sizeof(RFIDTag));
  Serial.print("size of tag:");
  Serial.println(sizeof(tags));
  Serial.println("RFID reader is ready!");

  SPI.begin();
  mfrc522.PCD_Init();   
  pinMode(LED,OUTPUT);
  locker(lockerSwitch);
}
void loop() {

    if (mfrc522.PICC_IsNewCardPresent() && mfrc522.PICC_ReadCardSerial()) {
      byte *id = mfrc522.uid.uidByte;
      byte idSize = mfrc522.uid.size; 
      bool foundTag = false; 
   
      for (byte i=0; i<totalTags; i++) {
        if (memcmp(tags[i].uid, id, idSize) == 0) {
          Serial.println(tags[i].name);
          foundTag = true;
       
          lockerSwitch = !lockerSwitch;
          locker(lockerSwitch);       
          break;
          //讀到編碼資料且開、關鎖。

        }
      }
      if (!foundTag) {
        Serial.println("Wrong card!");
        //如果卡片編碼錯誤就顯示錯誤。

        if (lockerSwitch) {
          lockerSwitch = false;
          locker(lockerSwitch);
        }
      }
   
      mfrc522.PICC_HaltA();
    }
    //停止卡片狀態。

}

好用的東西,可以搭配任何開關模組,像是風扇和馬達等等...。





2018年2月1日 星期四

Arduino (17) LM35溫度感測器+1018 BJT開關電路。


本篇的主角,兩顆封裝長的一樣的電晶體,

左邊是LM35,右邊是1018 NPN BJT




NPN電晶體開關就是基極收到HIGH,導通集極和射極(導通VCC+)使LED發光。




杜邦線的顏色我是隨邊挑的。

配置大概是這樣。

這篇我本來沒有要寫,只是套裝包裡有這個元件,買都買了就拿來用吧。




影片大概就是用手壓溫度會超過30度,給電晶體HIGH,導通LED正極電壓。

程式如下:

const int LM35=A1;
const int trigger=7;
int val =0; 
float temp = 0; 

void setup(){
pinMode(trigger,OUTPUT); 
Serial.begin(9600); 
}

void loop(){
val = analogRead(LM35); 
temp = (125*val)>>8; 
//算出溫度值,這我抄來的,我覺得沒很準。

Serial.print("Tep="); 
Serial.print(temp); 
Serial.println(" C"); 
delay(1000);

if (temp>=30) {
digitalWrite(trigger,HIGH); 
}
else if(temp<=30) {
  digitalWrite(trigger,LOW); 
  }
//大於30度給HIGH。
}

我的BJT 1018看DataSheet 射極和集極是顛倒的,我也不知道為什麼,

之前我在Layout微型中頻電路時也發現MMBT2222也有這種情形,

我在想是不是要接兩組1018,有空再試。

Arduino (16) B10K可變電阻類比控制排列LED燈與無源蜂鳴器。



B10K可變電阻

左右PIN接5VDC+-,中間PIN判斷電阻值。




這種配置就是音響的音量調節旋鈕,旋鈕右轉,聲音愈大,LED燈也會亮愈多顆。

利用可變電阻的類比訊號去控制聲音和LED燈。




主要是處理類比資料的章節。



程式如下 :

const int LED1=2;
const int LED2=3;
const int LED3=4;
const int LED4=5;
const int LED5=6;
const int analogPin=A0;
const int buzzer=A1;
void setup(){
  for(int i=2;i<=6;i++){
 pinMode(i,OUTPUT);
 }
 pinMode(A0, INPUT);
 pinMode(buzzer, OUTPUT);
}
void loop(){
  int val = analogRead(analogPin);
//類比值宣告且定義。

  tone(buzzer,val*3,1);
//類比資料控制聲音,乘三是因為想讓聲音高一點。

  if(val<=50){
    digitalWrite(LED1,LOW);
    digitalWrite(LED2,LOW);
    digitalWrite(LED3,LOW);
    digitalWrite(LED4,LOW);
    digitalWrite(LED5,LOW);
  }
  else if(val<=100){
    digitalWrite(LED1,HIGH);
    digitalWrite(LED2,LOW);
    digitalWrite(LED3,LOW);
    digitalWrite(LED4,LOW);
    digitalWrite(LED5,LOW);
  }else if(val<=250){
    digitalWrite(LED1,HIGH);
    digitalWrite(LED2,HIGH);
    digitalWrite(LED3,LOW);
    digitalWrite(LED4,LOW);
    digitalWrite(LED5,LOW);
  }else if(val<=400){
    digitalWrite(LED1,HIGH);
    digitalWrite(LED2,HIGH);
    digitalWrite(LED3,HIGH);
    digitalWrite(LED4,LOW);
    digitalWrite(LED5,LOW);
   }else if(val<=650){
    digitalWrite(LED1,HIGH);
    digitalWrite(LED2,HIGH);
    digitalWrite(LED3,HIGH);
    digitalWrite(LED4,HIGH);
    digitalWrite(LED5,LOW);
   }else if(val<=800){
    digitalWrite(LED1,HIGH);
    digitalWrite(LED2,HIGH);
    digitalWrite(LED3,HIGH);
    digitalWrite(LED4,HIGH);
    digitalWrite(LED5,HIGH);
   }
//類比值愈大,燈亮的越多。

}


這是上班的時候想到的,就回來試一下。


2018年1月31日 星期三

Arduino (15) 麥克風聲音感測模組控制LED燈。


聲音感測模組

聲控設備都會用到的東西。

除了DC正負外,有數位輸出DO和類比輸出AO,這次我們玩數位輸出就好囉。

上面也有電位器控制靈敏度。






程式我沒有加Delay,很即時的呈現聲音控制LED。


程式如下:

const int LED=8;
const int sound=2;

void setup(){
 pinMode(LED,OUTPUT);
 pinMode(sound,INPUT);
}

void loop(){
  if(digitalRead(sound)==LOW){
    digitalWrite(LED,HIGH);
    delay(100);
  }else if(
    digitalRead(sound)==HIGH){
      digitalWrite(LED,LOW);
      delay(100);
//值得注意的是這模組是觸發後發出低電位,所以要寫讀到LOW時LED燈亮。
    }
}


Arduino (14) CDS5m/m 光敏電阻+RGB LED模組。



右邊有兩根PIN元件的是CDS5m/m光敏電阻,就是以光感控制電阻值。

左邊是RGB 三色LED模組,分別有紅、綠、藍,也可個別點亮合成其他顏色。



擋住光線呈現藍色,手移開呈現綠色,拿光去照呈現閃爍,因為在綠與紅的臨界值。

要刻意寫出閃爍也可以的。


程式如下:

const int CDS=A0;
//記得宣告類比訊號。

const int red_led = 8;
const int green_led = 9;
const int blue_led = 10;


void setup()
{
  pinMode(red_led,OUTPUT);
  pinMode(green_led,OUTPUT);
  pinMode(blue_led,OUTPUT);
}
void loop()
{
  int val;
  val=analogRead(CDS);
  if(val>=700){
  digitalWrite(blue_led, HIGH);  
  digitalWrite(green_led, LOW);  
  digitalWrite(red_led, LOW);  
  delay(100); 
  //電阻分配值大於700亮藍色。

  }
  if(val<650){
  digitalWrite(red_led, LOW);  
  digitalWrite(blue_led, LOW);  
  digitalWrite(green_led, HIGH);  
  delay(100); 
  }
 //電阻分配值小於650亮綠色。

  if(val<500){
  digitalWrite(red_led, HIGH);  
  digitalWrite(green_led, LOW);  
  digitalWrite(blue_led, LOW);  
  delay(100); 
  }
//電阻分配值小於500亮紅色。
}


2018年1月30日 星期二

Arduino (13) 接觸式液位計模組+IIC/I2C1602顯示器


接觸式液位計模組,

就是一般的接觸式水位計。

只有三根PIN,DC正負、DATA。



我結合了LCD螢幕來顯示數據,單位是"mm"。


程式如下:

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,2,1,0,4,5,6,7,3,POSITIVE);
const int val = A3;
//記得宣告類比PIN腳。

void setup() {
  lcd.begin(16, 2);
 
}
void loop() {
    int water = analogRead(val);
//回傳水位數值。

    lcd.setCursor(0,0);
    lcd.print("Water Level:");
    lcd.setCursor(0,1);
    lcd.print(water);
    delay(100);
}

程式看來也沒什麼難度。

Arduino (12) 火焰感測器+有源蜂鳴器。

Arduino新手包一定會有的感測器模組,

其實我也不知道為什麼一定要有火焰感測器,

成本便宜嗎?

對於學習來說我覺得反射式避障模組可能還比較好。




火焰感測器

上面有電位器可以調整靈敏度,跟訪間上的安防設備原理一樣。

四根PIN,DC5V+-、數位輸出DO、類比輸出AO,我們只判別高低電位所以只用DO即可。





















有源蜂鳴器,

做為警報器,因為內建震盪器,所以不用額外給頻,只要給個HIGH就會響。




影片中我多接了一顆LED,點火蜂鳴器和LED就會做動,我延遲寫了3秒。


程式如下:


#include <pitches.h>
const int buzzer = 2;
const int Led=3;                                             
const int fireSensor=7;                                      
int val;  

void setup(){ 
  pinMode(Led,OUTPUT);
  pinMode(buzzer,OUTPUT);
  pinMode(fireSensor,INPUT);
}

void loop(){
  val=digitalRead(fireSensor);
  if(val==LOW)
  { 
    digitalWrite(Led,HIGH);  
    digitalWrite(buzzer,HIGH); 
    delay(3000);
  }else{ 
    digitalWrite(Led,LOW);
    digitalWrite(buzzer,LOW);
  }
  delay(100);
}

程式簡單到應該不需要註解吧。





2018年1月29日 星期一

Arduino (11) 紅外線收發器+MAX7219+8X8 LED點陣模組。

這次要玩的是用紅外線去控制8X8點陣LED模組。





















首先先看紅外線接收器和紅外線發射器

接收器看起來就像一個電晶體,三個PIN分別是DC+-和Vout。

發射器看起來就是一個普通的遙控器,可以用其他遙控器代替。






















再來就是8X8點陣模組,這模組有搭配MAX7219顯示驅動器

其實我學習套件裡的8X8LED沒有包含MAX7219,但看了佈線圖讓我卻步了,

於是我額外買了模組化的套件,複雜的腳位變成五根PIN。

分別是DC正負、DIN、CS、CLK。





















按下紅外線發射器任何鍵,序列阜解碼的資料都不一樣,Protocol屬NEC。

32 bits是解碼資料的單位大小,也是4 bytes。





影片中按0顯示0,按1顯示1,按8顯示8,按"CH-"燈跑馬全亮,按"CH"燈跑馬全暗。

我只設定五種按鍵而已,太多真的會寫到死。



程式如下:

#include <IRremote.h>
#include <LedControl.h>
//需要拉出紅外線和MAX7219的資料庫。

const int irReceiverPin = 2;
const int trigger =7;
IRrecv irrecv(irReceiverPin);
decode_results results; 
LedControl lc=LedControl(12,11,10,1); 
void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn();
  pinMode(trigger, OUTPUT); 
  lc.shutdown(0,false);  
  lc.setIntensity(0,8);  
  lc.clearDisplay(0);     
}
//一些既定的宣告和定義。


void loop() 
{
  if (irrecv.decode(&results)){ 
            Serial.print("Protocol: ");   

            switch(results.decode_type) {
        case NEC:
          Serial.print("NEC");
          break;
        case SONY:
          Serial.print("SONY");
          break;
        case RC5:
          Serial.print("RC5");
          break;
        case RC6:
          Serial.print("RC6");
          break;
        default:
          Serial.print("Unknown encoding");  

//分類帽是確認你的遙控器的Protocol。
    }  

    Serial.print("  irCode: ");            
    Serial.print(results.value); 
//序列阜會顯示你用紅外線發射器按的解碼資料。

    if (results.value == 16753245) { 
//接收到解碼16753245,執行以下邏輯。

        digitalWrite(trigger, HIGH);
        
          for (int row=0; row<8; row++)
           {
            for (int col=0; col<8; col++)
             {
              lc.setLed(0,col,row,true); 
                delay(25);
          }
       }
    }  
//LED用跑馬燈方式全亮。

    if (results.value == 16736925) {  
        digitalWrite(trigger, LOW);
        
          for (int row=0; row<8; row++)
           {
            for (int col=0; col<8; col++)
             {
              lc.setLed(0,col,row,false);
                delay(25);
         }
      }
   }
//LED用跑馬燈方式全暗。


   if (results.value == 16738455){
    for (int row=2; row<6; row++){
        lc.setLed(0,2,row,true);
        lc.setLed(0,5,row,true);
      }
    for (int col=3; col<5; col++){
        lc.setLed(0,col,1,true);
        lc.setLed(0,col,6,true);
     }
   }
//顯示數字"0"。

      if (results.value == 16724175){
    for (int row=1; row<7; row++){
        lc.setLed(0,3,row,true);
      }
    for (int col=2; col<5; col++){
        lc.setLed(0,col,7,true);
     }
     lc.setLed(0,4,2,true);
   }
//顯示數字"1"。

      if (results.value == 16730805){
    for (int row=2; row<7; row++){
        lc.setLed(0,2,row,true);
        lc.setLed(0,5,row,true);
      }
    for (int col=3; col<5; col++){
        lc.setLed(0,col,1,true);
        lc.setLed(0,col,4,true);
        lc.setLed(0,col,7,true);      
     }
     lc.setLed(0,5,4,false);
     lc.setLed(0,2,4,false);
   }
//顯示數字"8"。

    Serial.print(",  bits: ");           
    Serial.println(results.bits);  
    delay(500);
    irrecv.resume();         
  }  
}

紅外線的應用很多很廣,下次再拿來結合其他模組來玩。




8051 (6) 紅外線避障模組控制LED七段顯示器。

這篇要做的Project就是感測器測到訊號時,LED七段顯示器會開始計算偵測次數, 到第5次時會讓紅色LED燈發光。 程式如下: #include <reg52.h> unsigned char seg[5]={0xf9,...