A tiny project in between.
I was looking for a way to measure the amps that will hit the sending IR LED of the ATTAG project so I quickly built a small ammeter (amperemeter) with a recording to micro SD feature.
If you choose to build your own you need these parts:
- 1x D1 mini (any ESP or arduino should do)
- 1x 0,91 OLED I²C display
- 1x INA219 I²C module
- 1x SPI micro SD card module
- 1x some regular holeboard 70x50mm
- 1x micro button
#include <Wire.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_GFX.h>
#include <Adafruit_INA219.h>
#include <Fonts/FreeMono9pt7b.h>
#include <SPI.h>
#include <SD.h>
#define RECBUTTON 0
File myFile;
unsigned long timestamp;
int currentState;
int rec = 0;
Adafruit_INA219 ina219;
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 32
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
void setup() {
delay(500); // calm down pause
Serial.begin(115200);
while (!Serial) {
;
}
pinMode(RECBUTTON, INPUT_PULLUP);
if (!SD.begin(15)) {
Serial.println("initialization failed!");
return;
}
Serial.println("initialization done.");
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
if (! ina219.begin()) {
Serial.println("INA219 failed");
while (1) {
delay(10);
}
}
}
void loop() {
currentState = digitalRead(RECBUTTON);
if (currentState == LOW && rec == 1) {
rec = 0;
Serial.println("recording off");
myFile.close();
} else if (currentState == LOW && rec == 0) {
rec = 1;
Serial.println("recording on");
myFile = SD.open("ammeter.txt", FILE_WRITE);
myFile.println("ms;W;A;busvoltage;shuntvoltage;loadvoltage");
}
float shuntvoltage = 0;
float busvoltage = 0;
float current_mA = 0;
float loadvoltage = 0;
float power_mW = 0;
shuntvoltage = ina219.getShuntVoltage_mV();
busvoltage = ina219.getBusVoltage_V();
current_mA = ina219.getCurrent_mA();
power_mW = ina219.getPower_mW();
loadvoltage = busvoltage + (shuntvoltage / 1000);
delay(200); // decrease if you want to increase number of recordings per second but display may flicker
display.clearDisplay();
display.setFont(&FreeMono9pt7b);
display.setTextColor(WHITE);
display.setCursor(0, 10);
display.print("mA:"); display.print(current_mA);
display.setCursor(0, 23);
display.print("mW:"); display.print(power_mW);
display.setFont(NULL);
display.setTextSize(1);
display.setCursor(0, 25);
if (busvoltage < 0) busvoltage = 0;
if (shuntvoltage < 0) shuntvoltage = 0;
if (loadvoltage < 0) loadvoltage = 0;
display.print("VB:"); display.print(busvoltage);
display.print(" S:"); display.print(shuntvoltage);
display.print(" L:"); display.print(loadvoltage);
display.setCursor(100, 0);
if (rec == 1) {
display.print("[R]");
}
display.display();
if (rec == 1) {
myFile.print(millis());
myFile.print(";");
myFile.print(power_mW);
myFile.print(";");
myFile.print(current_mA * -1);
myFile.print(";");
myFile.print(busvoltage);
myFile.print(";");
myFile.print(shuntvoltage);
myFile.print(";");
myFile.println(loadvoltage);
}
}
The code is based on some examples from the adafruit INA219 lib. I just added the display output and the recording feature.
In order to get these 3D printable files working you need some of the 2,54mm 8×1 pin header sockets. Whatever they are called:
3D printable files: