2011年12月26日 星期一

用16*2 LCD顯示SHT-15的結果

程式碼如下
/*
 * SHT-15 - 4
 */
#include <SHT1x.h>
#include <LiquidCrystal.h>

LiquidCrystal lcd( 7, 8, 9, 10, 11, 12 );
SHT1x sht1x( 6, 5 );

void setup() {
  lcd.begin( 16, 2 );
  lcd.print( "SHT-15 - 4" );
  Serial.begin( 9600 );
}

String getWeather() {
  float temp_c, temp_f, humidity;
  String result = "";
  temp_c = sht1x.readTemperatureC();
  temp_f = sht1x.readTemperatureF();
  humidity = sht1x.readHumidity();
  result.concat( (long) temp_c );
  result += "C,";
  result.concat( (long) temp_f );
  result += "F,";
  result.concat( (long) humidity );
  result += "%";
  return result;
}

void loop() {
  lcd.setCursor( 0, 1 );
  lcd.print( getWeather() );
  Serial.println( "Running..." );
  delay( 1000 );
}

2011年12月20日 星期二

SHT-15 - 2 把SHT-15讀到的數據存到SD Card

事實顯示鼓起勇氣把4x USD的SHT-15焊下去之前,只能用手按住。
首次用Fritzing的成果,用MicroSD Shield取代WaveShare那個MicroSD板子。自己弄了一個SHT-15的component,設定connections好累,不過SHT-15圖好像選太大張。
#include <SD.h>
#include <SHT1x.h>

/*
 * SHT 15 - 3
 */
 
#define DataPin 6    // DATA
#define ClockPin 5   // SCK
#define CSPIN 10 // SD CS pin

SHT1x sht1x( DataPin, ClockPin );
File myLogFile;

void setup() {
  Serial.begin( 9600 );
  Serial.print( "Initializing SD card..." );
  pinMode( 10, OUTPUT );
  
  if( !SD.begin( CSPIN ) ) {
    Serial.println( "initialization faild!" );
    return;
  }
  Serial.println( "initialization done." );
}

void loop() {
  float temp_c, temp_f, humidity;
  String log_msg = "";
  
  temp_c = sht1x.readTemperatureC();
  temp_f = sht1x.readTemperatureF();
  humidity = sht1x.readHumidity();
  
  log_msg.concat( (long) temp_c );
  log_msg += ",";
  log_msg.concat( (long) temp_f );
  log_msg += ",";
  log_msg.concat( (long) humidity );
  myLogFile = SD.open( "sht15.txt", FILE_WRITE );
  if( myLogFile ) {
    Serial.println( "Writing..." );
    myLogFile.println( log_msg );
    myLogFile.close();
    Serial.println( log_msg );
    Serial.println( "done." );
  } else {
    Serial.println( "error opening sht15.txt" );
  }
  
  delay( 1000 );
}

看SD卡上的檔案~~ 讀到負值的就是因為手沒按著SHT-15,還是要焊啊~~
氣象站記錄竟然沒有時間,下一步玩玩看能不能玩得起來PCF8563P...

MicroSD Card板子 - 1

照的糊糊的,明亮的
接法都一樣,踹了很久都是Initial Failed,甚至還改接Sparkfun買的MicroSD shield看看。結果寢室熄燈睡覺前的一踹,竟然可以,又多搞了一個小時才睡。
  • Uno pin 13 to CLK
  • Uno pin 12 to MISO(DO)
  • Uno pin 11 to MOSI(DI)
初步測試就用SD Library的Example改成MicroSD板子的CS接到Uno的pin,這樣跑跑看。

2011年12月12日 星期一

SHT15 - 1

從sparkfun買的SHT-15總算漂洋過海到台灣~~
40 USD的東西我還焊不下去,怕焊壞掉。
#include 

/*
 * SHT 15 - 1
 */
 
#define DataPin 11    // DATA
#define ClockPin 12   // SCK

SHT1x sht1x( DataPin, ClockPin );

void setup() {
  Serial.begin( 9600 );
}

void loop() {
  float temp_c, temp_f, humidity;
  
  temp_c = sht1x.readTemperatureC();
  temp_f = sht1x.readTemperatureF();
  humidity = sht1x.readHumidity();
  
  Serial.print( "Temperature: " );
  Serial.print( temp_c, 2 );
  Serial.print( "C / " );
  Serial.print( temp_f, 2 );
  Serial.print( "F. Humidity: " );
  Serial.print( humidity );
  Serial.println( "%" );
  
  delay( 1000 );
}

