log

水分センシング

f:id:maotown:20190930081614j:plain

 一般的な抵抗感知方式ではない、容量感知方式のセンサ。腐食が少ないとのこと。

 

リアルタイムクロックによる割り込み処理

他のサイトを参考にしても微妙に動かなかったのでメモ。

  • loop()関数の中でif(RTC.alarm(ALARM_1))でフラグ検出してリセット
  • コンパイラのマクロ__DATE__,__TIME__を用いて時刻設定する

 #include <DS3232RTC.h>

#include <TimeLib.h>

tmElements_t tm;
// __TIME__パース用関数
bool getTime(const char *str)
{
  int Hour, Min, Sec;
  if (sscanf(str, "%d:%d:%d"&Hour, &Min, &Sec) != 3return false;
  tm.Hour   = Hour;
  tm.Minute = Min;
  tm.Second = Sec + 12;   //★遅れ分補正★★★
  return true;
}
// __DATE__パース用関数
const char *monthName[12= {
  "Jan""Feb""Mar""Apr""May""Jun",
  "Jul""Aug""Sep""Oct""Nov""Dec"
};
bool getDate(const char *str)
{
  char Month[12];
  int Day, Year;
  uint8_t monthIndex;
  if (sscanf(str, "%s %d %d", Month, &Day, &Year) != 3return false;
  for (monthIndex = 0; monthIndex < 12; monthIndex++) {
    if (strcmp(Month, monthName[monthIndex]) == 0break;
  }
  if (monthIndex >= 12return false;
  tm.Day = Day;
  tm.Month = monthIndex + 1;
  tm.Year = CalendarYrToTm(Year);
  return true;
}

void setup() {
  Serial.begin(9600);
#if 0
  //コンパイラのマクロ__DATE__,__TIME__を用いて時刻設定。10秒ほどずれる。
  if (getDate(__DATE__) && getTime(__TIME__)) {
     RTC.set(makeTime(tm));
  }
#endif
 
  // initialize the alarms to known values, clear the alarm flags, clear the alarm interrupt flags
  RTC.setAlarm(ALM1_MATCH_DATE, 0001);
  RTC.setAlarm(ALM2_MATCH_DATE, 0001);
  RTC.alarm(ALARM_1);
  RTC.alarm(ALARM_2);
  RTC.alarmInterrupt(ALARM_1, false);
  RTC.alarmInterrupt(ALARM_2, false);
  RTC.squareWave(SQWAVE_NONE);

  setSyncProvider(RTC.get);    // the function to get the time from the RTC
  if (timeStatus() != timeSet)
    Serial.println("Unable to sync with the RTC");
  else
    Serial.println("RTC has set the system time");
  Serial.flush();

  RTC.setAlarm(ALM1_MATCH_SECONDS , 30001);
  RTC.alarm(ALARM_1);
  RTC.alarmInterrupt(ALARM_1, true);

  //setAlarm(ALARM_TYPES_t alarmType, byte seconds, byte minutes, byte hours, byte daydate)
  //RTC.setAlarm(ALM2_EVERY_MINUTE, 0, 0, 0, 1);    // daydate parameter should be between 1 and 7
  RTC.setAlarm(ALM2_MATCH_MINUTES, 5401);
  RTC.alarm(ALARM_2);                   // ensure RTC interrupt flag is cleared
  RTC.alarmInterrupt(ALARM_2, true);
}

void loop() {
  if(RTC.alarm(ALARM_1)) {  // ensure RTC interrupt flag is cleared  
    digitalClockDisplay(); 
  }
  if(RTC.alarm(ALARM_2)) {  // ensure RTC interrupt flag is cleared
 
  ・・・
  }
}

void digitalClockDisplay() {
  // digital clock display of the time
  setSyncProvider(RTC.get);    // the function to get the time from the RTC
  Serial.print(hour());
  printDigits(minute());
  printDigits(second());
  Serial.print(" ");
  Serial.print(day());
  Serial.print(" ");
  Serial.print(month());
  Serial.print(" ");
  Serial.print(year());
  Serial.print(" ");
  Serial.print(RTC.temperature() / 4.0); //These last few lines are the only other change to the the Time.h example!
  Serial.print((char)223);
  Serial.print('C');
  Serial.println();
}
void printDigits(int digits) {
  // utility function for digital clock display: prints preceding colon and leading 0
  Serial.print(":");
  if (digits < 10)
    Serial.print('0');
  Serial.print(digits);
}

ケイデンスレコーダー

前回のケイデンスメーターはいくつか課題があった。ケイデンスを表示してもなかなか見ない(見れない)。一瞬90rpmは出せるものの、1回のサイクリングでどれだけ平均ケイデンスが向上したのかわからない。

そこでSDカードに記録するようにして、ついでにGPSもつけてみた。軌跡はGoogleMapで表示できる。

5秒毎に回転数を記録している。鴨川を走行しているときは80rpmでているが、市街は80をキープするのが難しいことがわかる。

f:id:maotown:20190104221127j:plain

ケイデンスメーター

ペダルにつけた磁石をホールセンサで受けてArduinoでカウント。回転数(RPM)をOLEDディスプレイで表示。割り込みを使うとOLED表示中に文字が崩れるのでつかっていない。

f:id:maotown:20181130230228j:plain

 

 

 

 

圧電ブザーとは

電圧がかかると伸縮する圧電セラミックスによって音波に変える。

近年では内部電極とセラミックスを共焼結させる積層技術を応用し,数十μmのセラミック層と電極層を交互に数枚積層した圧電セラミック素子が実用化され,数 V の低電圧で駆動しても高音圧を発生することが可能になっている

http://www.ceramic.or.jp/museum/contents/pdf/life04.pdf

極性はないものが多い。Hi側に100Ωほどの抵抗を入れる。入れてない人も多い。
Arduinoで規定の周波数を出力する場合は、tone関数を使う
参考: https://fabkura.gitbooks.io/arduino-docs/content/chapter7.html
以下はキーボードを1-7に鍵盤を割り付けるプログラム

int buzzerPin = 9;
int cde[]={523,587,659,698,784,880,988};//音階周波数
void setup() {
  Serial.begin(9600);
//  pinMode(buzzerPin, OUTPUT); //ピンモードは設定しなくてよいらしい
}

void loop() {
  if(Serial.available()){
    char c = Serial.read();
    if( c>='1' && c<='7') {      
      tone(buzzerPin,cde[c-'1']);
    }
    else
      noTone(buzzerPin);
  }

液晶に文字表示


会社に落ちていたLCD(http://akizukidenshi.com/catalog/g/gP-00038/)。日立のHD44780のコンパチブルがデフォルトらしい。発売は2001年だがまだ現役。枯れた世界。Arduinoを使えば、接続後数分で文字表示できる。
ここ(http://marutsuparts.blog74.fc2.com/blog-entry-985.html)の通り接続する。LiquidCrystalサンプルそのままで動いてしまった。
f:id:maotown:20190112195754p:plain