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。