Дисплей не показывает вывод - ваттметр 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);


}

, 👍1

Обсуждение

это не работает таким образом, что вы имеете в виду?, @Vaibhav

@Vaibhav, это была ошибка, это не работает, вот что я имею в виду., @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