果報は寝て待て: 4月 2020

2020年4月19日日曜日

Arduinoで高度計をつくろう その3

次に、タクトスイッチを押すとその時の高度を記憶し、その高度との差(相対値)を表示するようにしました。
プログラムです。

  1. #include <Wire.h>
  2. #include <LPS.h>
  3. #include <LiquidCrystal.h>
  4. #define set_pin   7 //7番ピンをset_pinと命名する
  5. LiquidCrystal lcd = LiquidCrystal(12,11,10,5,4,3,2);
  6. LPS ps;
  7. void setup()
  8. {
  9.   Serial.begin(9600);
  10.   Wire.begin();
  11.   lcd.begin(16, 2);
  12.   pinMode(set_pin,INPUT_PULLUP) ;  //set_pinを入力ピンでプルアップにする
  13.  
  14.   if (!ps.init())
  15.   {
  16.     Serial.println("Failed to autodetect pressure sensor!");
  17.     while (1);
  18.   }
  19.   ps.enableDefault();
  20.  
  21. }
  22. void loop()
  23. {
  24.   int i;
  25.   int set;                   //set_pinの状態
  26.   float altitude = 0;        //高度
  27.   float rel_altitude ;        //高度の相対値
  28.   float set_altitude ;        //セットしたときの高度
  29.   float disp_altitude;        //表示中の絶対値高度
  30.   float pressure = 0;        //気圧
  31.   float pressureave = 0;     //平均気圧
  32.   float temperature = 0;     //気温
  33.   for (i = 0; i < 1000; i++){
  34.    pressureave = pressureave + ps.readPressureMillibars();
  35.    pressure =  ps.readPressureMillibars();
  36.    altitude = altitude + ps.pressureToAltitudeMeters(pressure);
  37.    temperature = temperature + ps.readTemperatureC();
  38.    delay(5);
  39.   }
  40.   pressureave = pressureave /1000;
  41.   disp_altitude = altitude /1000;
  42.   temperature = temperature /1000;
  43.   set = digitalRead(set_pin);
  44.    if (set == LOW) {     // ボタンが押されていたら、
  45.    set_altitude = disp_altitude;  //disp_altitudeをset_altitudeに代入する
  46.   }
  47.  
  48.   rel_altitude = disp_altitude - set_altitude ; //高度の相対値を計算
  49.   Serial.print("p: ");
  50.   Serial.print(pressureave);
  51.   Serial.print(" mbar\ta: ");
  52.   Serial.print(disp_altitude);
  53.   Serial.print(" m\tset: ");
  54.   Serial.print(set_altitude);
  55.   Serial.print(" m\trel: ");
  56.   Serial.print(rel_altitude);
  57.   Serial.print(" m\tt: ");
  58.   Serial.print(temperature);
  59.   Serial.println(" deg C");
  60.   lcd.setCursor(0,0);                   // 液晶へ表示
  61.   //lcd.print("p: ");
  62.   lcd.print(pressureave,0);                   
  63.   lcd.print("mbr ");
  64.   lcd.print(temperature,1);
  65.   lcd.print(" deg C");
  66.  
  67.   lcd.setCursor(0,1);          //液晶の2行目に表示
  68.   lcd.print("a:");
  69.   lcd.print(disp_altitude,1);    
  70.   lcd.print("m");
  71.   lcd.print(" r:");
  72.   lcd.print(rel_altitude,1);    
  73.   lcd.print("m     ");
  74.  
  75.  
  76.  
  77.   delay(100);
  78. }
  79.  
デジタルの7ピンにタクトスイッチをつけました。
相対値をゼロmにするにはタクトスイッチを5秒以上押す必要があります…
シリアルモニタでの表示は成功です。

LCDでは、aは絶対値高度で、rが相対値高度となります。
あとは持ち運び可能にするだけです。


2020年4月18日土曜日

Arduinoで高度計をつくろう その2

次の課題は、LCDへの表示です。
 
 その前に、0.1秒ごとに表示されても見にくいだけなので、平均値を5秒にまったりと表示してくれるよう、プログラムをアベレージ表示にします。


  1. #include <Wire.h>
  2. #include <LPS.h>
  3. LPS ps;
  4. void setup()
  5. {
  6. Serial.begin(9600);
  7. Wire.begin();
  8. if (!ps.init())
  9. {
  10. Serial.println("Failed to autodetect pressure sensor!");
  11. while (1);
  12. }
  13. ps.enableDefault();
  14. }
  15. void loop()
  16. {
  17. int i;
  18. float altitude = 0;
  19. float pressure = 0;
  20. float pressureave = 0;
  21. float temperature = 0;
  22. for (i = 0; i < 1000; i++){
  23. pressureave = pressureave + ps.readPressureMillibars();
  24. pressure = ps.readPressureMillibars();
  25. altitude = altitude + ps.pressureToAltitudeMeters(pressure);
  26. temperature = temperature + ps.readTemperatureC();
  27. delay(5);
  28. }
  29. pressureave = pressureave /1000;
  30. altitude = altitude /1000;
  31. temperature = temperature /1000;
  32. Serial.print("p: ");
  33. Serial.print(pressureave);
  34. Serial.print(" mbar\ta: ");
  35. Serial.print(altitude);
  36. Serial.print(" m\tt: ");
  37. Serial.print(temperature);
  38. Serial.println(" deg C");
  39. delay(100);
  40. }
