Дисплей не показывает вывод - ваттметр Arduino
Я уже какое-то время играю с этим кодом, я могу показать результаты на ЖК-дисплее 16X2, но не могу сделать это на OLED-дисплее.
вот код
#include <SPI.h>
#include <Wire.h>
#include "U8glib.h" //Библиотека для отображения
U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_NONE); // Интерфейс I2C для OLED
int index = 0; // размер массива
const int number_of_readings = 200; //общее количество показаний, которые arduino берет перед тем, как усреднить
const int current_zero = 510; //начальное значение тока от ардуино с 0 ампер
int current_reading[number_of_readings]; //создаем массив для current_reading
int voltage_reading[number_of_readings]; //создаем массив для voltage_reading
float R1=30000; //сопротивление R1 в датчике напряжения
float R2=7500; //сопротивление R2 в датчике напряжения
float current_average = current_zero; //начальное значение текущего среднего
float current_total = 0; //начальное значение current_total
float voltage_average = 0; //начальное значение voltage_average
float voltage_total = 0; //начальное значение voltage_total
int x = 0;
int row = 0;
float voltage = 0.1;
void setup() {
Serial.begin(9600);
pinMode(A4,INPUT_PULLUP);
pinMode(A5, INPUT_PULLUP);
}
void draw(void) {
u8g.setFont(u8g_font_fub14r);
{
u8g.drawStr(0, 20, "V: ");
u8g.drawStr(0, 40, "A: ");
u8g.drawStr(0, 60, "Watt: ");
u8g.setPrintPos(58,20);
u8g.print( Bat_Volt,2);
u8g.println("V");
u8g.setPrintPos(58,40);
u8g.print( current,0);
u8g.println("mA");
u8g.setPrintPos(58, 60);
u8g.print( power ,1);
}
}
void loop() {
voltage_reading[index]=analogRead(A0); //читаем показания напряжения с контакта A0 (значение 0-1023)
voltage_total = voltage_total + voltage_reading[index]; //добавляем напряжение к voltage_total
current_reading[index]=analogRead(A3); //читаем текущее значение с вывода A3 (значение 0-1023)
current_total = current_total + current_reading[index]; // добавить текущий к current_total
index = index + 1;
if (index >=number_of_readings) { //после того, как вы прочитали number_of_reading, создайте среднее значение всех снятых показаний
current_average=current_total/number_of_readings;
voltage_average=voltage_total/number_of_readings;
Serial.print("Current average=");
Serial.print(current_average);
Serial.print(" Voltage average=");
Serial.println(voltage_average);
current_total=0;
voltage_total=0;
index=0;
}
float voltage = ((5*(voltage_average)*(R1+R2))/(1023*R2)); //преобразование единичного значения voltage_average (0-1023) в фактическое напряжение, вычитание среднего значения напряжения, если не следует считывать напряжение
float current_mV = (current_average-current_zero)*5; //преобразование единичного значения current_average(0-1023) в показание мВ, вычитание значения surrent_average, когда не нужно считывать ток
float current = current_mV/185; //датчик рассчитан на 185 мВ/ампер в соответствии с pdf, может потребоваться изменение в зависимости от калибровки
float power = (voltage*current); //рассчитываем мощность
u8g.firstPage();
do {
draw();
} while( u8g.nextPage() );
}
Функция кода заключается в считывании данных с «Модуля датчика тока диапазона ACS712 — 30 А» и «Модуля датчика обнаружения напряжения». Дисплей представляет собой «0,96-дюймовый модуль OLED-дисплея 128x64 — SPI / I2C — 7 контактов», он преобразуется в I2C и работает с другими кодами. Плата: Ардуино Уно Максимальное входное напряжение будет 12,8 В постоянного тока. Код должен отображать напряжение сверху, ампер посередине и использование ватт внизу. Но он не работает при редактировании для OLED-дисплея.
Кто-нибудь, сделайте этот код рабочим. Я новичок в C+ и программировании, поэтому мне нужна подробная помощь.
Вот код, который работал с ЖК-дисплеем 16X2
#include <LiquidCrystal.h>
#include <Wire.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
/*The circuits
* LCD RS pin to digital pin 12
* LCD enable pin to digital pin 11
* LCD D4 pin to digital pin 5
* LCD D5 pin to digital pin 4 21333333
* LCD D6 pin to digital pin 3
*
* LCD D7 pin to digital pin 2
* LCD R/W pin to ground
* 10K resistor
* ends to +5V and ground
* wiper to LCD VO pin (pin 3)
*/
byte lightning[8] = {
B00001,
B00110,
B01100,
B11000,
B00011,
B00110,
B01100,
};
int index = 0; // размер массива
const int number_of_readings = 200; //общее количество показаний, которые arduino берет перед тем, как усреднить
const int current_zero = 510; //начальное значение тока от ардуино с 0 ампер
int current_reading[number_of_readings]; //создаем массив для current_reading
int voltage_reading[number_of_readings]; //создаем массив для voltage_reading
float R1=30000; //сопротивление R1 в датчике напряжения
float R2=7500; //сопротивление R2 в датчике напряжения
float current_average = current_zero; //начальное значение текущего среднего
float current_total = 0; //начальное значение current_total
float voltage_average = 0; //начальное значение voltage_average
float voltage_total = 0; //начальное значение voltage_total
void setup (){
Serial.begin (9600);
lcd.begin(16,2); // размер LCD
lcd.createChar(6,lightning); //создаем символ по имени молния
//НАЧАЛЬНОЕ СООБЩЕНИЕ
lcd.setCursor (3,0); // устанавливаем курсор на строку 0, столбец 3
lcd.print(" "); // ЖК-принт
lcd.print("Arduino"); // ЖК-принт
lcd.setCursor(1,1); // устанавливаем курсор на строку 1, столбец 1
lcd.write(6); //ЖК-дисплей записывает символ 6 (молния)
lcd.print("Power Meter"); // lcd.print
lcd.write(6); //ЖК-дисплей записывает символ 6 (молния)
delay(5000); // задержка на 5 секунд
lcd.clear(); // очистить ЖК-экран
}
void loop() {
voltage_reading[index]=analogRead(A0); //читаем показания напряжения с контакта A0 (значение 0-1023)
voltage_total = voltage_total + voltage_reading[index]; //добавляем напряжение к voltage_total
current_reading[index]=analogRead(A3); //читаем текущее значение с вывода A3 (значение 0-1023)
current_total = current_total + current_reading[index]; // добавить текущий к current_total
index = index + 1;
if (index >=number_of_readings) { //после того, как вы прочитали number_of_reading, создайте среднее значение всех снятых показаний
current_average=current_total/number_of_readings;
voltage_average=voltage_total/number_of_readings;
Serial.print("Current average=");
Serial.print(current_average);
Serial.print(" Voltage average=");
Serial.println(voltage_average);
current_total=0;
voltage_total=0;
index=0;
}
float voltage = ((5*(voltage_average)*(R1+R2))/(1023*R2)); //преобразование единичного значения voltage_average (0-1023) в фактическое напряжение, вычитание среднего значения напряжения, если не следует считывать напряжение
float current_mV = (current_average-current_zero)*5; //преобразование единичного значения current_average(0-1023) в показание мВ, вычитание значения surrent_average, когда не нужно считывать ток
float current = current_mV/185; //датчик рассчитан на 185 мВ/ампер в соответствии с pdf, может потребоваться изменение в зависимости от калибровки
float power = (voltage*current); //рассчитываем мощность
lcd.clear(); // вывод значений напряжения, тока и мощности на ЖК-экран
lcd.setCursor(0,0);
lcd.print(voltage);
lcd.print("V");
lcd.print (" ");
lcd.print(current);
lcd.print("A");
lcd.setCursor(0,1);
lcd.print(power);
lcd.print("W");
delay(1);
}
@Shijil, 👍1
Обсуждение1 ответ
В скетче
void draw(void)
{
u8g.setFont(u8g_font_fub14r);
u8g.drawStr(0, 20, "V: ");
u8g.drawStr(0, 40, "A: ");
u8g.drawStr(0, 60, "Watt: ");
u8g.setPrintPos(58,20);
u8g.print( Bat_Volt,2);
u8g.println("V");
u8g.setPrintPos(58,40);
u8g.print( current,0);
u8g.println("mA");
u8g.setPrintPos(58, 60);
u8g.print( power ,1);
}
current, power, Bat_Volt — локальные переменные, определенные в функции loop
. Bat_Volt даже не определен в вашем скетче, поэтому они ничего не печатают в функции draw
.
Затем инициализируйте как глобальную переменную
в своем скетче и на месте, если Bat_Volt вы использовали здесь напряжение float voltage = ((5*(voltage_average)*( R1+R2))/(1023*R2)); //конвертируем единичное значение voltage_average (0-1023) в фактическое напряжение, вычитаем среднее значение напряжения, если в вашем скетче не должно быть считано значение напряжения
.
Исправьте это на.
Ваш код после редактирования:
#include <SPI.h>
#include <Wire.h>
#include "U8glib.h" //Библиотека для отображения
U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_NONE); // Интерфейс I2C для OLED
int index = 0; // размер массива
const int number_of_readings = 200; //общее количество показаний, которые arduino берет перед тем, как усреднить
const int current_zero = 510; //начальное значение тока от ардуино с 0 ампер
int current_reading[number_of_readings]; //создаем массив для current_reading
int voltage_reading[number_of_readings]; //создаем массив для voltage_reading
float R1=30000; //сопротивление R1 в датчике напряжения
float R2=7500; //сопротивление R2 в датчике напряжения
float current_average = current_zero; //начальное значение текущего среднего
float current_total = 0; //начальное значение current_total
float voltage_average = 0; //начальное значение voltage_average
float voltage_total = 0; //начальное значение voltage_total
float voltage = 0.0,current_mV = 0.0,current = 0.0,power = 0.0;
int x = 0;
int row = 0;
float voltage = 0.1;
void setup() {
Serial.begin(9600);
pinMode(A4,INPUT_PULLUP);
pinMode(A5, INPUT_PULLUP);
}
void draw(void) {
u8g.setFont(u8g_font_fub14r);
u8g.drawStr(0, 20, "V: ");
u8g.drawStr(0, 40, "A: ");
u8g.drawStr(0, 60, "Watt: ");
u8g.setPrintPos(58,20);
u8g.print( voltage,2);
u8g.println("V");
u8g.setPrintPos(58,40);
u8g.print( current,0);
u8g.println("mA");
u8g.setPrintPos(58, 60);
u8g.print( power ,1);
}
void loop() {
voltage_reading[index]=analogRead(A0); //читаем показания напряжения с контакта A0 (значение 0-1023)
voltage_total = voltage_total + voltage_reading[index]; //добавляем напряжение к voltage_total
current_reading[index]=analogRead(A3); //читаем текущее значение с вывода A3 (значение 0-1023)
current_total = current_total + current_reading[index]; // добавить текущий к current_total
index = index + 1;
if (index >=number_of_readings) { //после того, как вы прочитали number_of_reading, создайте среднее значение всех снятых показаний
current_average=current_total/number_of_readings;
voltage_average=voltage_total/number_of_readings;
Serial.print("Current average=");
Serial.print(current_average);
Serial.print(" Voltage average=");
Serial.println(voltage_average);
current_total=0;
voltage_total=0;
index=0;
}
voltage = ((5*(voltage_average)*(R1+R2))/(1023*R2)); //преобразование единичного значения voltage_average (0-1023) в фактическое напряжение, вычитание среднего значения напряжения, если не следует считывать напряжение
current_mV = (current_average-current_zero)*5; //преобразование единичного значения current_average(0-1023) в показание мВ, вычитание значения surrent_average, когда не нужно считывать ток
current = current_mV/185; //датчик рассчитан на 185 мВ/ампер в соответствии с pdf, может потребоваться изменение в зависимости от калибровки
power = (voltage*current); //рассчитываем мощность
u8g.firstPage();
do {
draw();
} while( u8g.nextPage() );
}
Спасибо за ответ, я исправил «Bat_Volt» на «напряжение», но при сохранении показывает ошибку «ток» не был объявлен в этой области». возможно, пожалуйста, отредактируйте код для меня., @Shijil
объявить ток, мощность, напряжение по всему миру. Вы устраните эту ошибку., @Vaibhav
- GSM-модуль IOT-GA6 Arduino + ошибка CME 58
- Разница между массивом char и массивом unsigned char
- Arduino UNO + Ethernet Shield + ЖК-дисплей + RFID, но RFID не работает
- Firmata: как установить определенный PIN на высокий уровень при загрузке?
- Arduino wrap или подкласс print() для работы с несколькими Serial
- Считывание данных нескольких датчиков из текстового файла, расположенного на SD-карте в Arduino/ESP32
- Строка в массив динамических байтов
- Проблемы с Serial.read()
это не работает таким образом
, что вы имеете в виду?, @Vaibhav@Vaibhav, это была ошибка, это не работает, вот что я имею в виду., @Shijil