#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#include <Q2HX711.h>

const byte MPS_OUT_pin = 3; // Pino de dados OUT
const byte MPS_SCK_pin = 2; // Pino de dados do relógio
Q2HX711 MPS20N0040D(MPS_OUT_pin, MPS_SCK_pin); // começa a comunicação com o HX710B

#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define OLED_RESET     8 // Reset pin # (or -1 if sharing Arduino reset pin)

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

int avg_size = 10; // #pontos para calcular a média

  //Variáveis globais
float level = 0.0;
uint32_t avg_val = 0.0; // variável para média

void setup() {

  Serial.begin(9600);
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  // inicia a comunicação com o display OLED
}

void loop() {



  for (int ii=0;ii<avg_size;ii++){
    avg_val += MPS20N0040D.read(); // adicionar várias leituras de ADC
    delay(10); // atraso entre as leituras
  }
  avg_val /= avg_size;  
   
  level=map(avg_val,9320675, 9323008, 0, 1000); //dimensiona o valor analógico para um pixel imprimível no limite da tela
  level=(level/10.0);
  
  Serial.print(level, 1); // a adição de ", 1" define a qte de casas decimais
  Serial.println(" %");showData();


  
}
// fim do Loop

//===========================================================================

// Funções avulsas chamadas dentro do código
void showData() { 
  display.clearDisplay();

  display.setTextColor(WHITE);
  display.setTextSize(1);   
  display.setCursor(2, 2);
  display.print("Raw: ");
  display.print(avg_val);
  display.setTextSize(2);
  display.setCursor(35, 25);
  display.print("nivel");
  display.setCursor(30, 45);
  display.print(level);
  display.print(" %");

  display.display();  
  }