2017-10-09 6 views
0

이상한 행동을보고 있는데, 이제 이것이 Arduino UNO 또는 내 코드와 연결된 것이 있는지 이해하고 싶습니다.Arduino가 1.5V 배터리에 대해 잘못된 전압을 표시합니다.

저는 Arduino를 사용하여 간단한 1.5V 배터리의 전압을 측정하고 있습니다.
그래서 직렬 모니터는 1.5V 대신 1V 전압을 표시합니다 (전압계는 배터리로부터 1.5V를 보여줍니다).
2 개의 배터리를 직렬로 연결하면 직렬 모니터에 3V가 표시됩니다.

누군가가 무슨 일이 일어 났는지 설명해주세요.

이 내 아두 이노 코드 :

float voltage; 
float batteryIn; 

void setup(){ 
    Serial.begin(9600); 
} 

void loop(){ 

    batteryIn = analogRead(0); 
    float voltage2 = (float)map(batteryIn, 0, 1023, 0, 5); 
    Serial.println(voltage2); 
    delay(50); 
} 

그래서 하나의 배터리로 1V를 보여줍니다 (그러나 1.5V이어야 함).
2 개의 직렬 연결 배터리의 경우 3V가 정확한지 확인하십시오.

+0

지도 함수는 long 유형 만 반환한다고 생각합니다. 따라서 부동 소수점 형변환 일 경우 소수점 자리는 이미 사라졌습니다. float return을 사용하여 자체 매핑 함수를 만들어야합니다. –

+0

시도 : float voltage2 = (float) batteryIn * 5.000/1024.000; 여전히 정확히 같은 값 – haykp

+0

을 얻었습니다. 이제 1.7V가됩니다. – haykp

답변

4

map 기능은이 long 인수를 받아 그것이 long을 반환 의미하는 long 유형으로 운영하고 있습니다.
정수를 부동 소수점 값에 캐스팅하면 마술처럼 10 진수 값을 갖지 않습니다.

float로 작동하는지도 함수를 구현해야합니다. 귀하의 경우에는

float voltage2 = mapf(batteryIn, 0, 1023, 0, 5); 

float mapf(float x, float in_min, float in_max, float out_min, float out_max) 
{ 
    return (x - in_min) * (out_max - out_min)/(in_max - in_min) + out_min; 
} 

당신은 또한 표현을 단순화하고 인라인을 사용할 수 있습니다.

float voltage2 = batteryIn * 5.0/1023.0; 
+0

지금은 1.5V 대신 1.7V가됩니다 ((( – haykp

+0

) 아마도 대부분의 문제는 arduino와 연결되어 있습니다. 디버깅/수정 방법은 무엇입니까? – haykp

+0

이 코드는 문제를 해결하지 못했습니다. 십진법 .1.5V 대신에 1.7V를 얻는 것도 또 다른 문제이다. 나는이 코드가 가정하는 Arduino에 5V 전원이 공급되지 않는다고 생각한다. 전압계를 사용하여 GND와 VCC 사이의 전압을 확인한다. –