Помогите разобраться с кодом
- Войдите на сайт для отправки комментариев
Втр, 04/08/2015 - 11:30
Как уже писал ранее я только начинаю изучать ардуинку. Сейчас пытаюсь освоить OLED дисплей. Столкнулся с вот какой проблемой. Хочу чтобы на дисплее отображался уровень батарейки(как в телефоне).Но никак не могу правильно написать код, чтобы в нем по значению VCC выбирался один из массивов уровня батарейки. Помогите советом пожалуйста.
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
static const unsigned char PROGMEM bat2 []= { //24x16 66%
0,0,0,
63,255,255,
63,255,255,
48,0,3,
48,30,123,
240,30,123,
240,30,123,
240,30,123,
240,30,123,
240,30,123,
240,30,123,
48,30,123,
48,0,3,
63,255,255,
63,255,255,
0,0,0
};
static const unsigned char PROGMEM bat3 []= { //24x16 100%
0,0,0,
63,255,255,
63,255,255,
48,0,3,
55,158,123,
247,158,123,
247,158,123,
247,158,123,
247,158,123,
247,158,123,
247,158,123,
55,158,123,
48,0,3,
63,255,255,
63,255,255,
0,0,0
};
static const unsigned char PROGMEM bat1 []= { //24x16 33%
0,0,0,
63,255,255,
63,255,255,
48,0,3,
48,0,123,
240,0,123,
240,0,123,
240,0,123,
240,0,123,
240,0,123,
240,0,123,
48,0,123,
48,0,3,
63,255,255,
63,255,255,
0,0,0
};
static const unsigned char PROGMEM bat0 []= { //24x16 0%
0,0,0,
63,255,255,
63,255,255,
48,0,3,
48,0,3,
240,0,3,
240,0,3,
240,0,3,
240,0,3,
240,0,3,
240,0,3,
48,0,3,
48,0,3,
63,255,255,
63,255,255,
0,0,0
};
#define OLED_MOSI 9
#define OLED_CLK 10
#define OLED_DC 11
#define OLED_CS 12
#define OLED_RESET 7
Adafruit_SSD1306 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
static unsigned char batn[48];
float result;
long readVcc() {
// Read 1.1V reference against AVcc
// set the reference to Vcc and the measurement to the internal 1.1V reference
#if defined(__AVR_ATmega32U4__) || defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
ADMUX = _BV(REFS0) | _BV(MUX4) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
#elif defined (__AVR_ATtiny24__) || defined(__AVR_ATtiny44__) || defined(__AVR_ATtiny84__)
ADMUX = _BV(MUX5) | _BV(MUX0);
#elif defined (__AVR_ATtiny25__) || defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny85__)
ADMUX = _BV(MUX3) | _BV(MUX2);
#else
ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
#endif
delay(75); // Wait for Vref to settle
ADCSRA |= _BV(ADSC); // Start conversion
while (bit_is_set(ADCSRA,ADSC)); // measuring
uint8_t low = ADCL; // must read ADCL first - it then locks ADCH
uint8_t high = ADCH; // unlocks both
result = (high<<8) | low;
//result = 1125300L / result; // Calculate Vcc (in mV); 1125300 = 1.1*1023*1000
result = 1138.6 / result; // Calculate Vcc (in V); 1138.6 = 1.113*1023
}
void setup() {
Serial.begin(9600);
display.begin(SSD1306_SWITCHCAPVCC);
display.clearDisplay();
}
void loop() {
readVcc();
if(result>=3.4)
{
batn=bat3;
}
if(result>=3.2 && result<3.4 )
{
batn=bat2;
}
if(result>=3.0 && result<3.2 )
{
batn=bat1;
}
if(result<3.0 )
{
batn=bat0;
}
display.clearDisplay();
display.drawBitmap(100,0,batn,24,16,WHITE);
display.display();
delay(2000);
}
Я тоже первоклашка в ардуино
есть проект где реалижована идея показа заряда на дисплее может вам поможек
http://radiokot.ru/konkursCatDay2014/47/
Спасибо, посмотрю.
Решил не заморачиваться с переопределениями массивов и сделал по другому. Вроде работает :)
#include <SPI.h> #include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> static const unsigned char PROGMEM bat2 []= { //24x16 66% 0,0,0, 63,255,255, 63,255,255, 48,0,3, 48,30,123, 240,30,123, 240,30,123, 240,30,123, 240,30,123, 240,30,123, 240,30,123, 48,30,123, 48,0,3, 63,255,255, 63,255,255, 0,0,0 }; static const unsigned char PROGMEM bat3 []= { //24x16 100% 0,0,0, 63,255,255, 63,255,255, 48,0,3, 55,158,123, 247,158,123, 247,158,123, 247,158,123, 247,158,123, 247,158,123, 247,158,123, 55,158,123, 48,0,3, 63,255,255, 63,255,255, 0,0,0 }; static const unsigned char PROGMEM bat1 []= { //24x16 33% 0,0,0, 63,255,255, 63,255,255, 48,0,3, 48,0,123, 240,0,123, 240,0,123, 240,0,123, 240,0,123, 240,0,123, 240,0,123, 48,0,123, 48,0,3, 63,255,255, 63,255,255, 0,0,0 }; static const unsigned char PROGMEM bat0 []= { //24x16 0% 0,0,0, 63,255,255, 63,255,255, 48,0,3, 48,0,3, 240,0,3, 240,0,3, 240,0,3, 240,0,3, 240,0,3, 240,0,3, 48,0,3, 48,0,3, 63,255,255, 63,255,255, 0,0,0 }; #define OLED_MOSI 9 #define OLED_CLK 10 #define OLED_DC 11 #define OLED_CS 12 #define OLED_RESET 7 Adafruit_SSD1306 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS); //unsigned int batn[48]; float result; unsigned int a; long readVcc() { // Read 1.1V reference against AVcc // set the reference to Vcc and the measurement to the internal 1.1V reference #if defined(__AVR_ATmega32U4__) || defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) ADMUX = _BV(REFS0) | _BV(MUX4) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1); #elif defined (__AVR_ATtiny24__) || defined(__AVR_ATtiny44__) || defined(__AVR_ATtiny84__) ADMUX = _BV(MUX5) | _BV(MUX0); #elif defined (__AVR_ATtiny25__) || defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny85__) ADMUX = _BV(MUX3) | _BV(MUX2); #else ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1); #endif delay(75); // Wait for Vref to settle ADCSRA |= _BV(ADSC); // Start conversion while (bit_is_set(ADCSRA,ADSC)); // measuring uint8_t low = ADCL; // must read ADCL first - it then locks ADCH uint8_t high = ADCH; // unlocks both result = (high<<8) | low; //result = 1125300L / result; // Calculate Vcc (in mV); 1125300 = 1.1*1023*1000 result = 1138.6 / result; // Calculate Vcc (in V); 1138.6 = 1.113*1023 } void akb() { if(result>=3.4) { display.drawBitmap(100,0,bat3,24,16,WHITE); } if(result>=3.2 && result<3.4 ) { display.drawBitmap(100,0,bat2,24,16,WHITE); } if(result>=3.0 && result<3.2 ) { display.drawBitmap(100,0,bat1,24,16,WHITE); } if(result<3.0 ) { display.drawBitmap(100,0,bat0,24,16,WHITE); } } void setup() { Serial.begin(9600); display.begin(SSD1306_SWITCHCAPVCC); display.clearDisplay(); } void loop() { readVcc(); display.clearDisplay(); akb(); display.display(); delay(2000); }