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
計算できました。
その他
前回のSpaceBucketですが抵抗値は1000ohm(水やり直後)~6000ohm(乾いてる時)ぐらいでした。