花了一個多月的時間總算寫了21篇了,
其實這21篇就是大概把我買的所有模組都摸過一輪,
這些文章大部分都有兩個以上組合,
我不太喜歡只單一玩一種東西,太單調了。
程式架構方面大多是參考前輩文獻,而再用自己的想法做變化修改。
我預計慢慢增加到50篇,
過程大概就是模組的交叉組合、新購模組、新程式之類的,
最近寫文章的時間開始會拉長了,
因為要有新的IDEA,
還有本身的份內的工作也不少,
謝謝大家的指教與交流學習。
2018年2月20日 星期二
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
像是NANO板多了個WIFI功能,能用區域網路控制MCU的I/O輸出。
配置就簡單的用繼電器去觸發電扇。
用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就可以一鍵控制囉。
如果辛苦一點寫一個GUI上面做很多網址BUTTON就可以一鍵控制囉。
2018年2月6日 星期二
Arduino (18) 無線識別裝置RFID-RC522。
上圖是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);
}
程式簡單到應該不需要註解吧。
訂閱:
文章 (Atom)
8051 (6) 紅外線避障模組控制LED七段顯示器。
這篇要做的Project就是感測器測到訊號時,LED七段顯示器會開始計算偵測次數, 到第5次時會讓紅色LED燈發光。 程式如下: #include <reg52.h> unsigned char seg[5]={0xf9,...
-
智能車專案的第三種系統,辨識黑白線軌道,感應模組就是萬向輪左右那兩根。 循跡辨識模組TCRT5000,上面有一顆LED,觸發才會亮,基本原理是紅外線反射。 安裝位置愈低愈好,我一開始安裝太高反應很遲鈍。 意外的強,還以為這東西會有...
-
伺服馬達就是一種玩具關節,一個馬達就是一個關節。 首先介紹控制伺服馬達的模組。 PS2類比搖桿。 這是PS2上面的香菇頭搖桿。 五根PIN : DC+-5V、XPIN、YPIN、SW。 XPIN、YPIN就把他想成兩個10K的可變電阻就好了,可控制類比訊號...