EinkStromMessenFunktioniert.ino


1
#include <Arduino.h>
2
#include <U8g2lib.h>
3
#include <Wire.h>
4
5
#define iddAddr 0x42
6
7
#define EPD_CS       PA15
8
#define EPD_DC       PB11
9
#define EPD_RESET    PB2
10
#define EPD_BUSY     PA8
11
#define EPD_POWER    PB10
12
#define EPD_SPI_MOSI PB5
13
#define EPD_SPI_MISO PB4
14
#define EPD_SPI_SCK  PB3
15
16
U8G2_SSD1606_172X72_F_4W_SW_SPI u8g2(U8G2_R0, EPD_SPI_SCK, EPD_SPI_MOSI, EPD_CS, EPD_DC, EPD_RESET);
17
18
volatile int stron;
19
String power = "No Data";
20
21
void setup(void) {
22
  pinMode(EPD_POWER, OUTPUT);
23
  digitalWrite(EPD_POWER, 0);
24
  pinMode(LED_BUILTIN, OUTPUT);
25
  Serial.begin(115200);
26
  Serial.println("ATCnetz.de");
27
  Wire.begin();
28
  pinMode(PC13, INPUT);
29
  Idd_Init();
30
  Idd_req_meas( 100 );
31
  attachInterrupt(digitalPinToInterrupt(PC13), getmessaure, RISING);
32
  u8g2.begin();
33
}
34
35
void loop(void) {
36
  u8g2.clearBuffer();
37
  u8g2.setFontMode(1);
38
  u8g2.setFont(u8g2_font_cu12_tr);
39
  u8g2.setCursor(0, 15);
40
  u8g2.print("Amperemeter:");
41
  u8g2.setFont(u8g2_font_profont29_tf );
42
  u8g2.setCursor(0, 45);
43
  u8g2.println(power);
44
  u8g2.setFont(u8g2_font_cu12_tr);
45
  u8g2.setCursor(0, 70);
46
  u8g2.print("Runtime:");
47
  u8g2.print(millis()/60000);
48
  u8g2.print(" min");
49
  u8g2.sendBuffer();
50
  delay(3000);
51
}
52
53
void getmessaure(  )
54
{
55
  int meas = Idd_get_meas();
56
  char str[12];
57
  digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
58
59
  if ( meas < 0 )
60
  {
61
    return;
62
  }
63
  stron = meas;
64
  sprintf( (char*)str, "%d.%.3dmA", (int)meas / 100000, ((int)meas % 100000) / 100 );
65
  if ( str[0] == '0' )
66
  {
67
    sprintf( (char*)str, "%d.%.3duA", (int)meas / 100, ((int)meas % 100) * 10 );
68
    if ( str[0] == '0' )
69
    {
70
      sprintf( (char*)str, " %dnA ", (int)meas * 10 );
71
    }
72
  }
73
  power = str;
74
  Serial.println(str);
75
  Idd_req_meas( 100 );
76
}
77
78
void Idd_req_meas( uint8_t predelay )
79
{
80
  uint8_t param;
81
  predelay |= 0x80; // IDD_PRE_DELAY |= IDD_PREDELAY_20_MS
82
  I2C_Write_Reg(iddAddr, 0x81, &predelay, 1 ); //add predelay before Idd measurement
83
  param = 0x09; // IDD_CTRL = ( ( 4 << 1 ) & IDD_CTRL_SHUNT_NB ) | IDD_CTRL_REQ
84
  I2C_Write_Reg(iddAddr, 0x80, &param, 1 ); // request Idd measurement
85
}
86
87
int Idd_get_meas( void )
88
{
89
  uint8_t temp[3];
90
  uint8_t ack;
91
  I2C_Read_Reg( iddAddr, 0x08, temp, 1 );
92
  if ( temp[0] & 0x04 )
93
  {
94
    Idd_Init();
95
    return -1;
96
  }
97
  I2C_Read_Reg( iddAddr, 0x14, temp, 3 );
98
  ack = 0x02;
99
  I2C_Write_Reg(iddAddr, 0x44, &ack, 1 );
100
  return (temp[0] << 16) + (temp[1] << 8) + temp[2];
101
}
102
103
void I2C_Read_Reg(int addr, int start, uint8_t *buffer, int size)
104
{
105
  int i;
106
  Wire.beginTransmission(addr);
107
  Wire.write(start);
108
  Wire.endTransmission();
109
  Wire.requestFrom(addr, size, true);
110
  i = 0;
111
  while (Wire.available() && i < size)
112
  {
113
    buffer[i++] = Wire.read();
114
  }
115
}
116
117
int I2C_Write_Reg(int addr, int start, uint8_t *pData, int size)
118
{
119
  Wire.beginTransmission(addr);
120
  Wire.write(start);
121
  Wire.write(pData, size);
122
  Wire.endTransmission();
123
}
124
125
void Idd_Init( void )
126
{
127
  uint8_t params[14];
128
  params[0] = 0x80;
129
  I2C_Write_Reg(iddAddr, 0x40, params, 1 );
130
  delay( 100 );
131
  params[0] = 0x03;
132
  I2C_Write_Reg(iddAddr, 0x41, params, 1 );
133
  delay( 1 );
134
  params[0] = 0x06;
135
  I2C_Write_Reg(iddAddr, 0x42, params, 1 );
136
  params[0] = 0x04;
137
  I2C_Write_Reg(iddAddr, 0x40, params, 1 );
138
  params[0] = 0x03; params[1] = 0xE8;   // SH0 = 1000 mohm
139
  params[2] = 0x00; params[3] = 0x18;   // SH1 = 24 ohm
140
  params[4] = 0x02; params[5] = 0x6C;   // SH2 = 620 ohm
141
  params[6] = 0x00; params[7] = 0x00;   // SH3 = not included
142
  params[8] = 0x27; params[9] = 0x10;   // SH4 = 10,000 ohm
143
  params[10] = 0x13; params[11] = 0x7E; // Gain = 49.9 (4990)
144
  params[12] = 0x0B; params[13] = 0xB8; // VDD_MIN = 3000 mV
145
  I2C_Write_Reg(iddAddr, 0x82, params, 14 );
146
}