それからLCD表示です。
スケッチ→ライブラリをインクルード →ライブラリを管理 でlcdを検索します。
「LiquidCrystal」をインストールします。


#include <Wire.h>
#include <LPS.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd = LiquidCrystal(12,11,10,5,4,3,2);

LPS ps;

void setup()
{
  Serial.begin(9600);
  Wire.begin();
  lcd.begin(16, 2);
  
  
  if (!ps.init())
  {
    Serial.println("Failed to autodetect pressure sensor!");
    while (1);
  }

  ps.enableDefault();
}

void loop()
{
  int i;
  float altitude = 0;        //高度
  float pressure = 0;        //気圧
  float pressureave = 0;     //平均気圧
  float temperature = 0;     //気温

  for (i = 0; i < 1000; i++){
   pressureave = pressureave + ps.readPressureMillibars();
   pressure =  ps.readPressureMillibars();
   altitude = altitude + ps.pressureToAltitudeMeters(pressure);
   temperature = temperature + ps.readTemperatureC();
   delay(5);
  }
  pressureave = pressureave /1000;
  altitude = altitude /1000;
  temperature = temperature /1000;


  
  Serial.print("p: ");
  Serial.print(pressureave); 
  Serial.print(" mbar\ta: ");
  Serial.print(altitude);
  Serial.print(" m\tt: ");
  Serial.print(temperature);
  Serial.println(" deg C");

  lcd.setCursor(0,0);                   // 液晶へ表示
  //lcd.print("p: ");
  lcd.print(pressureave,0);                    
  lcd.print("mbr ");
  lcd.print(temperature,1);
  lcd.print(" deg C");

  lcd.setCursor(0,1);
  lcd.print("alt: ");
  lcd.print(altitude,2);     
  lcd.print(" m");

  delay(100);
}




温度表示での「18.2 deg  C」のところ、最後のCが桁数が足りず、表示できてませんが気にしません。

 
かなりごちゃごちゃしてきました。

2020年4月14日火曜日

Arduinoで高度計をつくろう

 最近、山歩きしてます。
ひょんなことで、高度計の必要を感じました。

買うという選択肢はなく、家にあるもので作ることにしました。
 目指す仕様
  ① 持ち運びできる。(液晶表示、バッテリー式)
  ② できれば、分解能1mくらいほしい
  ③ 絶対値だけでなく、相対値(ある地点から何メートル下がった)がほしい
  
 ということで、ネットでしらべました。ラジオペンチさんのアナログ高度計、すごい人がいるものです。百均の時計であんなものまで作れるとは。

 こちらは、歩きながら、立ち止まって高度を確認、また歩いて高度を確認という使い方を想定してますので、表示は家に転がってる16文字x2行のLCDを使います。 
 秋月電子で買ったやつです。
Arduino uno R3も買いました。本当は家にころがってるpicマイコン(10年前くらいに購入してしばらく遊んだやつ)と思ったのですが、参考情報が桁違いに少なく、時代はArduinoに変わってしまってました

気圧センサーは秋月電子でいいのを買いました。
LPS25HB 
精度:±0.1hPa(25℃)、±1hPa(0~80℃)
これなら600mの生駒山で1mの違いを検知してくれそうです。
Arduino IDEでスケッチ→ライブラリをインクルード→ライブラリを管理の画面で 「POLOLU lps」を検索すると「LPS」がヒットしますので「インストール」をクリックします。
内容は以下のとおりです。


  1. #include <Wire.h>
  2. #include <LPS.h>
  3. LPS ps;
  4. void setup()
  5. {
  6. Serial.begin(9600);
  7. Wire.begin();
  8. if (!ps.init())
  9. {
  10. Serial.println("Failed to autodetect pressure sensor!");
  11. while (1);
  12. }
  13. ps.enableDefault();
  14. }
  15. void loop()
  16. {
  17. float pressure = ps.readPressureMillibars();
  18. float altitude = ps.pressureToAltitudeMeters(pressure);
  19. float temperature = ps.readTemperatureC();
  20. Serial.print("p: ");
  21. Serial.print(pressure);
  22. Serial.print(" mbar\ta: ");
  23. Serial.print(altitude);
  24. Serial.print(" m\tt: ");
  25. Serial.print(temperature);
  26. Serial.println(" deg C");
  27. delay(2000);
  28. }
ArduinoとLPS25HBの接続方法です。



実際の配線です。
信号線は2本ですっきりしてるのですが、5vを3.3vに変換する必要があるためすこしごちゃごちゃしてます。




「マイコンボードに書き込む」の後、ツール→シリアルモニタをクリックして立ち上げますと、

だーっと表示されます。
わしの家は海底やったのか。
結構簡単に使えました。