因為手不靈活,所以調整一下比較適合自己插線,和跟著練習那篇差的pin不一樣。
沒想到台北租屋的溼度竟然65%以上
複製練習自這篇

2011年12月8日 星期四

IRremote 2

940nm紅外線發射器

手邊沒有100ohm電阻用4.7ohm擋著用

/**
 * IRRemote 2
 */
#include 
#include 

#define BtnPin 2
int buttonState = 0;
// IRremote的IR發射器只能裝在pin 3
IRsend irsend;

void setup() {
  pinMode( BtnPin, INPUT );
  Serial.begin( 9600 );
}

void loop() {
  buttonState = digitalRead( BtnPin );
  
  if( buttonState == HIGH ) {
    Serial.println( "GoGoGo" );
    irsend.sendNEC( 0x2FF00FF, 32 );
  }
}
送出去的訊號就是之前用接收器,讀取冷氣機遙控,由IRremote解出來的protocol的來送。
這玩具越玩越想買樂高機器人...@@"

2011年12月7日 星期三

IRremote 1

買的時候據說是ROHM的,根據ROHM網站,腳位由左至右分別是Rout, GND, Vcc。
很奇怪,房東的東元冷氣是吃NEC的Protocol~~

2011年12月6日 星期二

小書和74HC595N的作業

