Wednesday, June 17, 2015

First experiment with Tiny85 Arduino

ทดลองเล่นบอร์ด Arduino DigiSpark Tiny85 ขนาดจิ๋ว มี 6 I/O ให้ใช้  ซื้อบอร์ดมาจากอีเบย์  preload มาด้วย Bootloader ทำให้ง่ายต่อการพัฒนาโปรแกรม
    การเตรียมโปแกรม (สำหรับ Windows)
  1. ดาวน์โหลด Arduino และ Driver สำหรับบอร์ดจาก ที่นี่
  2. Unzip ไฟล์ที่โหลดมาแล้วเข้าไปที่ โฟลเดอร์ DigisparkWindowDriver แล้วรันโปรแกรม InstallDriver.exe
  3. ไปที่โฟลเดอร์ Digispark-Arduino-1.0.4 แล้วรัน Arduino
  4. ใน Arduino ให้เลือกบอร์ดเป็น Digispark (Tiny Core) เลือก Programmer เป็น Digispark แล้วเลือก Serial Port ให้ถูกต้อง
  5. เปิดไฟล์ตัวอย่างมาลองเล่นดู เริ่มจาก Blink ก่อน เปลี่ยนพอร์ตของ LED เป็น พอร์ต 1
  6. ก่อน Load โปรแกรม จะต้องถอดบอร์ดออกจากพอร์ต USB ก่อน จะมีข้อความบอกให้เสียบบอร์ดเข้าไป โดยต้องทำภายใน 60 วินาที
  7. เมื่อเสียบบอร์ดเข้าไปกับพอร์ต USB โปรแกรมจะโหลดโปรแกรมของเราลงบอร์ดแล้วรันโปรแกรมทันที  ถ้าไม่มีอะไรผิดพลาดโปรแกรมก็จะทำงานตามที่ต้องการ

    การต่อไอซีวัดอุณหภูมิ DS18B20 
  1. ต่อ VCC (สายสีแดง)  และ GND (สายสีดำ) ของเซ็นเซอร์เข้ากับบอร์ด Tiny85 
  2. ต่อ สาย Data (สายสีเหลือง) เข้ากับพอร์ต P2 ขอบ Tiny85 ต้องต่อตัวต้านทาน 4.7K pull-up กับ VCC ด้วย

    การต่อ Bluetooth HC-05
        ฺBluetooth นี่ เอาไว้รับค่าจากบอร์ด Tiny85 แล้วส่งออกอากาศ  เราสามารถใช้ เครื่องคอมพิวเตอร์ connect กับ Bluetooth เพื่อ ดูค่าอุณหภูมิได้
  1. ต่อ VCC และ GND กับบอร์ด Tiny85
  2. ต่อขา RX ของ HC-05 เข้ากับพอร์ต P3 ของ Tiny85
  3. Connect computer กับ Bluetooth ใช้รหัสผ่าน 1234 ฺ
  4. เปิดโปรแกรมที่รับส่งข้อมูลทาง 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