I have a sensor DS18B where I read temperature both in c and f on an OLED with I2c and store the temperature on an SD card with SPI, but I2c and SPI do not work together, how do you solve this?
On a Arduino Uno R4 wifi
#include <OneWire.h> #include <DallasTemperature.h> #include <SPI.h> #include <SD.h> #include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #define ONE_WIRE_BUS 2 // DS18B20 pin #define OLED_RESET -1 // Reset pin for OLED (not used) #define SCREEN_WIDTH 128 // OLED display width, in pixels #define SCREEN_HEIGHT 32 // OLED display height, in pixels #define OLED_ADDRESS 0x3C // OLED I2C address, default for 128x32 OLED Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); OneWire oneWire(ONE_WIRE_BUS); DallasTemperature sensors(&oneWire); File dataFile; void setup() { Serial.begin(9600); while (!Serial) { delay(10); // Wait for serial port to connect } // Initialize the OLED display if (!display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDRESS)) { Serial.println(F("SSD1306 allocation failed")); for (;;); } display.display(); // Display initialization // Initialize the DS18B20 sensor sensors.begin(); // Initialize the SD card if (!SD.begin(4)) { // CS pin for SD card Serial.println(F("SD initialization failed!")); return; } Serial.println(F("Initialization complete")); } void loop() { sensors.requestTemperatures(); float celsius = sensors.getTempCByIndex(0); float fahrenheit = celsius * 9.0 / 5.0 + 32.0; // Print temperature to serial monitor Serial.print(F("Temperature (C): ")); Serial.print(celsius); Serial.print(F(" | Temperature (F): ")); Serial.println(fahrenheit); // Print temperature to OLED display display.clearDisplay(); display.setTextSize(1); display.setTextColor(SSD1306_WHITE); display.setCursor(0, 0); display.print(F("Temp (C): ")); display.println(celsius); display.print(F("Temp (F): ")); display.println(fahrenheit); display.display(); // Store temperature on SD card dataFile = SD.open("temperature.txt", FILE_WRITE); if (dataFile) { dataFile.print(F("Temperature (C): ")); dataFile.print(celsius); dataFile.print(F(" | Temperature (F): ")); dataFile.println(fahrenheit); dataFile.close(); Serial.println(F("Data written to SD card")); } else { Serial.println(F("Error opening file")); } delay(5000); // Delay for 5 seconds }
@henrik_t7 We need a lot more info. What exactly is happening or not happening?
First computer 1959. Retired from my own computer company 2004.
Hardware - Expert in 1401, and 360, fairly knowledge in PC plus numerous MPU's and MCU's
Major Languages - Machine language, 360 Macro Assembler, Intel Assembler, PL/I and PL1, Pascal, Basic, C plus numerous job control and scripting languages.
Sure you can learn to be a programmer, it will take the same amount of time for me to learn to be a Doctor.
@henrik_t7 I do see one thing but don't know if it's the problem. You are opening and closing the SD card every pass through the loop. Unless you have a high wear card, that will destroy the card quickly.
It's a tricky problem with continuous loop applications. Using an SD card as storage is also problematic. If you want reliability, I would use a USB based solution and maybe a timer to periodically close a time stamped file and open a new file. You might do that once per hour, or once per 5, 10, 15 minutes, your choice.
First computer 1959. Retired from my own computer company 2004.
Hardware - Expert in 1401, and 360, fairly knowledge in PC plus numerous MPU's and MCU's
Major Languages - Machine language, 360 Macro Assembler, Intel Assembler, PL/I and PL1, Pascal, Basic, C plus numerous job control and scripting languages.
Sure you can learn to be a programmer, it will take the same amount of time for me to learn to be a Doctor.
I had 7 Arduino UNO devices, 2 Arduino Mega devices and a Raspberry Pi communicating on I2C with 4 I2C LCD 20x4 screens. I setup the master to loop communication on the addresses for each slave. I was able to send and receive information from the slaves to the master and display it on the I2C LCD screens.
@scsiraidguru And?
First computer 1959. Retired from my own computer company 2004.
Hardware - Expert in 1401, and 360, fairly knowledge in PC plus numerous MPU's and MCU's
Major Languages - Machine language, 360 Macro Assembler, Intel Assembler, PL/I and PL1, Pascal, Basic, C plus numerous job control and scripting languages.
Sure you can learn to be a programmer, it will take the same amount of time for me to learn to be a Doctor.
Did you try to get I2C working first and making sure SPI was not conflicting with it.
I had 7 Arduino UNO devices, 2 Arduino Mega devices and a Raspberry Pi communicating on I2C with 4 I2C LCD 20x4 screens. I setup the master to loop communication on the addresses for each slave. I was able to send and receive information from the slaves to the master and display it on the I2C LCD screens.
What does all that stuff do?
First computer 1959. Retired from my own computer company 2004.
Hardware - Expert in 1401, and 360, fairly knowledge in PC plus numerous MPU's and MCU's
Major Languages - Machine language, 360 Macro Assembler, Intel Assembler, PL/I and PL1, Pascal, Basic, C plus numerous job control and scripting languages.
Sure you can learn to be a programmer, it will take the same amount of time for me to learn to be a Doctor.
@henrik_t7 I have attached a screen grab of the Arduino UNO R4 WiFi specs. I see no evidence they designed the board to not be able to use all bus protocols at the same time. If you are seeing failures, I would look at the wiring and code.
First computer 1959. Retired from my own computer company 2004.
Hardware - Expert in 1401, and 360, fairly knowledge in PC plus numerous MPU's and MCU's
Major Languages - Machine language, 360 Macro Assembler, Intel Assembler, PL/I and PL1, Pascal, Basic, C plus numerous job control and scripting languages.
Sure you can learn to be a programmer, it will take the same amount of time for me to learn to be a Doctor.
Thanks for all the replies, it seems that the sensor reads the temperature and shows it on my oled display and on the serial monitor. The program does not make the last if statement and takes the else statement. lines 72 to 80
@henrik_t7 No surprise. Did it ever open the file? I am 100% sure Arduino did not design their product in a way that you can't use SPI and I2C at the same time. If the file was never successfully opened and written to I would suspect a bad card, or bad wiring. If it did open and write at the beginning then that likely means the card is full.
First computer 1959. Retired from my own computer company 2004.
Hardware - Expert in 1401, and 360, fairly knowledge in PC plus numerous MPU's and MCU's
Major Languages - Machine language, 360 Macro Assembler, Intel Assembler, PL/I and PL1, Pascal, Basic, C plus numerous job control and scripting languages.
Sure you can learn to be a programmer, it will take the same amount of time for me to learn to be a Doctor.
I have found a sketch on the web where you can test whether my SD card works and you could write to the SD card. so it works
* Created by ArduinoGetStarted.com * * This example code is in the public domain * * Tutorial page: https://arduinogetstarted.com/tutorials/arduino-write-variable-to-sd-card */ #include <SD.h> #define PIN_SPI_CS 4 File myFile; int myInt = -52; float myFloat = -12.7; String myString = "HELLO"; char myCharArray[] = "ArduinoGetStarted.com"; byte myByteArray[] = {'1', '2', '3', '4', '5'}; void setup() { Serial.begin(9600); if (!SD.begin(PIN_SPI_CS)) { Serial.println(F("SD CARD FAILED, OR NOT PRESENT!")); while (1); // don't do anything more: } Serial.println(F("SD CARD INITIALIZED.")); Serial.println(F("--------------------")); SD.remove("arduino.txt"); // delete the file if existed // create new file by opening file for writing myFile = SD.open("arduino.txt", FILE_WRITE); if (myFile) { myFile.println(myInt); // write int variable to SD card in line myFile.println(myFloat); // write float variable to SD card in line myFile.println(myString); // write String variable to SD card in line myFile.println(myCharArray); // write char array to SD card in line myFile.write(myByteArray, 5); myFile.write("\n"); // new line for (int i = 0; i < 5; i++) { myFile.write(myByteArray[i]); // new line if (i < 4) myFile.write(","); // comma } myFile.write("\n"); // new line myFile.close(); } else { Serial.print(F("SD Card: error on opening file arduino.txt")); } // open file for reading myFile = SD.open("arduino.txt", FILE_READ); if (myFile) { while (myFile.available()) { char ch = myFile.read(); // read characters one by one from Micro SD Card Serial.print(ch); // print the character to Serial Monitor } myFile.close(); } else { Serial.print(F("SD Card: error on opening file arduino.txt")); } } void loop() { }
@henrik_t7 You need to post the entire sketch, there are things you have to do in advance of using the SD card. It's all there in the example.
First computer 1959. Retired from my own computer company 2004.
Hardware - Expert in 1401, and 360, fairly knowledge in PC plus numerous MPU's and MCU's
Major Languages - Machine language, 360 Macro Assembler, Intel Assembler, PL/I and PL1, Pascal, Basic, C plus numerous job control and scripting languages.
Sure you can learn to be a programmer, it will take the same amount of time for me to learn to be a Doctor.
I don't understand,
when I only use I2c with Oled display and temperature sensor, it works super fine together with arduino uno r4, reads the temperature on the Oled display fine.
When I then use the same SPI with SD card and temperature sensor, it cannot write temperature to the SD card?? It seems that the SD card does not open.
That's only if I have both wires for I2c and wires for SPI at the same time .
If I do a test of SPI card with SPI wires mounted and no wires for I2c, can it write data on the SD card??
Has anyone made a test whether the arduino uno r4 can use I2c and SPI at the same time???
You could setup the pin change interrupt and setup the buffer to store the SPI data then set the interrupt to change to the I2C bus. They won't work at the same time. The Giga has 3 IRQs that might be able to use SPI on one IRQ and I2C on another IRQ. The Mega should have enough memory and flash to accomplish it. I usually use my Mega devices for the I2C Master. The Arduino UNO/Hero as slaves with the I2C devices like my LCD Screens for output. Remember I2C is half duplex and SPI is full duplex. I have used my Raspberry Pi 4B as the I2C Master because it has more resources.