Medição de corrente usando o sensor Allegro ACS758 com display OLED SSD1306 para Arduino
Este tutorial vai guiá-lo pelo processo de medir corrente usando o sensor de corrente Allegro ACS758 e exibir os resultados em um display OLED SSD1306. O projeto envolverá a leitura da corrente que flui por um circuito e a representação visual desses dados na tela OLED, permitindo um monitoramento fácil. Você aprenderá a conectar os componentes, escrever o código e entender como tudo funciona em conjunto.


Se você quer entender o código e seu funcionamento, não deixe de conferir o vídeo para explicações mais detalhadas (no vídeo em 02:45).
Hardware Explicado
Os principais componentes deste projeto incluem o sensor de corrente Allegro ACS758 e o display OLED SSD1306. O ACS758 é um sensor de corrente por efeito Hall que mede a corrente que flui através de um condutor com alta precisão e fornece uma tensão de saída proporcional a essa corrente. Ele pode suportar correntes de até 200A e opera tanto em 3.3V quanto em 5V.
O display OLED SSD1306 é compacto, de baixo consumo de energia e se comunica via I2C. É comumente usado em projetos com Arduino devido à sua facilidade de integração e à capacidade de exibir gráficos e texto com clareza. Juntos, esses componentes criam uma ferramenta poderosa para monitorar a corrente em diversas aplicações.
Detalhes da ficha técnica
| Fabricante | Allegro Microsystems |
|---|---|
| Número da peça | ACS758ECB-200U |
| Tensão lógica/E/S | 3.3 V / 5 V |
| Tensão de alimentação | 5 V |
| Corrente de saída (por canal) | 200 A |
| Corrente de pico (por canal) | 200 A |
| Orientação sobre a frequência PWM | Não aplicável |
| Limiares lógicos de entrada | 0.3 V (baixo), 2.7 V (alto) |
| Queda de tensão / RDS(on)/ saturação | 0,05 V |
| Limites térmicos | -40 a 125 °C |
| Pacote | SOIC-8 |
| Notas / variantes | Modelos bidirecionais e unidirecionais disponíveis |
- Garanta a orientação correta do sensor ACS758 para leituras precisas.
- Use um dissipador de calor se estiver operando próximo aos limites máximos de corrente para evitar o superaquecimento.
- Desacople a alimentação do sensor para operação estável.
- Verifique as conexões de fiação para evitar entradas flutuantes que possam causar leituras incorretas.
- Calibre a saída do sensor para garantir medições de corrente precisas.
Instruções de fiação