Arduino小書兩枚
兩顆Shift Register控制10 pin LED Bar 一
兩顆Shift Register控制10 pin LED Bar 二
我實在沒天賦把線剪的弄的一模一樣照起來又漂亮又整齊(@@")。用兩個shift register來控制10 pin LED Bar,這樣就只會用到Arduino Uno三個Pin(不算Vcc和GND)。目前體驗到關鍵點在於
  1. Shift Register的接法,第一顆的Q7' (Q7S)腳位接到第二顆的DS腳位,第二顆的ST_CP, SH_CP都分別和第一顆接起來。
  2. 要送出去的資料會用到highByte()lowByte這兩個method,順序是high byte部分先送,再送low byte。
void loop() {
  
  // 1024 = 2^10
  for( int numberToDisplay = 0; numberToDisplay < 1024; numberToDisplay++ ) {
    byte high_byte = highByte( numberToDisplay );
    byte low_byte = lowByte( numberToDisplay );
    Serial.println( numberToDisplay );
    digitalWrite( LATCH_PIN, LOW );
    // bitOrder: which order to shift out the bits; either MSBFIRST or LSBFIRST.
    // (Most Significant Bit First, or, Least Significant Bit First)
    shiftOut( DATA_PIN, CLOCK_PIN, MSBFIRST, high_byte );
    shiftOut( DATA_PIN, CLOCK_PIN, MSBFIRST, low_byte );
    
    digitalWrite( LATCH_PIN, HIGH );
    
    delay( 500 );
  }
}
弄好已經太晚就沒有繼續做加上可變電阻將analogRead()的值透過map()把比例顯示在LED Bar上。

2011年12月1日 星期四

Keypad - 4*3 數字鍵盤

從ICShopping買的4*3 Keypad
正面
背面
我這種懶惰的傢伙當然沒按照官方網站Keypad的說明裡的測每個pin的組合,我是直接接線然後看從結果和接線去調整出正確的接法。(外行人嘛)
/*
 * Keypad 1
 */
#define NumRows 4
#define NumCols 3
#define DebounceTime 20
const char keymap[NumRows][NumCols] = {
  { '1', '2', '3' },
  { '4', '5', '6' },
  { '7', '8', '9' },
  { '*', '0', '#' }
};

// pins
const int rowPins[ NumRows ] = { 5, 4, 3, 2 };
const int colPins[ NumCols ] = { 8, 7, 6 };
程式的其他部分是拿小歐的Arduino Cookbook第一版 5.5 Reading a Keypad來的。

Mac OS X安裝Arduino third-party libraries

後來買了一個現在很容易撞機的NB...殘念,除了現在很容易撞機之外,Mac OS X還真是個不錯用的OS,活生生把ubuntu擠到第二名...。玩Arduino的時候安裝third-party提供的library安裝的路徑在/Applications/Arduino.app/Contents/Resources/Java/libraries,也可以看上面Finder的截圖。
把下載的library unzip到那個目錄下,通常重新啓動Arduino application就可以在Sketch > Import Library...找到剛剛安裝的library。

2011年11月29日 星期二

傾斜感測器

不知道為啥買的brick...。水平的時候透過analogRead()會讀取到最大的值,開始傾斜之後讀取到的值就會變小。
哈!覺得這種玩具比玩圍棋要多花錢很多錢

2011年11月22日 星期二

Ultrasonic Ranging Module - HC-SRO4 + Arduino

超音波距離感測器,我買的是兩顆眼睛、四隻腳的HC-SRO4(正面如下圖)
HC-SRO4正面看由左至右的腳分別是
  • Vcc
  • Trig
  • Echo
  • Gnd
眼前程度體會的重點有兩個,一個是自己透過Trig, Echo完成一個Ping完成一次發送/接收超音波測距的動作,針對Trig送10 microsecond的HIGH訊號出去,然後SRO4就會送出8個40kHz的square wave出去,當訊號回來的時候,我們透過pulseIn()取得Echo pin HIGH pulse的時間;另一個是距離的計算根據datasheet說明的Echo back pulse width(這裡是Echo Pin由LOW -> HIGH -> LOW的時間) microseconds除上58就是距離(cm),除上148就是inch的距離。

Lab 1 - 結果送出Serial Port

/**
 *  Ultrasonic 1: 超音波測距 秀在Serial Port 9600
 */
#define TrigPin 10
#define EchoPin 13

long ping() {
  // PING
  digitalWrite( TrigPin, LOW );
  delayMicroseconds( 2 );
  digitalWrite( TrigPin, HIGH );
  delayMicroseconds( 10 );
  digitalWrite( TrigPin, LOW );
  return pulseIn( EchoPin, HIGH );
}

void setup() {
  pinMode( TrigPin, OUTPUT );
  pinMode( EchoPin, INPUT );
  Serial.begin( 9600 );
}

void loop() {
  long duration, cm;
  String result = "Distance: ";

  duration = ping();
  cm = duration / 58;
  result += cm;
  result += " (cm).";
  Serial.println( result );
  delay( 1500 );
}
終於買了其他顏色的單芯線,那就紅色是高電位、黑色接Gnd、其他顏色就接訊號,還沒想說input/output用啥顏色來區分。
換個角度再照一張

Lab 2 - 結果顯示在16*2 LCD

2011年11月17日 星期四

analogWrite()

因為調整晚上班表,所以昨天只有一項作業,做完之後,看英文之前,踹一下Manning書上這個表的東西。
Table: Arduino analog resolution and pins (from Arduino in Action)
Analog Input Analog Output
Resolution 10 bits (0~1023) 8 bits (0~254)
Votage Range 0~5 (Volts) 0~5 (Volts)
Arduino Pins A0~A5 Digit Pins 3, 5, 6, 9. 10, 11
Arduino Mega Pins A0~A15 Digit Pins 0~13
在做之前的作業中,由Language Documents知道digitWrite(pin, value)第二個參數是HIGH/LOW;analogWrite(pin, value)。然後很無聊的做兩個練習,分別針對digit pin 13/11使用analogWrite()
/**
 * Analog out on Digit Pin 13 test
 */
const int ledPin = 13;

void setup() {
  pinMode( ledPin, OUTPUT );
}

void loop() {
  for( int i=0; i<10; i++ ) {
    analogWrite( ledPin, 54+(i*20) );
    delay( 1000 );
  }
}
可以看到pin 13沒有亮度的差別。接著把線路改成接到digit pin 11和程式ledPin改成11,燒進去之後跑一下看看,就可以看到LED的亮度會變化。

2011年11月16日 星期三

Serial port控制LED發光的作業

使用Serial Port透過Arduino Uno來控制LED的開關的作業。
Listing. Code
/**
 * Serial Library: Read 2 - Control LED
 */
int incomingByte = 0;
const int ledPin = 13;

void setup() {
  pinMode( ledPin, OUTPUT );
  Serial.begin( 9600 );
  Serial.println( "'L' turn on, 'l' turn off" );
}

void loop() {
  if( Serial.available() > 0 ) {
    incomingByte = Serial.read();
    
    // input 'L'
    if( incomingByte == 76 ) {
      Serial.println( "LED on!!" );
      digitalWrite( ledPin, HIGH );
    }
    // inpit 'l'
    if( incomingByte == 108 ) {
      Serial.println( "LED off!!" );
      digitalWrite( ledPin, LOW );
    }
  }
}

2011年11月11日 星期五

新玩具

Arduino Uno

今年的新玩具~~玩不起樂高機器人就先玩這個。自己動手做看得到的東西,即使是簡單的LED, 可變電阻的組合的作業都覺得特別有fu。基礎先玩好,再來玩其他sensor和玩具...Make雜誌真是讚~~

PS. 看了一堆shield之後,覺得玩這個也不便宜 哈