• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
OLED
#1
Witam
Ten program wyświetla U1 dwa razy, a powinien raz.
Mam 3 rzędy
U1
U2
U1
Powinno być 2
U1
U2


Kod:
//https://github.com/makertut/oled-progressbar
//https://www.youtube.com/watch?v=Xb4rAxsjavo
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define OLED_RESET 4
//``````Adafruit_SSD1306 display(OLED_RESET);

TwoWire Wire2 (2, I2C_FAST_MODE); // PB10, PB11
#define Wire Wire2
#define OLED_RESET     4
Adafruit_SSD1306 display(128, 32, &Wire, 4);

int  analog_value1 = 0;
int U1 = 0;
int  analog_value2 = 0;
int U2 = 0;

void setup() {
  // by default, we'll generate the high voltage from the 3.3v line internally! (neat!)
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  // initialize with the I2C addr 0x3D (for the 128x64)
  Serial.begin(115200);
}
void loop() {
  analog_value1 = analogRead(PA6);
  U1 = (analog_value1 * 3.3) / 4.096;

  analog_value2 = analogRead(PA7);
  U2 = (analog_value2 * 3.3) / 4.096;


  display.clearDisplay();
  drawPercentbar( 0, 0, 128, 15, analogRead(PA1) / 40);
  drawPercentbar( 0, 20, 128, 15, analogRead(PA2) / 40);

  display.display();


  delay(100);
}

void drawPercentbar(int x, int y, int width, int height, int progress)
{
  //progress = progress > 100 ? 100 : progress;
  progress = progress > 128 ? 128 : progress;
  progress = progress < 0 ? 0 : progress;
  float bar = ((float)(width - 4) / 100) * progress;

  //display.drawRect(x, y, width, height, WHITE);
  display.fillRect(x + 2, y + 2, bar , height - 4, WHITE);

  // Display progress text
  if ( height >= 10) {
    display.setCursor((width / 2) - 3, y + 5 );
    display.setTextSize(1);
    display.setTextColor(WHITE);

    if ( progress >= 50)
      display.setTextColor(BLACK, WHITE); // 'inverted' text
    display.print(U1 );
    ////////////////
    display.setCursor((width / 2) - 3, y + 15 );
    display.print(U2);
    ////////////////

  }
}
 
Odpowiedź
#2
Faktycznie dziwne, bo wywołujesz funkcję drawPercentbar dwa razy, w każdej drukuje U1 i U2, to powinno być w sumie 4 rzędy, może sie nie mieszczą na ekranie?
 
Odpowiedź
#3
bo mam 2 bary , jeden dla U1 drugi dla U2
 
Odpowiedź
#4
(23-01-2024, 17:36)zak napisał(a): bo mam 2 bary , jeden dla U1 drugi dla U2

Ale w pojedynczym wywołaniu funkcji wypisujesz i U1 i U2. Może zamiast kodu, który robi co napisałeś, przedstaw co chciałeś napisać - czyli "założenia projektu".
Wołasz funkcje dla y=0 i y=20, a funkcja wypisuje coś we współrzędnych y+5 i y+15, czyli wypisujesz 4 razy - dla y = 5,15,25 i 35. Po deklaracji wnioskuje, że wyświetlacz ma 128x32.
 
Odpowiedź
#5
Photo 
0, 20 = 2 bars
5,15 = cyfry = wartość U1 i U2
wyświetlacz 128x32.
Chce zrobić cos takiego, tylko 2 rzędy, i zamiast procentów wartość napięcia . 
   
 
Odpowiedź
#6
(23-01-2024, 18:11)zak napisał(a): 0, 20 = 2 bars
5,15 = cyfry = wartość U1 i U2
wyświetlacz  128x32.
Chce zrobić cos takiego, tylko 2 rzędy, i zamiast procentów wartość napięcia . 

Tak czy inaczej, skoro funkcja ma rysować jeden bar to nie może brać wartości do wypisania ze zmiemmych globalnych bo nie wie z której. Najproście i "najczyściej" przekazać tą wartość jako kolejny parametr. W jednym wywołaniu przekazujesz tam U1, w drugim U2. Szczególnie, że wypełnienie jest chyba zupełnie niezależnie od tych U1/U2 - czytasz to z innego wejścia.
Kod:
  drawPercentbar( 0, 0, 128, 15, analogRead(PA1) / 40, U1);
  drawPercentbar( 0, 20, 128, 15, analogRead(PA2) / 40, U2);
W bibliotece Arduino jest taka funkcja jak map - ona transformuje wartość z jednego zakresu na proporcjonalną wartość z drugiego - to przeliczenie na wolty.
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości