Hello, I am working on a temp data logger with a seeeduino Xiao, an Adafruit micro SD board and DS18B20 temperature sensors.
I have tested all components separately in the breadboard and they all work just fine.
My code so far prints in the serial monitor and creates a .csv file in the micro SD card, but the file is empty.
Can someone tell me what am I doing wrong and how can I fix it?
// #include <SPI.h>
#include <SD.h>
#include <Wire.h>
#include <OneWire.h>
#include <DallasTemperature.h>
// Temp Data wire is plugged into port 2 on the Arduino
#define ONE_WIRE_BUS 2
OneWire oneWire(ONE_WIRE_BUS); // Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
DallasTemperature sensors(&oneWire); // Pass our oneWire reference to Dallas Temperature.
int numberOfDevices; // Number of temperature devices found
DeviceAddress tempDeviceAddress; // We'll use this variable to store a found device address
// A simple data logger for the Arduino analog pins
// how many milliseconds between grabbing data and logging it. 1000 ms is once a second
#define LOG_INTERVAL 1000 // mills between entries (reduce to take more/faster data)
// how many milliseconds before writing the logged data permanently to disk
// set it to the LOG_INTERVAL to write each time (safest)
// set it to 10*LOG_INTERVAL to write all data every 10 datareads, you could lose up to
// the last 10 reads if power is lost but it uses less power and is much faster!
#define SYNC_INTERVAL 1000 // mills between calls to flush() - to write data to the card
uint32_t syncTime = 0; // time of last sync()
#define ECHO_TO_SERIAL 1 // echo data to serial port
#define WAIT_TO_START 0 // Wait for serial input in setup()
// The analog pins that connect to the sensors
// for the data logging shield, we use digital pin 3 for the SD cs line
const int chipSelect = 3;
// the logging file
File logfile;
void error(char *str)
{
Serial.print("error: ");
Serial.println(str);
while(1);
}
void setup(void)
{
Serial.begin(9600);
Serial.println();
// initialize the SD card
Serial.print("Initializing SD card...");
// make sure that the default chip select pin is set to
// output, even if you don't use it:
pinMode(3, OUTPUT);
// see if the card is present and can be initialized:
if (!SD.begin(chipSelect)) {
error("Card failed, or not present");
}
Serial.println("card initialized.");
// create a new file
char filename[] = "LOGGER00.CSV";
for (uint8_t i = 0; i < 100; i++) {
filename[6] = i/10 + '0';
filename[7] = i%10 + '0';
if (! SD.exists(filename)) {
// only open a new file if it doesn't exist
logfile = SD.open(filename, FILE_WRITE);
break; // leave the loop!
}
}
if (! logfile) {
error("couldnt create file");
}
Serial.print("Logging to: ");
Serial.println(filename);
// Start up the library
sensors.begin();
// Grab a count of devices on the wire
numberOfDevices = sensors.getDeviceCount();
// locate devices on the bus
Serial.print("Locating devices...");
Serial.print("Found ");
Serial.print(numberOfDevices, DEC);
Serial.println(" devices.");
// Loop through each device, print out address
for(int i=0;i<numberOfDevices; i++) {
// Search the wire for address
if(sensors.getAddress(tempDeviceAddress, i))
{
Serial.print("Found device ");
Serial.print(i, DEC);
Serial.print(" with address: ");
printAddress(tempDeviceAddress);
Serial.println();
} else {
Serial.print("Found ghost device at ");
Serial.print(i, DEC);
Serial.print(" but could not detect address. Check power and cabling");
}
logfile.println("millis,temp0,temp1,temp2,Altitude");
#if ECHO_TO_SERIAL
Serial.println("millis,temp0,temp1,temp2,Altitude");
#endif //ECHO_TO_SERIAL
}
}
void loop(void)
{
// delay for the amount of time we want between readings
delay((LOG_INTERVAL -1) - (millis() % LOG_INTERVAL));
// log milliseconds since starting
uint32_t m = millis();
logfile.print(m); // milliseconds since start
logfile.print(", ");
#if ECHO_TO_SERIAL
Serial.print(m); // milliseconds since start
Serial.print(", ");
#endif
sensors.requestTemperatures(); // Send the command to get temperatures
// Loop through each device, print out temperature data
for(int i=0;i<numberOfDevices; i++) {
// Search the wire for address
if(sensors.getAddress(tempDeviceAddress, i)){
// Output the device ID
float tempC = sensors.getTempC(tempDeviceAddress); // Print the data
logfile.print("DS18: ");
logfile.print(i,DEC);
logfile.print("Temp C: ");
logfile.print(tempC);
logfile.print(", ");
#if ECHO_TO_SERIAL
Serial.print("DS18: ");
Serial.print(i,DEC);
Serial.print("Temp C: ");
Serial.print(tempC);
Serial.print(", ");
#endif // ECHO_TO_SERIAL
}
}
delay(10);
}
// function to print a device address
void printAddress(DeviceAddress deviceAddress) {
for (uint8_t i = 0; i < 8; i++) {
if (deviceAddress[i] < 16) Serial.print("0");
Serial.print(deviceAddress[i], HEX);
}
// analogRead(photocellPin);
// delay(10);
// int photocellReading = analogRead(photocellPin);
// analogRead(tempPin);
// delay(10);
// int tempReading = analogRead(tempPin);
/* logfile.print(", ");
logfile.print(photocellReading);
logfile.print(", ");
logfile.print(temperatureF);
#if ECHO_TO_SERIAL
Serial.print(", ");
Serial.print(photocellReading);
Serial.print(", ");
Serial.print(temperatureF);
#endif //ECHO_TO_SERIAL */
// Log the estimated 'VCC' voltage by measuring the internal 1.1v ref
// analogRead(BANDGAPREF);
delay(10);
// int refReading = analogRead(BANDGAPREF);
// float supplyvoltage = (bandgap_voltage * 1024) / refReading;
// Now we write data to disk! Don't sync too often - requires 2048 bytes of I/O to SD card
// which uses a bunch of power and takes time
if ((millis() - syncTime) < SYNC_INTERVAL) return;
syncTime = millis();
/* // blink LED to show we are syncing data to the card & updating FAT!
digitalWrite(redLEDpin, HIGH);
logfile.flush();
digitalWrite(redLEDpin, LOW); */
}
You need to close the log file when you are all done collecting data. How do you currently stop data collection?
In case of power outage, issue an SD.flush() command every hour, day, etc. to update the file pointer. That way you lose only the last unwritten block.
i am sure that 3.3V line has not enough power for 4 devices.
SD card module has its own regulator. connect him to 5V line of MCU board
#include <SPI.h>
#include <SD.h>
#include <Wire.h>
#include <OneWire.h>
#include <DallasTemperature.h>
// Temp Data wire is plugged into port 2 on the Arduino
#define ONE_WIRE_BUS 2
OneWire oneWire(ONE_WIRE_BUS); // Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
DallasTemperature sensors(&oneWire); // Pass our oneWire reference to Dallas Temperature.
int numberOfDevices; // Number of temperature devices found
DeviceAddress tempDeviceAddress; // We'll use this variable to store a found device address
// how many milliseconds between grabbing data and logging it. 1000 ms is once a second
#define LOG_INTERVAL 1000 // mills between entries (reduce to take more/faster data)
// how many milliseconds before writing the logged data permanently to disk
// set it to the LOG_INTERVAL to write each time (safest)
// set it to 10*LOG_INTERVAL to write all data every 10 datareads, you could lose up to
// the last 10 reads if power is lost but it uses less power and is much faster!
#define SYNC_INTERVAL 1000 // mills between calls to flush() - to write data to the card
uint32_t syncTime = 0; // time of last sync()
#define ECHO_TO_SERIAL 1 // echo data to serial port
#define WAIT_TO_START 0 // Wait for serial input in setup()
const byte chipSelect = 3;// for the data logging shield, we use digital pin 3 for the SD cs line
void error(char *str) {
Serial.print("error: ");
Serial.println(str);
while (1);
}
void setup(void) {
Serial.begin(9600);
Serial.print("Initializing SD card...");
// make sure that the default chip select pin is set to
// output, even if you don't use it:
pinMode(3, OUTPUT);
if (!SD.begin(chipSelect)) {// see if the card is present and can be initialized:
error("Card failed, or not present");
} else Serial.println("card initialized.");
// create a new file
char filename[] = "LOGGER00.CSV";
for (uint8_t i = 0; i < 100; i++) {
filename[6] = i / 10 + '0';
filename[7] = i % 10 + '0';
if (! SD.exists(filename)) {
// only open a new file if it doesn't exist
File logfile = SD.open(filename, FILE_WRITE);
break; // leave the loop!
}
}
if (! logfile) {
error("couldnt create file");
} else {
logfile.println("millis,temp0,temp1,temp2,Altitude");
logfile.close();
}
Serial.print("Logging to: ");
Serial.println(filename);
// Start up the library
sensors.begin();
// Grab a count of devices on the wire
numberOfDevices = sensors.getDeviceCount();
// locate devices on the bus
Serial.print("Locating devices...");
Serial.print("Found ");
Serial.print(numberOfDevices, DEC);
Serial.println(" devices.");
// Loop through each device, print out address
for (int i = 0; i < numberOfDevices; i++) {
// Search the wire for address
if (sensors.getAddress(tempDeviceAddress, i))
{
Serial.print("Found device ");
Serial.print(i, DEC);
Serial.print(" with address: ");
printAddress(tempDeviceAddress);
Serial.println();
} else {
Serial.print("Found ghost device at ");
Serial.print(i, DEC);
Serial.print(" but could not detect address. Check power and cabling");
}
#if ECHO_TO_SERIAL
Serial.println("millis,temp0,temp1,temp2,Altitude");
#endif //ECHO_TO_SERIAL
}
}
void loop(void) {
// delay for the amount of time we want between readings
delay((LOG_INTERVAL - 1) - (millis() % LOG_INTERVAL));
// log milliseconds since starting
uint32_t m = millis();
logfile.print(m); // milliseconds since start
logfile.print(", ");
#if ECHO_TO_SERIAL
Serial.print(m); // milliseconds since start
Serial.print(", ");
#endif
sensors.requestTemperatures(); // Send the command to get temperatures
// Loop through each device, print out temperature data
for (int i = 0; i < numberOfDevices; i++) {
// Search the wire for address
if (sensors.getAddress(tempDeviceAddress, i)) {
// Output the device ID
float tempC = sensors.getTempC(tempDeviceAddress); // Print the data
logfile.print("DS18: ");
logfile.print(i, DEC);
logfile.print("Temp C: ");
logfile.print(tempC);
logfile.print(", ");
#if ECHO_TO_SERIAL
Serial.print("DS18: ");
Serial.print(i, DEC);
Serial.print("Temp C: ");
Serial.print(tempC);
Serial.print(", ");
#endif // ECHO_TO_SERIAL
}
}
delay(10);
}
// function to print a device address
void printAddress(DeviceAddress deviceAddress) {
for (uint8_t i = 0; i < 8; i++) {
if (deviceAddress[i] < 16) Serial.print("0");
Serial.print(deviceAddress[i], HEX);
}
delay(10);
// Now we write data to disk! Don't sync too often - requires 2048 bytes of I/O to SD card
// which uses a bunch of power and takes time
if ((millis() - syncTime) < SYNC_INTERVAL) return;
syncTime = millis();
}
i am sure that 3.3V line has not enough power for 4 devices.
SD card module has its own regulator. connect him to 5V line of MCU board
@kolaha, I am seriously hoping you are wrong, badly hoping, because the plan is to add an altimeter and power the whole thing with CR2032 batteries (3V coin batteries) and have it hold for about 20 hrs, and at least 3/4 of that time at -50C, I will have insulation for the boards, but one of the sensors will be nude (its rated for -55C)
CR2032 batteries ... and have it hold for about 20 hrs, and at least 3/4 of that time at -50C,
Not a good idea. The SD card can draw up to 100 mA depending on type and manufacturer, which vastly exceeds the rating of that type of battery. Use a small LiPo battery instead.
Sounds like a balloon flight. It might be embarrassing to send up a poorly conceived lashup, and have it fail right after startup.
No can't do, they provide the batteries, it has to be those, least i can have them see it won't work. I have been trying to use a FRAM board, but without luck so far
// #include <SPI.h>
#include <SD.h>
#include <Wire.h>
#include <OneWire.h>
#include <DallasTemperature.h>
// Temp Data wire is plugged into port 2 on the Arduino
#define ONE_WIRE_BUS 2
OneWire oneWire(ONE_WIRE_BUS); // Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
DallasTemperature sensors(&oneWire); // Pass our oneWire reference to Dallas Temperature.
int numberOfDevices; // Number of temperature devices found
DeviceAddress tempDeviceAddress; // We'll use this variable to store a found device address
// A simple data logger for the Arduino analog pins
// how many milliseconds between grabbing data and logging it. 1000 ms is once a second
#define LOG_INTERVAL 1000 // mills between entries (reduce to take more/faster data)
// how many milliseconds before writing the logged data permanently to disk
// set it to the LOG_INTERVAL to write each time (safest)
// set it to 10*LOG_INTERVAL to write all data every 10 datareads, you could lose up to
// the last 10 reads if power is lost but it uses less power and is much faster!
#define SYNC_INTERVAL 1000 // mills between calls to flush() - to write data to the card
uint32_t syncTime = 0; // time of last sync()
#define ECHO_TO_SERIAL 1 // echo data to serial port
#define WAIT_TO_START 0 // Wait for serial input in setup()
// The analog pins that connect to the sensors
// for the data logging shield, we use digital pin 3 for the SD cs line
const int chipSelect = 3;
// the logging file
File logfile;
void error(char *str)
{
Serial.print("error: ");
Serial.println(str);
while(1);
}
void setup(void)
{
Serial.begin(9600);
Serial.println();
// initialize the SD card
Serial.print("Initializing SD card...");
// make sure that the default chip select pin is set to
// output, even if you don't use it:
pinMode(3, OUTPUT);
// see if the card is present and can be initialized:
if (!SD.begin(chipSelect)) {
error("Card failed, or not present");
}
Serial.println("card initialized.");
// create a new file
char filename[] = "LOGGER00.CSV";
for (uint8_t i = 0; i < 100; i++) {
filename[6] = i/10 + '0';
filename[7] = i%10 + '0';
if (! SD.exists(filename)) {
// only open a new file if it doesn't exist
logfile = SD.open(filename, FILE_WRITE);
break; // leave the loop!
}
}
if (! logfile) {
error("couldnt create file");
}
Serial.print("Logging to: ");
Serial.println(filename);
// Start up the library
sensors.begin();
// Grab a count of devices on the wire
numberOfDevices = sensors.getDeviceCount();
// locate devices on the bus
Serial.print("Locating devices...");
Serial.print("Found ");
Serial.print(numberOfDevices, DEC);
Serial.println(" devices.");
// Loop through each device, print out address
for(int i=0;i<numberOfDevices; i++) {
// Search the wire for address
if(sensors.getAddress(tempDeviceAddress, i))
{
Serial.print("Found device ");
Serial.print(i, DEC);
Serial.print(" with address: ");
printAddress(tempDeviceAddress);
Serial.println();
} else {
Serial.print("Found ghost device at ");
Serial.print(i, DEC);
Serial.print(" but could not detect address. Check power and cabling");
}
logfile.println("millis,temp0,temp1,temp2,Altitude");
#if ECHO_TO_SERIAL
Serial.println("millis,temp0,temp1,temp2,Altitude");
#endif //ECHO_TO_SERIAL
}
}
void loop(void)
{
// delay for the amount of time we want between readings
delay((LOG_INTERVAL -1) - (millis() % LOG_INTERVAL));
// log milliseconds since starting
uint32_t m = millis();
logfile.print(m); // milliseconds since start
logfile.print(", ");
#if ECHO_TO_SERIAL
Serial.print(m); // milliseconds since start
Serial.print(", ");
#endif
sensors.requestTemperatures(); // Send the command to get temperatures
// Loop through each device, print out temperature data
for(int i=0;i<numberOfDevices; i++) {
// Search the wire for address
if(sensors.getAddress(tempDeviceAddress, i)){
// Output the device ID
float tempC = sensors.getTempC(tempDeviceAddress); // Print the data
logfile.print("DS18: ");
logfile.print(i,DEC);
logfile.print("Temp C: ");
logfile.print(tempC);
logfile.print(", ");
#if ECHO_TO_SERIAL
Serial.print("DS18: ");
Serial.print(i,DEC);
Serial.print("Temp C: ");
Serial.print(tempC);
Serial.print(", ");
#endif // ECHO_TO_SERIAL
}
}
delay(10);
}
// function to print a device address
void printAddress(DeviceAddress deviceAddress) {
for (uint8_t i = 0; i < 8; i++) {
if (deviceAddress[i] < 16) Serial.print("0");
Serial.print(deviceAddress[i], HEX);
}
// analogRead(photocellPin);
// delay(10);
// int photocellReading = analogRead(photocellPin);
// analogRead(tempPin);
// delay(10);
// int tempReading = analogRead(tempPin);
/* logfile.print(", ");
logfile.print(photocellReading);
logfile.print(", ");
logfile.print(temperatureF);
#if ECHO_TO_SERIAL
Serial.print(", ");
Serial.print(photocellReading);
Serial.print(", ");
Serial.print(temperatureF);
#endif //ECHO_TO_SERIAL */
// Log the estimated 'VCC' voltage by measuring the internal 1.1v ref
// analogRead(BANDGAPREF);
delay(10);
// int refReading = analogRead(BANDGAPREF);
// float supplyvoltage = (bandgap_voltage * 1024) / refReading;
// Now we write data to disk! Don't sync too often - requires 2048 bytes of I/O to SD card
// which uses a bunch of power and takes time
if ((millis() - syncTime) < SYNC_INTERVAL) return;
syncTime = millis();
logfile.flush();
/* // blink LED to show we are syncing data to the card & updating FAT!
digitalWrite(redLEDpin, HIGH);
logfile.flush();
digitalWrite(redLEDpin, LOW); */
}
The file seems to be empty, because nowhere in the loop function do you call logfile.close() or logfile.flush().
This appears in the printAddress routine, which is never called from loop():
// Now we write data to disk! Don't sync too often - requires 2048 bytes of I/O to SD card
// which uses a bunch of power and takes time
if ((millis() - syncTime) < SYNC_INTERVAL) return;
syncTime = millis();
logfile.flush();
Thank you @jremington, it now works, It is finally logging in the SD card.
For some reason it is only recording one sensor in the serial monitor and 2 with weird formatting in the CSV file, so my next step will be to go back and look into that later (I tested all 3 sensors individually already).
#include <SPI.h>
#include <SD.h>
#include <Wire.h>
#include <OneWire.h>
#include <DallasTemperature.h>
// Temp Data wire is plugged into port 2 on the Arduino
#define ONE_WIRE_BUS 1
OneWire oneWire(ONE_WIRE_BUS); // Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
DallasTemperature sensors(&oneWire); // Pass our oneWire reference to Dallas Temperature.
int numberOfDevices; // Number of temperature devices found
DeviceAddress tempDeviceAddress; // We'll use this variable to store a found device address
// A simple data logger for the Arduino analog pins
// how many milliseconds between grabbing data and logging it. 1000 ms is once a second
#define LOG_INTERVAL 5000 // mills between entries (reduce to take more/faster data)
// how many milliseconds before writing the logged data permanently to disk
// set it to the LOG_INTERVAL to write each time (safest)
// set it to 10*LOG_INTERVAL to write all data every 10 datareads, you could lose up to
// the last 10 reads if power is lost but it uses less power and is much faster!
#define SYNC_INTERVAL 1000 // mills between calls to flush() - to write data to the card
uint32_t syncTime = 0; // time of last sync()
#define ECHO_TO_SERIAL 1 // echo data to serial port
#define WAIT_TO_START 0 // Wait for serial input in setup()
// The analog pins that connect to the sensors
// for the data logging shield, we use digital pin 3 for the SD cs line
const int chipSelect = 3;
// the logging file
File logfile;
void error(char *str)
{
Serial.print("error: ");
Serial.println(str);
while(1);
}
void setup(void)
{
Serial.begin(9600);
Serial.println();
// initialize the SD card
Serial.print("Initializing SD card...");
// make sure that the default chip select pin is set to
// output, even if you don't use it:
pinMode(3, OUTPUT);
// see if the card is present and can be initialized:
if (!SD.begin(chipSelect)) {
error("Card failed, or not present");
}
Serial.println("card initialized.");
// create a new file
char filename[] = "LOGGER00.CSV";
for (uint8_t i = 0; i < 100; i++) {
filename[6] = i/10 + '0';
filename[7] = i%10 + '0';
if (! SD.exists(filename)) {
// only open a new file if it doesn't exist
logfile = SD.open(filename, FILE_WRITE);
break; // leave the loop!
}
}
if (! logfile) {
error("couldnt create file");
}
Serial.print("Logging to: ");
Serial.println(filename);
// Start up the library
sensors.begin();
// Grab a count of devices on the wire
numberOfDevices = sensors.getDeviceCount();
// locate devices on the bus
Serial.print("Locating devices...");
Serial.print("Found ");
Serial.print(numberOfDevices, DEC);
Serial.println(" devices.");
// Loop through each device, print out address
for(int i=0;i<numberOfDevices; i++) {
// Search the wire for address
if(sensors.getAddress(tempDeviceAddress, i))
{
Serial.print("Found device ");
Serial.print(i, DEC);
Serial.print(" with address: ");
printAddress(tempDeviceAddress);
Serial.println();
} else {
Serial.print("Found ghost device at ");
Serial.print(i, DEC);
Serial.print(" but could not detect address. Check power and cabling");
}
logfile.println("millis,temp0,temp1,temp2,Altitude");
#if ECHO_TO_SERIAL
Serial.println("millis,temp0,temp1,temp2,Altitude");
#endif //ECHO_TO_SERIAL
}
}
void loop(void)
{
// delay for the amount of time we want between readings
delay((LOG_INTERVAL -1) - (millis() % LOG_INTERVAL));
// log milliseconds since starting
uint32_t m = millis();
logfile.print(m); // milliseconds since start
logfile.print(", ");
#if ECHO_TO_SERIAL
Serial.print(m); // milliseconds since start
Serial.print(", ");
#endif
sensors.requestTemperatures(); // Send the command to get temperatures
// Loop through each device, print out temperature data
for(int i=0;i<numberOfDevices; i++) {
// Search the wire for address
if(sensors.getAddress(tempDeviceAddress, i)){
// Output the device ID
float tempC = sensors.getTempC(tempDeviceAddress); // Print the data
logfile.print("DS18: ");
logfile.print(i,DEC);
logfile.print("Temp C: ");
logfile.print(tempC);
logfile.print(", ");
logfile.println();
// Now we write data to disk! Don't sync too often - requires 2048 bytes of I/O to SD card
// which uses a bunch of power and takes time
if ((millis() - syncTime) < SYNC_INTERVAL) return;
syncTime = millis();
logfile.flush();
#if ECHO_TO_SERIAL
Serial.print("DS18: ");
Serial.print(i,DEC);
Serial.print("Temp C: ");
Serial.print(tempC);
Serial.print(", ");
Serial.println();
#endif // ECHO_TO_SERIAL
}
}
delay(10);
}
// function to print a device address
void printAddress(DeviceAddress deviceAddress) {
for (uint8_t i = 0; i < 8; i++) {
if (deviceAddress[i] < 16) Serial.print("0");
Serial.print(deviceAddress[i], HEX);
}
// analogRead(photocellPin);
// delay(10);
// int photocellReading = analogRead(photocellPin);
// analogRead(tempPin);
// delay(10);
// int tempReading = analogRead(tempPin);
/* logfile.print(", ");
logfile.print(photocellReading);
logfile.print(", ");
logfile.print(temperatureF);
#if ECHO_TO_SERIAL
Serial.print(", ");
Serial.print(photocellReading);
Serial.print(", ");
Serial.print(temperatureF);
#endif //ECHO_TO_SERIAL */
// Log the estimated 'VCC' voltage by measuring the internal 1.1v ref
// analogRead(BANDGAPREF);
delay(10);
// int refReading = analogRead(BANDGAPREF);
// float supplyvoltage = (bandgap_voltage * 1024) / refReading;
/* // blink LED to show we are syncing data to the card & updating FAT!
digitalWrite(redLEDpin, HIGH);
logfile.flush();
digitalWrite(redLEDpin, LOW); */
}
Hi Just an update, @jremington and @kolaha Thank you for the help again, we are back to a FRAM board for this project (more realistic power usage and now things are moving forward with the code, CR2032 tests worked partially, 2 of the temp sensors were not working with 2 or 3 batteries in parallel, I tested with 3 rechargeable AA (3.8V) connected through the vin port underneath the xiao and it all started working well again. so I am going to start testing CR2032 in series today in the freezer.
I am reading through old threads of step up and step down converters and have also found a few nice pololu step up/step down boards, If I can't figure it out, should i keep posting here or start a fresh battery/converter thread?
Thank you