/* A4-SDA A5-SCL
internal Aref 328P 1.1V
A0 variable input voltage
A1 3.3V input
A2 5V input
A3 5v/2 divided by resistor 1:1
*/
#include <Adafruit_SSD1306.h>
#include <SPI.h>
#include <Wire.h>
Adafruit_SSD1306 display = Adafruit_SSD1306(128, 64, &Wire);
void setup() {
// put your setup code here, to run once:
//analogReference(INTERNAL);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.display();
display.clearDisplay();
//drawCourt();
}
void loop() {
// put your main code here, to run repeatedly:
/*
int Voltage_raw_A0 = analogRead(A0);
int Voltage_raw_A1 = analogRead(A1);
int Voltage_raw_A2 = analogRead(A2);
int Voltage_raw_A3 = analogRead(A3);
float Voltage_A0 = 4.2/1023.0*(float)Voltage_raw_A0;
float Voltage_A1 = 4.2/1023.0*(float)Voltage_raw_A1;
float Voltage_A2 = 4.2/1023.0*(float)Voltage_raw_A2;
float Voltage_A3 = 4.2/1023.0*(float)Voltage_raw_A3;
Serial.print("before mapping : ");
Serial.println( Voltage_raw_A0);
Serial.print("after mapping : ");
Serial.println( Voltage_A0);
//Serial.print("B0000 : ");
// Serial.println( Voltage_A0);
// delay(1000);
/* Serial.print("A1 : ");
Serial.println( Voltage_A1);
delay(1000);
Serial.print("A2 : ");
Serial.println( Voltage_A2);
delay(1000);
Serial.print("A3 : ");
Serial.println( Voltage_A3);
*/
int Voltage_raw_A0 = analogRead(A0);
float Voltage_A0 = 5/1023.0*(float)Voltage_raw_A0;
//float Voltage_A0 = 4.2/1023.0*(float)Voltage_raw_A0;
int Voltage_raw_A1 = analogRead(A1);
float Voltage_A1 = 5/1023.0*(float)Voltage_raw_A1;
Serial.println("before mapping : ");
Serial.println( Voltage_raw_A0);
Serial.println("after mapping : ");
Serial.println( Voltage_A0);
delay(1000);
delay(1000);
}
/*
https://kin.naver.com/qna/detail.naver?d1id=11&dirId=1118&docId=202090155&enc=utf8&kinsrch_src=pc_tab_kin&qb=7JWE65GQ7J2064W4IGFyZWY%3D&rank=14&search_sort=0§ion=kin.ext&spq=0
9V의 -극과 AVR의 GND를 연결 해야합니다.
배터리 전압은 변하므로 Aref로 사용할 수 없으며
우노에서 사용하는 328은 내부 레퍼런스 전압이 1.1V입니다.
1/9정도로 전압을 낮춰야하므로
9V +쪽에 8.2K, GND쪽에 1K 사용하면 1/9.2로 디바이더 됩니다.
1.1*9.2=10.12V까지 측정 가능한 회로가 됩니다.
이런 계측용 회로에서는 보통 1% 저항 사용합니다.
변환식은
int avc_vlaue;
avc_vlaue=ADCW; //ADC값을 읽은 후에
avc_vlaue=(int)( (float)avc_vlaue * 10.12 / 1023.0 );
이렇게하면 0~10V까지 얻을 수 있지만 소숫점 이하 한자리 값을 얻어야지 쓸만한 전압이 되겠죠
avc_vlaue=(int)( (float)avc_vlaue * 101.2 / 1023.0 );
이렇게하면 10배된 결과를 얻을 수 있습니다.
(배터리가 8.5V인 경우 85가 계산됩니다.)
2.배터리 저전압을 검출하려면 아두이노의 ADC를 통해서 검출을 가능하지만 몇가지 주의할 점이 있습니다.
아두이노보드에 Vref를 따로 걸어줄수 있는지 모르겠네요...
ADC가 내장된 마이컴의 경우 ADC의 기준전압(Vref)를 Vdd로 연결하거나,
외부 전원으로 연결하게끔 되어 있습니다.
만약 외부에서 걸수 있다면 여기에 3V정도의 LDO를 사용해 걸어주세요.
그리고 충전지는 위의 회로처럼 10k,10k를 사용해 1/2로 떨어뜨린후
ADC입력으로 받아 들이면 됩니다.
그럼 ADC출력 = (배터리 전압/2)/Vref x ADC양자화최대값 이 됩니다.
배터리입력전압/1.1
가령 ADC가 10bit라면 최대 1023까지 됩니다.
배터리 전압이 4V라고 하고 Vref에 3V를 걸었다면
ADC출력 = 2V/3V x 1023 = 682 라는 값이 나오죠...
배터리 전압이 3.3V이하가 되면 Low Battery로 인식하고 싶다면
ADC값이 562이하가 되면 동작을 멈추고 STOP mode로 간다든지 하면 됩니다.
https://wokwi.com/projects/304919215794553409
*/