Помогите разобраться с кодом

skodec
Offline
Зарегистрирован: 26.07.2015

Как уже писал ранее я только начинаю изучать ардуинку. Сейчас пытаюсь освоить 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);
}

 

киноман
Offline
Зарегистрирован: 26.12.2014

Я тоже первоклашка в ардуино

есть проект где реалижована идея показа заряда на дисплее может вам поможек

http://radiokot.ru/konkursCatDay2014/47/

skodec
Offline
Зарегистрирован: 26.07.2015

Спасибо, посмотрю.

Решил не заморачиваться с переопределениями массивов и сделал по другому. Вроде работает :)

#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);
}