ทดลองเล่นบอร์ด Arduino DigiSpark Tiny85 ขนาดจิ๋ว มี 6 I/O ให้ใช้ ซื้อบอร์ดมาจากอีเบย์ preload มาด้วย Bootloader ทำให้ง่ายต่อการพัฒนาโปรแกรม
การเตรียมโปแกรม (สำหรับ Windows)
- ดาวน์โหลด Arduino และ Driver สำหรับบอร์ดจาก ที่นี่
- Unzip ไฟล์ที่โหลดมาแล้วเข้าไปที่ โฟลเดอร์ DigisparkWindowDriver แล้วรันโปรแกรม InstallDriver.exe
- ไปที่โฟลเดอร์ Digispark-Arduino-1.0.4 แล้วรัน Arduino
- ใน Arduino ให้เลือกบอร์ดเป็น Digispark (Tiny Core) เลือก Programmer เป็น Digispark แล้วเลือก Serial Port ให้ถูกต้อง
- เปิดไฟล์ตัวอย่างมาลองเล่นดู เริ่มจาก Blink ก่อน เปลี่ยนพอร์ตของ LED เป็น พอร์ต 1
- ก่อน Load โปรแกรม จะต้องถอดบอร์ดออกจากพอร์ต USB ก่อน จะมีข้อความบอกให้เสียบบอร์ดเข้าไป โดยต้องทำภายใน 60 วินาที
- เมื่อเสียบบอร์ดเข้าไปกับพอร์ต USB โปรแกรมจะโหลดโปรแกรมของเราลงบอร์ดแล้วรันโปรแกรมทันที ถ้าไม่มีอะไรผิดพลาดโปรแกรมก็จะทำงานตามที่ต้องการ
การต่อไอซีวัดอุณหภูมิ DS18B20
- ต่อ VCC (สายสีแดง) และ GND (สายสีดำ) ของเซ็นเซอร์เข้ากับบอร์ด Tiny85
- ต่อ สาย Data (สายสีเหลือง) เข้ากับพอร์ต P2 ขอบ Tiny85 ต้องต่อตัวต้านทาน 4.7K pull-up กับ VCC ด้วย
การต่อ Bluetooth HC-05
ฺBluetooth นี่ เอาไว้รับค่าจากบอร์ด Tiny85 แล้วส่งออกอากาศ เราสามารถใช้ เครื่องคอมพิวเตอร์ connect กับ Bluetooth เพื่อ ดูค่าอุณหภูมิได้
- ต่อ VCC และ GND กับบอร์ด Tiny85
- ต่อขา RX ของ HC-05 เข้ากับพอร์ต P3 ของ Tiny85
- Connect computer กับ Bluetooth ใช้รหัสผ่าน 1234 ฺ
- เปิดโปรแกรมที่รับส่งข้อมูลทาง Serial Port เช่นโปรแกรม HyperTerminal เซ็ต Baud Rate 9600
การต่อบอร์ดรีเลย์
เราจะต่อบอร์ดรีเลย์ เพื่อทำการตัดต่อเครื่องใช้ไฟฟ้าเมื่ออุณภูมิสูงกว่าที่กำหนด เลือกใช้รีเลย์ 5 โวลต์เพราะจะได้ไม่ต้องมีแหล่งจ่ายไฟหลายชุด แต่ดูท่าแล้วตัวที่ใช้จะไม่ค่อยทนเท่าไหร่ การต่อก็ต่อเข้ากับพอร์ต 0 (ลองต่อเข้าพอร์ต 5 แล้วบอร์ด Tiny85 หยุดทำงาน)
นี่คือโค๊ด
#include <SoftSerial.h> /* Allows Pin Change Interrupt Vector Sharing */
#include <TinyPinChange.h> /* Ne pas oublier d'inclure la librairie <TinyPinChange> qui est utilisee par la librairie <RcSeq> */
#include <OneWire.h>
SoftSerial mySerial(2, 3); // RX, TX
#define DS18S20_ID 0x10
#define DS18B20_ID 0x28
int temp;
int led = 1;
int relay = 0;
OneWire ds(2);
byte data[12];
byte addr[8];
char str[8];
boolean readTemperature(){
//find a device
if (!ds.search(addr)) {
ds.reset_search();
return false;
}
if (OneWire::crc8( addr, 7) != addr[7]) {
return false;
}
if (addr[0] != DS18S20_ID && addr[0] != DS18B20_ID) {
return false;
}
ds.reset();
ds.select(addr);
// Start conversion
ds.write(0x44, 1);
// Wait some time...
}
boolean getTemperature(){
byte i;
byte present = 0;
present = ds.reset();
ds.select(addr);
// Issue Read scratchpad command
ds.write(0xBE);
// Receive 9 bytes
for ( i = 0; i < 9; i++) {
data[i] = ds.read();
}
// Calculate temperature value
temp = ((data[1] << 8) + data[0] )*0.0625;
str[0] = (data[1]>>4) + 0x30;
str[1] = (data[1]&0xF) + 0x30;
str[2] = (data[0]>>4) + 0x30;
str[3] = (data[0]&0xF) + 0x30;
str[4] = 10;
str[5] = 0;
if (temp > 33) {
digitalWrite(led, HIGH);
digitalWrite(relay, HIGH);
} else {
digitalWrite(led, LOW);
digitalWrite(relay, LOW);
}
if (temp > 99)
{
str[0] = '1';
temp -= 100;
}
else {
str[0] = '0';
}
str[1] = temp/10 + 0x30;
str[2] = temp%10 + 0x30;
str[3] = 10;
str[4] = 0;
return true;
}
void setup(){
pinMode(led, OUTPUT);
pinMode(relay, OUTPUT);
mySerial.begin(9600);
delay(1000);
}
void loop(){
readTemperature();
delay(100);
getTemperature();
mySerial.write(str);
delay(10);
}
|
No comments:
Post a Comment