├── .gitattributes ├── .gitignore ├── DataLogger └── DataLogger.ino └── DataLoggerV1.pdf /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | 4 | # Custom for Visual Studio 5 | *.cs diff=csharp 6 | 7 | # Standard to msysgit 8 | *.doc diff=astextplain 9 | *.DOC diff=astextplain 10 | *.docx diff=astextplain 11 | *.DOCX diff=astextplain 12 | *.dot diff=astextplain 13 | *.DOT diff=astextplain 14 | *.pdf diff=astextplain 15 | *.PDF diff=astextplain 16 | *.rtf diff=astextplain 17 | *.RTF diff=astextplain 18 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Windows image file caches 2 | Thumbs.db 3 | ehthumbs.db 4 | 5 | # Folder config file 6 | Desktop.ini 7 | 8 | # Recycle Bin used on file shares 9 | $RECYCLE.BIN/ 10 | 11 | # Windows Installer files 12 | *.cab 13 | *.msi 14 | *.msm 15 | *.msp 16 | 17 | # Windows shortcuts 18 | *.lnk 19 | 20 | # ========================= 21 | # Operating System Files 22 | # ========================= 23 | 24 | # OSX 25 | # ========================= 26 | 27 | .DS_Store 28 | .AppleDouble 29 | .LSOverride 30 | 31 | # Thumbnails 32 | ._* 33 | 34 | # Files that might appear on external disk 35 | .Spotlight-V100 36 | .Trashes 37 | 38 | # Directories potentially created on remote AFP share 39 | .AppleDB 40 | .AppleDesktop 41 | Network Trash Folder 42 | Temporary Items 43 | .apdisk 44 | -------------------------------------------------------------------------------- /DataLogger/DataLogger.ino: -------------------------------------------------------------------------------- 1 | /* 2 | Data Logger to Excel 3 | 4 | every 0.5 sec A0 and A1 values are keyed into Excel if Pin 4 is GND 5 | 6 | */ 7 | 8 | #include 9 | #include 10 | #include 11 | 12 | const int buttonPin = 5; // inpur for rotary push button 13 | 14 | int V2; 15 | int V3; 16 | int reading; 17 | int oldReading; 18 | int oldPosition; 19 | int newPosition; 20 | boolean keyboardOn = false; 21 | boolean firstTime = true; 22 | float mAfactor = 5.5; 23 | 24 | float mAaverage = 0; 25 | float voltAverage = 0; 26 | 27 | long tt = 0; 28 | 29 | long address = 0; 30 | 31 | float mAmpere; 32 | float volt; 33 | 34 | float vcc; 35 | int ADCvalue; 36 | float voltage; 37 | 38 | float zeroMA = 5000.0; 39 | int adjVolt = 5000; 40 | 41 | U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE); // I2C / TWI 42 | 43 | Encoder myEnc(0, 1); 44 | 45 | void setup() { 46 | Serial.begin(9600); 47 | delay(2000); 48 | 49 | 50 | // make the pushButton pin an input: 51 | pinMode(buttonPin, INPUT_PULLUP); 52 | 53 | // A0 to A3 as input 54 | pinMode(A0, INPUT); 55 | pinMode(A1, INPUT); 56 | pinMode(A2, INPUT); 57 | pinMode(A3, INPUT); 58 | // initialize control over the keyboard: 59 | Keyboard.begin(); 60 | u8g.setColorIndex(1); //BW Display 61 | u8g.setRot180(); 62 | Serial.println("setup"); 63 | } 64 | 65 | void loop() { 66 | 67 | initR(); 68 | mAaverage = normAmpere(analogRead(A1)) - zeroMA; 69 | voltAverage = normVolt(analogRead(A0)) * (adjVolt / 5000.0); 70 | while (1 == 1) { 71 | 72 | V2 = analogRead(A2); 73 | V3 = analogRead(A3); 74 | 75 | mAmpere = normAmpere(analogRead(A1)) - zeroMA; 76 | mAaverage = ((mAaverage * 9.0) + mAmpere) / 10.0; 77 | 78 | volt = normVolt(analogRead(A0)) * (adjVolt / 5000.0); 79 | voltAverage = ((voltAverage * 9.0) + volt) / 10.0; 80 | 81 | u8g.firstPage(); 82 | do { 83 | u8g.setFont(u8g_font_unifont); 84 | u8g.setPrintPos(0, 16); 85 | u8g.print("Volt"); 86 | u8g.setPrintPos(50, 16); 87 | u8g.print(voltAverage, 2); 88 | 89 | u8g.setPrintPos(0, 32); 90 | u8g.print("mA"); 91 | u8g.setPrintPos(50, 32); 92 | u8g.print(mAaverage, 0); 93 | 94 | u8g.setPrintPos(0, 48); 95 | u8g.print("Keyboard"); 96 | u8g.setPrintPos(80, 48); 97 | u8g.print(keyboardOn); 98 | 99 | u8g.setPrintPos(0, 63); 100 | u8g.print("IN1"); 101 | u8g.setPrintPos(30, 63); 102 | u8g.print(V2); 103 | u8g.setPrintPos(68, 63); 104 | u8g.print("IN2"); 105 | u8g.setPrintPos(97, 63); 106 | u8g.print(V3); 107 | 108 | } while ( u8g.nextPage() ); 109 | 110 | if (!digitalRead(buttonPin)) { // encoder pressed 111 | keyboardOn = !keyboardOn; 112 | while (!digitalRead(buttonPin)) {} 113 | } 114 | if ((millis() - tt) > 3000) break; 115 | tt = millis(); 116 | 117 | 118 | if (keyboardOn) { 119 | 120 | // output to keyboard 121 | 122 | if (firstTime) { 123 | keyHeader(); 124 | firstTime = false; 125 | } 126 | 127 | Keyboard.print(millis() / 1000); 128 | Keyboard.print(char(9)); 129 | Keyboard.print(voltAverage, 2); 130 | Keyboard.print(char(9)); 131 | Keyboard.print(mAaverage, 0); 132 | Keyboard.print(char(9)); 133 | Keyboard.print(V2); 134 | Keyboard.print(char(9)); 135 | Keyboard.print(V3); 136 | Keyboard.println(char(13)); 137 | 138 | while (millis() - tt < 1000) {} 139 | } 140 | } 141 | } 142 | 143 | void adjustVolt() { 144 | 145 | newPosition = myEnc.read(); 146 | oldPosition = newPosition; 147 | adjVolt = EEPROMReadlong(address); 148 | voltAverage = normVolt(analogRead(A0)) * (adjVolt / 5000.0); 149 | // if (adjVolt < 2000) adjVolt = 5000; 150 | do { 151 | volt = normVolt(analogRead(A0)) * (adjVolt / 5000.0); 152 | voltAverage = ((voltAverage * 9.0) + volt) / 10.0; 153 | 154 | u8g.firstPage(); 155 | do { 156 | u8g.setFont(u8g_font_unifont); 157 | u8g.setPrintPos(0, 16); 158 | u8g.print("Volt"); 159 | u8g.setPrintPos(80, 16); 160 | u8g.print(voltAverage, 2); 161 | } while ( u8g.nextPage() ); 162 | 163 | newPosition = myEnc.read(); 164 | int diff = newPosition - oldPosition; 165 | 166 | if (diff != 0) { 167 | adjVolt = adjVolt - (diff * 5); 168 | oldPosition = newPosition; 169 | } 170 | } while (digitalRead(buttonPin)); 171 | EEPROMWritelong(address, adjVolt); 172 | // wait till released 173 | while (!digitalRead(buttonPin)) {} 174 | } 175 | 176 | void adjustAmpere() { 177 | zeroMA = normAmpere(analogRead(A1)); 178 | Serial.print("first "); 179 | Serial.println(zeroMA); 180 | 181 | do { 182 | u8g.firstPage(); 183 | do { 184 | u8g.setFont(u8g_font_unifont); 185 | u8g.setPrintPos(0, 16); 186 | u8g.print("NO CURRENT !!!"); 187 | u8g.setPrintPos(0, 48); 188 | u8g.print("Zero mA"); 189 | u8g.setPrintPos(70, 48); 190 | u8g.print(zeroMA, 0); 191 | } while ( u8g.nextPage() ); 192 | 193 | float zz = normAmpere(analogRead(A1)); 194 | zeroMA = ((zeroMA * 49.0) + zz) / 50.0; 195 | } while (digitalRead(buttonPin)); 196 | // wait till released 197 | while (!digitalRead(buttonPin)) {} 198 | } 199 | 200 | 201 | void EEPROMWritelong(int address, long value) 202 | { 203 | //Decomposition from a long to 4 bytes by using bitshift. 204 | //One = Most significant -> Four = Least significant byte 205 | byte four = (value & 0xFF); 206 | byte three = ((value >> 8) & 0xFF); 207 | byte two = ((value >> 16) & 0xFF); 208 | byte one = ((value >> 24) & 0xFF); 209 | 210 | //Write the 4 bytes into the eeprom memory. 211 | EEPROM.write(address, four); 212 | EEPROM.write(address + 1, three); 213 | EEPROM.write(address + 2, two); 214 | EEPROM.write(address + 3, one); 215 | } 216 | 217 | long EEPROMReadlong(long address) 218 | { 219 | //Read the 4 bytes from the eeprom memory. 220 | long four = EEPROM.read(address); 221 | long three = EEPROM.read(address + 1); 222 | long two = EEPROM.read(address + 2); 223 | long one = EEPROM.read(address + 3); 224 | 225 | //Return the recomposed long by using bitshift. 226 | return ((four << 0) & 0xFF) + ((three << 8) & 0xFFFF) + ((two << 16) & 0xFFFFFF) + ((one << 24) & 0xFFFFFFFF); 227 | } 228 | 229 | void keyHeader() { 230 | Keyboard.print("Time"); 231 | Keyboard.print(char(9)); 232 | Keyboard.print("Volt"); 233 | Keyboard.print(char(9)); 234 | Keyboard.print("mA"); 235 | Keyboard.print(char(9)); 236 | Keyboard.print("IN 1"); 237 | Keyboard.print(char(9)); 238 | Keyboard.print("IN 2"); 239 | Keyboard.println(char(13)); 240 | } 241 | 242 | 243 | void initR() { 244 | Serial.println("init"); 245 | adjustAmpere(); 246 | delay(200); 247 | adjustVolt(); 248 | tt = millis(); 249 | keyboardOn = false; 250 | firstTime = true; 251 | } 252 | 253 | long readVcc() { 254 | long result; 255 | // Read 1.1V reference against AVcc 256 | // set the reference to Vcc and the measurement to the internal 1.1V reference 257 | #if defined(__AVR_ATmega32U4__) || defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) 258 | ADMUX = _BV(REFS0) | _BV(MUX4) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1); 259 | #elif defined (__AVR_ATtiny24__) || defined(__AVR_ATtiny44__) || defined(__AVR_ATtiny84__) 260 | ADMUX = _BV(MUX5) | _BV(MUX0); 261 | #elif defined (__AVR_ATtiny25__) || defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny85__) 262 | ADMUX = _BV(MUX3) | _BV(MUX2); 263 | #else 264 | ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1); 265 | #endif 266 | delay(2); // Wait for Vref to settle 267 | ADCSRA |= _BV(ADSC); // Convert 268 | while (bit_is_set(ADCSRA, ADSC)); 269 | result = ADCL; 270 | result |= ADCH << 8; 271 | result = 1125300L / result; // Calculate Vcc (in mV); 1125300 = 1.1*1023*1000 272 | return result; 273 | } 274 | 275 | float normVolt(int reading) { 276 | float vcc = readVcc() / 1000.0; 277 | float voltage = (reading / 1023.0) * vcc; 278 | /* Serial.print (reading); 279 | Serial.print(", "); 280 | Serial.print(vcc); 281 | Serial.print(", "); 282 | Serial.println(voltage); 283 | */ 284 | return voltage; 285 | } 286 | 287 | float normAmpere(int reading) { 288 | float vcc = readVcc(); 289 | float mAmp = (reading - 512) * vcc * 5.1638E-3; // 1023.0 * 5.28; 290 | /* Serial.print (reading); 291 | Serial.print(", "); 292 | Serial.print(vcc); 293 | Serial.print(", "); 294 | Serial.println(mAmp); 295 | */ 296 | return mAmp; 297 | } 298 | 299 | -------------------------------------------------------------------------------- /DataLoggerV1.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SensorsIot/Data-Logger-with-Excel-connection/92155dda96611081570c8679ace89db3faf12e19/DataLoggerV1.pdf --------------------------------------------------------------------------------