Помогите разобраться с кодом
- Войдите на сайт для отправки комментариев
Втр, 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/
Спасибо, посмотрю.
Решил не заморачиваться с переопределениями массивов и сделал по другому. Вроде работает :)