Arduino / 3.3V_5Vdetector


Arduino

■ページ内リンク 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

1.概要(summary)

Arduinoから3.3V,5Vを検出しログをとる装置。

主要デバイス(Main devices)
(1)Arduino Nano 16MHz 5V I/F

1-1.ハードウェアセットアップ(hard ware set up)

下図のような構成を考える。

#ref(): File not found: "AR_SPI1.png" at page "Arduino/3.3V_5Vdetector"


1-2.タイミングチャート

#ref(): File not found: "ff.png" at page "Arduino/3.3V_5Vdetector"


1-3.ピン一覧(pins assigned table)

ピンアサインは下記の通り。省略したが途中でレベル変換が必要。
CS:D10--->CS#:1pin
SCK:13pin--->SCK:6pin
MIS:12pin<---SO:2pin
MOS:11pin--->SI:5pin

1-4.ソースコード(source code)

#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);
}