Hello everyone,
I'm currently trying to build and ECG simulator using a MCP4725 module to read the values sent by the computer on the same board and computer.
I tried with the Arduino Uno but the graph is not an ECG, I'm not sure about the data on the serial monitor.
Here's the schematic is drew:
Here's the code I tried to use:
#include <Wire.h>
#include <Adafruit_MCP4725.h>
Adafruit_MCP4725 dac;
// Set this value to 9, 8, 7, 6 or 5 to adjust the resolution
#define DAC_RESOLUTION (9)
const int pinoAnalogo = A0;
void setup(void) {
Serial.begin(9600);
// MCP4725A1 address is 0x62 (default)
// MCP4725A1 address is 0x63 (ADDR pin tied to VCC)
// MCP4725A1 address is 0x60 (ADDR pin tied to GND)
if (!dac.begin(0x60)){ // (ADDR pin tied to GND)
Serial.println("DAC not found!");
while(1);
}
}
const short y_data[] = {
939, 940, 941, 942, 944, 945, 946, 947, 951, 956,
962, 967, 973, 978, 983, 989, 994, 1000, 1005, 1015,
1024, 1034, 1043, 1053, 1062, 1075, 1087, 1100, 1112, 1121,
1126, 1131, 1136, 1141, 1146, 1151, 1156, 1164, 1172, 1179,
1187, 1194, 1202, 1209, 1216, 1222, 1229, 1235, 1241, 1248,
1254, 1260, 1264, 1268, 1271, 1275, 1279, 1283, 1287, 1286,
1284, 1281, 1279, 1276, 1274, 1271, 1268, 1266, 1263, 1261,
1258, 1256, 1253, 1251, 1246, 1242, 1237, 1232, 1227, 1222,
1218, 1215, 1211, 1207, 1203, 1199, 1195, 1191, 1184, 1178,
1171, 1165, 1159, 1152, 1146, 1141, 1136, 1130, 1125, 1120,
1115, 1110, 1103, 1096, 1088, 1080, 1073, 1065, 1057, 1049,
1040, 1030, 1021, 1012, 1004, 995, 987, 982, 978, 974,
970, 966, 963, 959, 955, 952, 949, 945, 942, 939,
938, 939, 940, 941, 943, 944, 945, 946, 946, 946,
946, 946, 946, 946, 946, 947, 950, 952, 954, 956,
958, 960, 962, 964, 965, 965, 965, 965, 965, 965,
963, 960, 957, 954, 951, 947, 944, 941, 938, 932,
926, 920, 913, 907, 901, 894, 885, 865, 820, 733,
606, 555, 507, 632, 697, 752, 807, 896, 977, 1023,
1069, 1127, 1237, 1347, 1457, 2085, 2246, 2474, 2549, 2595,
2641, 2695, 3083, 3135, 3187, 3217, 3315, 3403, 3492, 3581,
3804, 3847, 3890, 3798, 3443, 3453, 3297, 3053, 2819, 2810,
2225, 2258, 1892, 1734, 1625, 998, 903, 355, 376, 203,
30, 33, 61, 90, 119, 160, 238, 275, 292, 309,
325, 343, 371, 399, 429, 484, 542, 602, 652, 703,
758, 802, 838, 856, 875, 895, 917, 938, 967, 1016,
1035, 1041, 1047, 1054, 1060, 1066, 1066, 1064, 1061, 1058,
1056, 1053, 1051, 1048, 1046, 1043, 1041, 1038, 1035, 1033,
1030, 1028, 1025, 1022, 1019, 1017, 1014, 1011, 1008, 1006,
1003, 1001, 999, 998, 996, 994, 993, 991, 990, 988,
986, 985, 983, 981, 978, 976, 973, 971, 968, 966,
963, 963, 963, 963, 963, 963, 963, 963, 963, 963,
963, 963, 963, 963, 963, 963, 963, 963, 963, 963,
964, 965, 966, 967, 968, 969, 970, 971, 972, 974,
976, 978, 980, 983, 985, 987, 989, 991, 993, 995,
997, 999, 1002, 1006, 1011, 1015, 1019, 1023, 1028, 1032,
1036, 1040, 1045, 1050, 1055, 1059, 1064, 1069, 1076, 1082,
1088, 1095, 1101, 1107, 1114, 1120, 1126, 1132, 1141, 1149,
1158, 1166, 1173, 1178, 1183, 1188, 1193, 1198, 1203, 1208,
1214, 1221, 1227, 1233, 1240, 1246, 1250, 1254, 1259, 1263,
1269, 1278, 1286, 1294, 1303, 1309, 1315, 1322, 1328, 1334,
1341, 1343, 1345, 1347, 1349, 1351, 1353, 1355, 1357, 1359,
1359, 1359, 1359, 1359, 1358, 1356, 1354, 1352, 1350, 1347,
1345, 1343, 1341, 1339, 1336, 1334, 1332, 1329, 1327, 1324,
1322, 1320, 1317, 1315, 1312, 1307, 1301, 1294, 1288, 1281,
1275, 1270, 1265, 1260, 1256, 1251, 1246, 1240, 1233, 1227,
1221, 1214, 1208, 1201, 1194, 1186, 1178, 1170, 1162, 1154,
1148, 1144, 1140, 1136, 1131, 1127, 1123, 1118, 1114, 1107,
1099, 1090, 1082, 1074, 1069, 1064, 1058, 1053, 1048, 1043,
1038, 1034, 1029, 1025, 1021, 1017, 1013, 1009, 1005, 1001,
997, 994, 990, 991, 992, 994, 996, 997, 999, 998,
997, 996, 995, 994, 993, 991, 990, 989, 989, 989,
989, 989, 989, 989, 988, 986, 984, 983, 981, 980,
982, 984, 986, 988, 990, 993, 995, 997, 999, 1002,
1005, 1008, 1012};
const int data_size = sizeof(y_data);
void loop(){
for (int i = 1;i < data_size;i++){
setDAC(i);
delay(10);
}
}
void setDAC(int v){
dac.setVoltage((v*4095)/5, false); //Set voltage to v V
int valorAnalogico = 4*analogRead(pinoAnalogo);
Serial.println(valorAnalogico);
}
However, this code is not using negative voltage values. Is the Arduino or the ESP32 able to read negative voltage values through the ADC?
On top of that the ECG values list I have are very small uV so I'll need to multiply it by at least 10^6 so it becomes a Volt. Here's my question: what's the minimum voltage difference the Arduino Uno and the ESP32 can read so I can feed the minimum to amplify it later with my ECG receiver.
Also, I'm interested in creating negative voltages with the MCP4725. I read about the bipolar setup but didn't understand how it can output negative voltage values from that setup.
Here's the list so you can take a look:
0,
0.00001023,
0.000019995,
0.00003627,
0.0000744,
0.000093,
0.0001116,
0.0001209,
0.0001023,
0.0000744,
0.0000372,
0,
-0.0000186,
-0.0000279,
-0.0000279,
-0.0000372,
-0.0000465,
-0.0000558,
-0.0000651,
-0.0000744,
-0.0000837,
-0.000093,
-0.0001116,
-0.0001302,
-0.0001488,
-0.0001767,
-0.0002232,
-0.0002604,
-0.000279,
-0.0002511,
-0.000093,
0.000465,
0.00186,
0.002046,
0.0016275,
0,
-0.000186,
-0.000372,
-0.0004185,
-0.0003255,
-0.000186,
-0.0001395,
-0.000093,
-0.0000465,
-0.0000186,
-0.0000093,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0.000009207,
0.0000186,
0.0000372,
0.0000465,
0.0000651,
0.0000837,
0.0001023,
0.0001209,
0.0001488,
0.0001953,
0.0002325,
0.0002511,
0.0002604,
0.0002418,
0.000186,
0.0001395,
0.000093,
0.0000558,
0.0000279,
0.0000186,
0.0000093,
0.0000093,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0
I currently thinking of switching to the ESP32 as it has a better ADC resolution, which is 12-bit. Please correct me if I'm wrong.
Thank you if you've read this far.


