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, ¶m, 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 | }
|