قياس التيار باستخدام مستشعر التيار Allegro ACS758 مع شاشة OLED طراز SSD1306 لأردوينو
سيرشدك هذا البرنامج التعليمي خلال عملية قياس التيار باستخدام مستشعر التيار Allegro ACS758 وعرض النتائج على شاشة OLED من طراز SSD1306. سيشمل المشروع قراءة التيار المتدفق عبر دائرة وتمثيل تلك البيانات بصريًا على شاشة الـOLED، مما يتيح مراقبة سهلة. ستتعلم كيفية توصيل المكونات، وكتابة الشيفرة، وفهم كيفية عمل كل شيء معًا.


إذا كنت ترغب في فهم الشفرة ووظيفتها، فتأكد من مشاهدة الفيديو للحصول على شروحات أكثر تفصيلاً (في الفيديو عند 02:45).
شرح الأجهزة
المكونات الأساسية لهذا المشروع تشمل مستشعر التيار Allegro ACS758 وشاشة OLED من نوع SSD1306. يعتبر ACS758 مستشعر تيار بتأثير هول يقيس التيار المار عبر موصل بدقة عالية ويعطي جهد خرج متناسبًا مع هذا التيار. يمكنه التعامل مع تيارات تصل إلى 200A ويعمل عند 3.3V أو 5V.
شاشة OLED من نوع SSD1306 هي شاشة مدمجة ومنخفضة الطاقة تتواصل عبر واجهة I2C. تُستخدم عادةً في مشاريع Arduino بسبب سهولة دمجها وقدرتها على عرض الرسوميات والنصوص بوضوح. معًا، تُشكّل هذه المكونات أداة قوية لمراقبة التيار في تطبيقات متنوعة.
تفاصيل ورقة البيانات
| المصنّع | أليجرو مايكروسيستمز |
|---|---|
| رقم القطعة | ACS758ECB-200U |
| جهد المنطق/المداخل والمخارج | 3.3 فولت / 5 فولت |
| جهد التغذية | 5 فولت |
| تيار الخرج (لكل قناة) | 200 أمبير |
| تيار الذروة (لكل قناة) | 200 أمبير |
| إرشادات تردد PWM | غير متوفر |
| عتبات منطق الإدخال | 0.3 فولت (منخفض)، 2.7 فولت (مرتفع) |
| هبوط الجهد / Rالمصرف-المصدر (في حالة التشغيل)/ التشبع | 0.05 فولت |
| الحدود الحرارية | -40 إلى 125 °C |
| حزمة | حزمة SOIC ذات 8 أطراف |
| ملاحظات / تنويعات | نماذج ثنائية الاتجاه وأحادية الاتجاه متاحة |
- تأكد من التوجيه الصحيح لمستشعر ACS758 لضمان قراءات دقيقة.
- استخدم مشتت حرارة إذا كنت تعمل بالقرب من حدود التيار القصوى لتجنّب السخونة الزائدة.
- عزل مصدر التغذية للمستشعر لضمان تشغيل مستقر
- تحقق من توصيلات الأسلاك لتجنب المداخل العائمة التي قد تؤدي إلى قراءات غير صحيحة.
- قم بمعايرة خرج المستشعر لضمان قياسات تيار دقيقة.
تعليمات التوصيل الكهربائي

لتوصيل حساس التيار Allegro ACS758 وشاشة OLED من نوع SSD1306، ابدأ بتوصيل الطاقة. وصل دبوس VCC الخاص بـ ACS758 بمخرج 5V في لوحة Arduino، ووصل دبوس GND بالأرضي (GND) في لوحة Arduino. يجب توصيل دبوس إشارة الخرج (Vout) من ACS758 بدبوس الإدخال التماثلي A0 في لوحة Arduino.
بعد ذلك، بالنسبة لشاشة OLED طراز SSD1306، قم بتوصيل دبوس VCC بمخرج 5V في الأردوينو ودبوس GND بالأرض. قم بتوصيل دبوس SDA في الشاشة إلى دبوس SDA في الأردوينو (A4 في معظم لوحات الأردوينو) ودبوس SCL في الشاشة إلى دبوس SCL (A5 في معظم اللوحات). تأكد من أن جميع التوصيلات محكمة لضمان عمل موثوق.
أمثلة على الشيفرة وشرح خطوة بخطوة
#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)في الكود، المتغيرVINتم تعيينه إلى الدبوس التناظري A0، الذي سيقرأ الجهد من مستشعر ACS758. الـVCCالمتغير يضبط جهد الإمداد، وmodelالمتغير يحدد أي طراز من ACS758 يتم استخدامه، مما يؤثر على الحساسية وحسابات جهد الخرج.
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
}ضمن الـloop()في الدالة، يقرأ الكود الجهد الخام من المستشعر باستخدامanalogRead(VIN)ويُحوَّل إلى قيمة تيار بناءً على الحساسية المحددة. هذا يتيح مراقبة التيار المتدفق عبر الدائرة في الوقت الفعلي.
if(abs(voltage) > cutOff) {
display.clearDisplay();
robojaxText("Current:", 0, 22, 2, false);
}تتحقق هذه العبارة الشرطية مما إذا كانت القيمة المطلقة للجهد أكبر منcutOffالحد. إذا كانت true، فسيتم مسح العرض وتحديث شاشة OLED بقراءة التيار الحالية. هذا يضمن عرض قيم التيار المهمة فقط، مما يمنع تكدس العناصر على الشاشة.
عرض توضيحي / ما الذي تتوقعه
عند تشغيل البرنامج، ستعرض شاشة OLED التيار قيد القياس في الوقت الحقيقي. إذا لم يتدفق تيار، ستعرض الشاشة عبارة لا يوجد تيار. تأكد من أن الوصلات صحيحة لتجنب مشاكل مثل عكس القطبية، والتي قد تؤدي إلى قراءات غير دقيقة (في الفيديو عند 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);
}
الأشياء التي قد تحتاجها
-
أمازوناشترِ OLED 128x32 من أمازونamzn.to
-
أمازونشراء شاشة OLED SSD1306 من أمازونamzn.to
-
علي إكسبريساشترِ شاشة OLED SSD1306 بحجم 128x32 من علي إكسبريسs.click.aliexpress.com
الموارد والمراجع
لا توجد موارد حتى الآن.
ملفات📁
مكتبات أردوينو (ملف مضغوط)
-
SSD1306-OLED-Adafruit_SSD1306-master
robojax-SSD1306-OLED-Adafruit_SSD1306-master.zip0.02 MB
Fritzing File
-
شاشة OLED أحادية 0.56 بوصة 128x32
OLED Mono 0.56 inch 128x32.fzpz0.01 MB -
شاشة OLED أحادية اللون 0.96 بوصة 128x64 I2C SSD1306
SSD1306 0.96in 128x64 I2C Monochrome OLED Display.fzpz0.01 MB
دليل المستخدم
-
دليل OLED SSD1306
robojax-SSD1306-OLED-manual.pdf1.79 MB