Вольтметер I2C 096

Тема в разделе "Arduino & Shields", создана пользователем thesatellite, 22 июл 2017.

  1. thesatellite

    thesatellite Нерд

    Господа. Суть такая. Значит имеется I2C дисплей, аккум на 3.7 вольта от сотового на 2900 и зарядка от повер банка (такая простятская китайская) на аккум 18650 (по моему на мини ЮСБ). Так вот скетч
    #include <SPI.h>
    #include <Wire.h>
    #include <Adafruit_GFX.h>
    #include <Adafruit_SSD1306.h>
    #define OLED_RESET 4
    Adafruit_SSD1306 display(OLED_RESET);

    void setup() {
    // initialize serial communication at 9600 bits per second:
    display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
    display.clearDisplay();
    }

    // the loop routine runs over and over again forever:
    void loop() {
    // read the input on analog pin 0:
    display.setCursor(55,10);
    display.setTextSize(3);
    display.clearDisplay();
    display.setTextColor(WHITE);
    int sensorValue = analogRead(A0);
    // Convert the analog reading (which goes from 0 - 1023) to a voltage (0 - 5V):
    float voltage = sensorValue * (5.0 / 1023.0);
    // print out the value you read:
    display.println(voltage);
    display.setCursor(0,0);
    display.setTextSize(1);
    display.println("VOLTMETER_BANK");
    display.display();
    }

    проблема такая: LCD кажет на выходе 5 вольт ровно, а на A0 надо подавать напряжение для того что бы LCD показывал напряжение. Тестором тукаю во всех точках не более 3.7 вольт. Какого Хуанхе? What in mistik?


    Дополню отзыв: Подключил напряжение с внешнего источника питания - всё измеряет.
     
  2. thesatellite

    thesatellite Нерд

  3. thesatellite

    thesatellite Нерд

    Вот подключение и вот контроллер заряда. Народ, help to my!!
     

    Вложения:

  4. Limoney

    Limoney Гик

    // Convert the analog reading (which goes from 0 - 1023) to a voltage (0 - 5V):
    float voltage = sensorValue * (5.0 / 1023.0);
    Если ардуино включена от аккум на 3.7 вольта, то нужно исправить напряжение в формуле
     
    Последнее редактирование: 23 июл 2017
  5. thesatellite

    thesatellite Нерд

    А если переменный резистор поставить? средний на A0, крайние на GND & BAT+ ? Завтра попробую
     
  6. Limoney

    Limoney Гик

    Нет, немного не так, Извините! Питание ардуино от 5V?
    На схеме контакт измерения A0 подключен по схеме монтажного “И” т.е пока ключ VCC не замкнут, то замыкание ключа out+ не имеет значения, а при замыкании ключа VCC на контакт измерения A0 поступает напряжение питания arduino, тогда при замыкании ключа out+ и меньшего напряжения на контакт A0 будет напряжение питания arduino.
     
    Последнее редактирование: 23 июл 2017
  7. thesatellite

    thesatellite Нерд

    Питание контроллера идет от 3.7 - 4.3 вольта (аккумулятор). ТО есть из OUT выходит плавающее напряжение. Откуда 5 вольт так и не понял. Я делаю POWER BANK и хочу видеть остаток напряжения на аккуме.
     
  8. Limoney

    Limoney Гик

    Tomasina нравится это.
  9. thesatellite

    thesatellite Нерд

    Да, именно так.
     
    Последнее редактирование: 23 июл 2017
  10. Limoney

    Limoney Гик

    В верхней строке напряжение ардуино. В нижней строке напряжение на пин A0
    Измеряемое напряжение на пин A0 не может быть больше, чем питание ардуино
    Код (C++):
    #include <SPI.h>
    #include <Wire.h>
    #include <Adafruit_GFX.h>
    #include <Adafruit_SSD1306.h>

    #define OLED_RESET 4
    Adafruit_SSD1306 display(OLED_RESET);

    void setup() {
      display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
      display.display();
    }

    long readpowerVcc() {
      ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
      delay(50);
      ADCSRA |= _BV(ADSC);
      while (bit_is_set(ADCSRA, ADSC));
      uint8_t low  = ADCL;
      uint8_t high = ADCH;
      long result = (high << 8) | low;
      result = 1125300L / result;
      return result;
    }

    void loop() {
      float  powerVCC;
      // read the power on VCC
      powerVCC =  readpowerVcc();
      powerVCC *= 0.001;
      // read the input on analog pin 0:
      int sensorValue = analogRead(A0);
      // Convert the analog reading (which goes from 0 - 1023) to a voltage (0 - VCC):
      float voltage = sensorValue * (powerVCC / 1023.0);

      display.clearDisplay();
      display.setTextColor(WHITE);
      display.setCursor(35, 10);
      display.setTextSize(3);
      display.println(powerVCC);
      display.setCursor(35, 40);
      display.setTextSize(3);
      display.println(voltage);
      display.display();

    }
     
  11. thesatellite

    thesatellite Нерд


    БлагоДарю. Это рабочий скетч по той же схеме?
     
  12. Limoney

    Limoney Гик

    Не нужно соединять VCC с пин A0
     
    Последнее редактирование: 25 июл 2017
  13. thesatellite

    thesatellite Нерд

    Спасибо, попробую.