aruduinoの不思議な動作

バッファオーバーフロー

aruduinoで電圧計を作っていたらanalogMinのif文が無視されて常にanalogMinが更新されてしまいました。

 #include <LiquidCrystal.h>
 LiquidCrystal lcd(7, 8, 9, 10, 11, 12);
void setup() {
  // put your setup code here, to run once:
  
  lcd.begin(16, 2);
  lcd.clear();

  Serial.begin(9600);
  Serial.print("sirial start");
}

  int analog = 0;
  long analogMax = 0;
  long analogMin = 1000;
  float volt = 0;

void loop() {
  // put your main code here, to run repeatedly:

    analog =  analogRead(1);
    volt = (analog / 1023.0 * 5.0) ;
    delay(200);

// analogMaxとanalogMinを更新
  if(analog > analogMax){
    analogMax = analog;
  }
  if(analog <= analogMin){
    analogMin = analog;
  }

  

  char voltage[4];
  dtostrf(volt,4,2,voltage);      //小数を文字列に変換 dtostrf(小数,全体の文字数,小数点以下の文字数,文字)
  char str[2][16];    //0を入れずに必要数用意しないとオーバーフローする
  
  sprintf(str[0] , "%4d   Max %4d",analog , analogMax );
  sprintf(str[1] , "%4s V Min %4d",voltage , analogMin );

  
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print(str[0]);

  lcd.setCursor(0,1);
  lcd.print(str[1]);
  
  Serial.print(str[0]);
  Serial.print("  ");
  Serial.print(str[1]);
  Serial.print("\n");


}

原因はcara str[1][15]と書いていたためバッファオーバーフローしていたようです。

計算

抵抗計を作っているときに抵抗値の答えが違っていました
回路:5V -- (測りたい抵抗) -- A4 -- (抵抗1K) -- GND

  int analog = 0;
  int ohm = 1000;
  double testohm = 0;
  int volt = 0;

〜〜〜

  analog = analogRead(4);
  testohm = ohm  / analog * 1023  - ohm ;

このプログラムで1Kの抵抗を測ったとき
analog 512
testohm 23.00
になりました。
原因はohm / analog がint同士の計算で答えもint型になるため小数点以下が切り捨てられたからだったみたいです。
testohm = (double)ohm / analog * 1023 - ohm ;
double型を指定して計算すると
analog 512
testohm 998.05
計算できました。