■ページ内リンク Link to internal page
1.概要 summary
1-1.ハードウェアセットアップ(hard ware set up)
1-2.タイミングチャート timing chart
1-3.ピン一覧 pin assigned table
1-4.ソースコード source code by arduino(prossecing)
1-5.シリアルモニタプロット displayed serial monitor prompt
Arduinoから3.3V,5Vを検出しログをとる装置。
主要デバイス(Main devices)
(1)Arduino Nano 16MHz 5V I/F
下図のような構成を考える。
#ref(): File not found: "AR_SPI1.png" at page "Arduino/3.3V_5Vdetector"
#ref(): File not found: "ff.png" at page "Arduino/3.3V_5Vdetector"
ピンアサインは下記の通り。省略したが途中でレベル変換が必要。 CS:D10--->CS#:1pin SCK:13pin--->SCK:6pin MIS:12pin<---SO:2pin MOS:11pin--->SI:5pin
#include <SD.h> //SDのライブラリ使用 #include <Wire.h> //Wire(I2C)のライブラリ使用 const int DS1307_ADDRESS=0x68;int val=0; //I2Cのアドレス選択 const int BUTTON =7; //push botton to 7 byte command; //command 定義 int valb = 0 ; //入力ピンの状態がこの変数に記憶 int valb_old = 0 ;//入力前回値を記憶 int status = 1 ;//ステータス ログ出力 // イーサーネットシールドは 4 const int chipSelect = 4; void setup() { pinMode(BUTTON,INPUT); //buttonは入力に設定 // シリアルポート初期化 Serial.begin(115200); //I2C初期化 Wire.begin(); Serial.flush(); while (!Serial) { ; // USBケーブルが接続されるのを待つ。 } Serial.print(F("Initializing SD card...")); // SSピン(Unoは10番、Megaは53番)は使わない場合でも出力にする必要あり。 // そうしないと、SPIがスレーブモードに移行し、SDライブラリが動作しない。 pinMode(SS, OUTPUT); // SDライブラリを初期化 if (!SD.begin(chipSelect)) { Serial.println(F("Card failed, or not present")); // 失敗、何もしない while(1); } Serial.println(F("ok.")); } void loop() { analogWrite(3, 64); valb = digitalRead(BUTTON); //入力を読み取り、valbに格納 delay(60);//60msec // ファイルを開く if((valb == HIGH)&&(valb_old == LOW)) {File dataFile = SD.open("datalog.txt", FILE_WRITE); status = 1 ; //もしファイルが開けたら値を書き込む if(status == 1); Wire.beginTransmission(DS1307_ADDRESS); Wire.write(val); Wire.endTransmission(); Wire.requestFrom(DS1307_ADDRESS,7); byte r_sec=Wire.read(); byte r_minute=Wire.read(); byte r_hour=Wire.read(); byte r_day_of_week=Wire.read(); byte r_date=Wire.read(); byte r_month=Wire.read(); byte r_year=Wire.read(); dataFile.print(r_year,HEX); dataFile.print("/"); dataFile.print(r_month,HEX); dataFile.print("/"); dataFile.print(r_date,HEX); dataFile.print(" "); dataFile.print(r_hour,HEX); dataFile.print(":"); dataFile.print(r_minute,HEX); dataFile.print(":"); dataFile.println(r_sec,HEX); //下記2行。余分なデータは出力しない。これでExcelの日付データフォーマットと同じになる。上記"秒"の出力後改行(println) // dataFile.print(" smtwtfs= "); // dataFile.println(r_day_of_week,HEX); dataFile.close(); // シリアルポートにも出力 printTime(); delay(20); valb_old = valb ; } // ファイルが開けなかったらエラーを出力 else { // Serial.println(F("error opening datalog.txt")); } //チャタリングが起きた場合も入力トリガとして認識してしまうのを防止するため、下記を追加。 if((valb == LOW)&&(valb_old == HIGH)) { valb_old =0 ; } delay(20); status = 0 ; // 0.01秒待つ delay(10); if(Serial.available()){ command=Serial.read(); if(command==0x74){ //"t"=0x74 setTime(); } Serial.println(command); if(command==0x64){ //"d"=0x64 setDay(); printTime(); delay(10); } } } void setTime(){ byte hour=(Serial.read()<<4); hour=hour+(Serial.read() & 0x0F); byte minute=(Serial.read()<<4); minute=minute+(Serial.read() & 0x0F); byte sec=(Serial.read()<<4); sec=sec+(Serial.read() & 0x0F); Wire.beginTransmission(DS1307_ADDRESS); Wire.write(val); Wire.write(sec); Wire.write(minute); Wire.write(hour); Wire.endTransmission(); } void setDay(){ byte year=(Serial.read() <<4); year=year+(Serial.read() & 0x0F); byte month=(Serial.read() <<4); month=month+(Serial.read() & 0x0F); byte day=(Serial.read() <<4); day=day+(Serial.read() & 0x0F); byte day_of_week=(Serial.read() & 0x07); Wire.beginTransmission(DS1307_ADDRESS); Wire.write(0x03); Wire.write(day_of_week); Wire.write(day); Wire.write(month); Wire.write(year); Wire.endTransmission(); } void printTime(){ Wire.beginTransmission(DS1307_ADDRESS); Wire.write(val); Wire.endTransmission(); Wire.requestFrom(DS1307_ADDRESS,7); byte r_sec=Wire.read(); byte r_minute=Wire.read(); byte r_hour=Wire.read(); byte r_day_of_week=Wire.read(); byte r_date=Wire.read(); byte r_month=Wire.read(); byte r_year=Wire.read(); Serial.print(r_year,HEX); Serial.print("/"); Serial.print(r_month,HEX); Serial.print("/"); Serial.print(r_date,HEX); Serial.print(" "); Serial.print(r_hour,HEX); Serial.print(":"); Serial.print(r_minute,HEX); Serial.print(":"); Serial.print(r_sec,HEX); Serial.print(" smtwtfs= "); Serial.println(r_day_of_week,HEX); }