Para ligar o sensor de corrente Allegro ACS758 e o display OLED SSD1306, comece conectando a alimentação. Conecte o pino VCC do ACS758 à saída 5V do seu Arduino e conecte o pino GND ao terra (GND) do Arduino. O pino de sinal de saída (Vout) do ACS758 deve ser conectado ao pino de entrada analógica A0 do Arduino.
Em seguida, para o display OLED SSD1306, conecte o pino VCC à saída de 5V do Arduino e o pino GND ao terra. Conecte o pino SDA do OLED ao pino SDA do Arduino (A4 na maioria das placas Arduino) e o pino SCL do OLED ao pino SCL (A5 na maioria das placas Arduino). Certifique-se de que todas as conexões estejam seguras para um funcionamento confiável.
Exemplos de Código e Passo a Passo
#define VIN A0 // define the Arduino pin A0 as voltage input (V in)
const float VCC = 5.0; // supply voltage 5V or 3.3V
const int model = 2; // enter the model (see below)No código, a variávelVINestá atribuído ao pino analógico A0, que lerá a tensão do sensor ACS758. OVCCvariável define a tensão de alimentação, e amodelA variável define qual modelo ACS758 está sendo usado, o que afeta os cálculos de sensibilidade e de tensão de saída.
void loop() {
float voltage_raw = (5.0 / 1023.0) * analogRead(VIN); // Read the voltage from sensor
float current = voltage / FACTOR; // Calculate the current based on voltage
}Dentro doloop()função, o código lê a tensão bruta do sensor usandoanalogRead(VIN)e o converte em um valor de corrente com base na sensibilidade definida. Isso permite o monitoramento em tempo real da corrente que flui pelo circuito.
if(abs(voltage) > cutOff) {
display.clearDisplay();
robojaxText("Current:", 0, 22, 2, false);
}Esta instrução condicional verifica se o valor absoluto da tensão é maior do que ocutOfflimite. Se verdadeiro, limpa o visor e atualiza o OLED com a leitura atual de corrente. Isso garante que apenas valores de corrente significativos sejam exibidos, evitando sobrecarga de informações no visor.
Demonstração / O que esperar
Quando você executar o programa, o display OLED mostrará a corrente sendo medida em tempo real. Se não houver corrente fluindo, o display indicará "Sem Corrente". Certifique-se de que as conexões estejam corretas para evitar problemas como polaridade invertida, que podem levar a leituras imprecisas (no vídeo em 05:30).
/*
* Arduino Sketch for Allegro ACS758 Current Sensor with SSD1306 OLED Display
* can be used with 128x64 or 128x32 OLED displays with SSD1306 chip
* this sensor can measure current at a range of up to 200A
* It operates with 3.3V or 5V
* This video requires you to watch the following 2 videos before using this code:
* 1- ACS758 Sensor https://www.youtube.com/watch?v=SiHfjzcqnU4
* 2- SSD1306 OLED Display https://www.youtube.com/watch?v=UmYiHTOz-5k
*
* View the video instructions for this code at https://youtu.be/aHg9UrK9s9c
* Written by Ahmad Shamshiri for Robojax Video channel www.Robojax.com
* Date: June 24, 2018, at 21:44 in Ajax, Ontario, Canada
* Permission granted to share this code given that this
* note is kept with the code.
* Disclaimer: This code is "AS IS" and for educational purposes only.
* This code has been downloaded from https://robojax.com
*
*/
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);
#define NUMFLAKES 10
#define XPOS 0
#define YPOS 1
#define DELTAY 2
#define LOGO16_GLCD_HEIGHT 64
#define LOGO16_GLCD_WIDTH 128
static const unsigned char PROGMEM logo16_glcd_bmp[] =
{ B00000000, B11000000,
B00000001, B11000000,
B00000001, B11000000,
B00000011, B11100000,
B11110011, B11100000,
B11111110, B11111000,
B01111110, B11111111,
B00110011, B10011111,
B00011111, B11111100,
B00001101, B01110000,
B00011011, B10100000,
B00111111, B11100000,
B00111111, B11110000,
B01111100, B11110000,
B01110000, B01110000,
B00000000, B00110000 };
#if (SSD1306_LCDHEIGHT != 64)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif
///*** ACS758 settings starts
#define VIN A0 // define the Arduino pin A0 as voltage input (V in)
const float VCC = 5.0;// supply voltage 5V or 3.3V. If using PCB, set to 5V only.
const int model = 2; // enter the model (see below)
float cutOffLimit = 1.00;// reading cutt off current. 1.00 is 1 Amper
/*
"ACS758LCB-050B",// for model use 0
"ACS758LCB-050U",// for model use 1
"ACS758LCB-100B",// for model use 2
"ACS758LCB-100U",// for model use 3
"ACS758KCB-150B",// for model use 4
"ACS758KCB-150U",// for model use 5
"ACS758ECB-200B",// for model use 6
"ACS758ECB-200U"// for model use 7
sensitivity array is holding the sensitivity of the ACS758
current sensors. Do not change.
*/
float sensitivity[] ={
40.0,// for ACS758LCB-050B
60.0,// for ACS758LCB-050U
20.0,// for ACS758LCB-100B
40.0,// for ACS758LCB-100U
13.3,// for ACS758KCB-150B
16.7,// for ACS758KCB-150U
10.0,// for ACS758ECB-200B
20.0,// for ACS758ECB-200U
};
/*
* Quiescent output voltage is a factor of VCC that appears at the output
* when the current is zero.
* For bidirectional sensors it is 0.5 x VCC
* For unidirectional sensors it is 0.12 x VCC
* For model ACS758LCB-050B, the B at the end represents Bidirectional (polarity doesn't matter)
* For model ACS758LCB-100U, the U at the end represents Unidirectional (polarity must match)
* Do not change.
*/
float quiescent_Output_voltage [] ={
0.5,// for ACS758LCB-050B
0.12,// for ACS758LCB-050U
0.5,// for ACS758LCB-100B
0.12,// for ACS758LCB-100U
0.5,// for ACS758KCB-150B
0.12,// for ACS758KCB-150U
0.5,// for ACS758ECB-200B
0.12,// for ACS758ECB-200U
};
const float FACTOR = sensitivity[model]/1000;// set sensitivity for selected model
const float QOV = quiescent_Output_voltage [model] * VCC;// set quiescent Output voltage for selected model
float voltage;// internal variable for voltage
float cutOff = FACTOR/cutOffLimit;// convert current cut off to mV
//**** ACS758 settings ends
void setup() {
Serial.begin(9600);
// 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)
// init done
}
void loop() {
//Robojax.com ACS758 Current Sensor values start
float voltage_raw = (5.0 / 1023.0)* analogRead(VIN);// Read the voltage from sensor
voltage = voltage_raw - QOV + 0.003 ;// 0.007 is a value to make voltage zero when there is no current
float current = voltage / FACTOR;
if(abs(voltage) > cutOff ){
Serial.print("V: ");
Serial.print(voltage,3);// print voltage with 3 decimal places
Serial.print("V, I: ");
Serial.print(current,2); // print the current with 2 decimal places
Serial.println("A");
display.clearDisplay();
robojaxText("V:", 0, 0, 2, false);
String voltageS = String(voltage);// get voltage and convert it to string for display
robojaxText(voltageS +"V", 20, 0, 2, false);
robojaxText("Current:", 0, 22, 2, false);
String currentS = String(current);// get current and convert it to string for display
robojaxText(currentS +"A", 0, 40, 3, false);
display.display();
}else{
Serial.println("No Current");
display.clearDisplay();
robojaxText("No Current", 0, 0, 2, false);
display.display();
}
//Robojax.com ACS758 Current Sensor values end
delay(500);
}
/*
* robojaxText(String text, int x, int y,int size, boolean d)
* text is the text string to be printed
* x is the integer x position of the text
* y is the integer y position of the text
* size is the text size, 1, 2, 3 etc
* d is either true or false. Use true to display immediately.
*/
void robojaxText(String text, int x, int y,int size, boolean d) {
display.setTextSize(size);
display.setTextColor(WHITE);
display.setCursor(x,y);
display.println(text);
if(d){
display.display();
}
delay(100);
}
Coisas que você pode precisar
-
AmazonasCompre o SSD1306 OLED na Amazonamzn.to
-
AmazonasCompre OLED 128x32 na Amazonamzn.to
-
AliExpressCompre o SSD1306 OLED 128x32 da AliExpresss.click.aliexpress.com
Recursos e referências
Ainda não há recursos.
Arquivos📁
Bibliotecas do Arduino (zip)
-
SSD1306-OLED-Adafruit_SSD1306-master
robojax-SSD1306-OLED-Adafruit_SSD1306-master.zip0.02 MB
Arquivo Fritzing
-
OLED Mono 0,56 polegadas 128x32
OLED Mono 0.56 inch 128x32.fzpz0.01 MB -
Display OLED Monocromático SSD1306 0,96in 128x64 I2C
SSD1306 0.96in 128x64 I2C Monochrome OLED Display.fzpz0.01 MB
Manual do Usuário
-
Manual do SSD1306 OLED
robojax-SSD1306-OLED-manual.pdf1.79 MB