Hello I’ve using temperature sensor several times in the recent past with other boards with no problems but now I can not make it work on xiao esp32c6.
On compilation i get this:
c:\Users\david.atauri\Documents\Arduino\libraries\OneWire\util/OneWire_direct_gpio.h:174:25: error: no match for ‘operator>>’ (operand types are ‘volatile gpio_in_reg_t’ and ‘uint32_t’ {aka ‘long unsigned int’})
174 | return (GPIO.in >> pin) & 0x1;
| ~~~~~~~ ^~ ~~~
| | |
| | uint32_t {aka long unsigned int}
| volatile gpio_in_reg_t
I have tried diferent versions and I can avoid the error but no readings (device is not found)
Hi there,
Well without seeing the code in question, I would try using the GPIO pin numbers instead of the logical numbers. I would try that.
If not then perhaps post the code using the code tags above “</>” and paste it in there.
HTH
GL PJ
So here is an Example ,Demo I posted a while back, at the end you’ll see the actual unit working. The code is posted below, I found how you power the DS18B20 can also effect the overall operation, it supports both Parasitic power and traditional methods.
/**************************************************************************
This is an example of the Cheepest OLEDs based on SSD1306 & a DS18B20 Temp sensor.
connected to a grove Expansion Board.
This example is for a 128x32 pixel display using I2C to communicate
3 pins are required to interface (two I2C and one reset).
/**************************************************************************/
#include <Arduino.h>
//#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
//#include <OneWire.h>
//#include <DallasTemperature.h>
//#include <Fonts/FreeSerif12pt7b.h>
//#include <Fonts/FreeSerif9pt7b.h>
//#define ONE_WIRE_BUS D7
//OneWire oneWire(ONE_WIRE_BUS);
//DallasTemperature DS18B20(&oneWire);
//Adafruit_SSD1306 display(128, 64, &Wire, -1);
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 32 // OLED display height, in pixels
// Define monochrome graphics:
static const unsigned char PROGMEM _error [] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFC, 0x00, 0x00, 0xE0, 0x07, 0x00, 0x01, 0x80, 0x01, 0x80,
0x06, 0x00, 0x00, 0x60, 0x0C, 0x00, 0x00, 0x30, 0x08, 0x01, 0x80, 0x10, 0x10, 0x03, 0xC0, 0x08,
0x30, 0x02, 0x40, 0x0C, 0x20, 0x02, 0x40, 0x04, 0x60, 0x02, 0x40, 0x06, 0x40, 0x02, 0x40, 0x02,
0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02,
0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x03, 0xC0, 0x02, 0x40, 0x01, 0x80, 0x02,
0x40, 0x00, 0x00, 0x02, 0x60, 0x00, 0x00, 0x06, 0x20, 0x01, 0x80, 0x04, 0x30, 0x03, 0xC0, 0x0C,
0x10, 0x03, 0xC0, 0x08, 0x08, 0x01, 0x80, 0x10, 0x0C, 0x00, 0x00, 0x30, 0x06, 0x00, 0x00, 0x60,
0x01, 0x80, 0x01, 0x80, 0x00, 0xE0, 0x07, 0x00, 0x00, 0x3F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00
};
// Define the data holders:
//float t = m_temperature;
//float temps, m_temperature;
int class_number = 0;
long timer;
uint16_t error;
char errorMessage[256];
// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
#define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin)
#define SCREEN_ADDRESS 0x3C //datasheet; 0x3D for 128x64, 0x3C for 128x32 Check the address with an I2C scanner. If it shows 0x78 (0x3C in 7-bit form)GOOD!
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
#define NUMFLAKES 10 // Number of snowflakes in the animation example
#define LOGO_HEIGHT 12
#define LOGO_WIDTH 12
static const unsigned char PROGMEM logo_bmp[] =
{ 0b00000000, 0b11000000,
0b00000001, 0b11000000,
0b00000001, 0b11000000,
0b00000011, 0b11100000,
0b11110011, 0b11100000,
0b11111110, 0b11111000,
0b01111110, 0b11111111,
0b00110011, 0b10011111,
0b00011111, 0b11111100,
0b00001101, 0b01110000,
0b00011011, 0b10100000,
0b00111111, 0b11100000,
0b00111111, 0b11110000,
0b01111100, 0b11110000,
0b01110000, 0b01110000,
0b00000000, 0b00110000 };
bool first10LoopCompleted = false;
int deviceCount = 0; // variable to store the number of devices connected
//DeviceAddress deviceAddress; // variable to store the device address
void setup() {
Wire.begin(9,10); //Check the address with an I2C scanner. If it shows 0x78 (or possibly 0x3C in 7-bit form), you’re good.
delay(250);
Serial.begin(9600);
delay(2000);
Serial.println();
Serial.println("Program " __FILE__ " compiled on " __DATE__ " at " __TIME__);
Serial.println();
Serial.println("Processor came out of reset.");
Serial.println();
delay (500);
// SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
//for(;;); // Don't proceed, loop forever
}
display.display();
delay(2000); // Pause for 2 seconds
// Clear the buffer
display.clearDisplay();
// Draw a single pixel in white
display.drawPixel(10, 10, SSD1306_WHITE);
// Show the display buffer on the screen. You MUST call display() after
// drawing commands to make them visible on screen!
display.display();
delay(1000);
//testdrawchar(); // Draw characters of the default font
//testdrawstyles(); // Draw 'stylized' characters
testscrolltext(); // Draw scrolling text
testdrawbitmap(); // Draw a small bitmap image
// Invert and restore display, pausing in-between
display.invertDisplay(true);
delay(500);
display.invertDisplay(false);
delay(500);
//testanimate(logo_bmp, LOGO_WIDTH, LOGO_HEIGHT); // Animate bitmaps
}
void loop() {
testscrolltext(); // Draw scrolling text
delay (5000);
}
void testdrawchar(void) {
display.clearDisplay();
display.setTextSize(1); // Normal 1:1 pixel scale
display.setTextColor(SSD1306_WHITE); // Draw white text
display.setCursor(0, 0); // Start at top-left corner
display.cp437(true); // Use full 256 char 'Code Page 437' font
// Not all the characters will fit on the display. This is normal.
// Library will draw what it can and the rest will be clipped.
for(int16_t i=0; i<128; i++) {
if(i == '\n') display.write(' ');
else display.write(i);
}
display.display();
delay(1000);
}
void err_msg(){
// Show the error message on the SSD1306 screen.
display.clearDisplay();
display.drawBitmap(48, 0, _error, 32, 32, SSD1306_WHITE);
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0,40);
display.println("Check the serial monitor to see the error!");
display.display();
}
void testdrawstyles(void) {
display.clearDisplay();
display.setTextSize(1); // Normal 1:1 pixel scale
display.setTextColor(SSD1306_WHITE); // Draw white text
display.setCursor(0,0); // Start at top-left corner
display.println(F("Hello, DUDE!! "));
display.setTextColor(SSD1306_BLACK, SSD1306_WHITE); // Draw 'inverse' text
display.println(3.141592);
display.setTextSize(2); // Draw 2X-scale text
display.setTextColor(SSD1306_WHITE);
display.print(F("0x")); display.println(0xDEADBEEF, HEX);
display.display();
delay(500);
}
void testscrolltext(void) {
display.clearDisplay();
display.setTextSize(1); // Draw 2X-scale text
display.setTextColor(SSD1306_WHITE);
display.setCursor(10, 0);
display.print(F("Temp Is\n"));
display.display(); // Show initial text
delay(100);
// Scroll in various directions, pausing in-between:
display.startscrollright(0x00, 0x0F);
delay(2300);
display.stopscroll();
delay(200);
display.startscrollleft(0x00, 0x0F);
delay(2500);
display.stopscroll();
display.setTextColor(SSD1306_BLACK);
display.setCursor(10, 0);
display.print("Temp Is");
display.display(); // Show initial text
delay(300);
display.setTextColor(SSD1306_WHITE);
display.setTextSize(2); // Draw 2X-scale text
display.setCursor(0, 10);
float ctemp = 98.6;
delay(250);
display.print(ctemp);
display.print(" ");
display.setTextSize(1);
display.print("F");
delay(2000);
display.display();
delay(2000);
display.startscrolldiagright(0x00, 0x07);
delay(2000);
display.startscrolldiagleft(0x00, 0x07);
delay(2000);
display.stopscroll();
delay(2000);
}
void testdrawbitmap(void) {
display.clearDisplay();
display.drawBitmap(
(display.width() - LOGO_WIDTH ) / 2,
(display.height() - LOGO_HEIGHT) / 2,
logo_bmp, LOGO_WIDTH, LOGO_HEIGHT, 1);
display.display();
delay(1000);
}
#define XPOS 0 // Indexes into the 'icons' array in function below
#define YPOS 1
#define DELTAY 2
void testanimate(const uint8_t *bitmap, uint8_t w, uint8_t h) {
int8_t f, icons[NUMFLAKES][3];
// Initialize 'snowflake' positions
for(f=0; f< NUMFLAKES; f++) {
icons[f][XPOS] = random(1 - LOGO_WIDTH, display.width());
icons[f][YPOS] = -LOGO_HEIGHT;
icons[f][DELTAY] = random(1, 6);
Serial.print(F("x: "));
Serial.print(icons[f][XPOS], DEC);
Serial.print(F(" y: "));
Serial.print(icons[f][YPOS], DEC);
Serial.print(F(" dy: "));
Serial.println(icons[f][DELTAY], DEC);
}
for(;;) { // Loop forever...
display.clearDisplay(); // Clear the display buffer
// Draw each snowflake:
for(f=0; f< NUMFLAKES; f++) {
display.drawBitmap(icons[f][XPOS], icons[f][YPOS], bitmap, w, h, SSD1306_WHITE);
}
display.display(); // Show the display buffer on the screen
delay(200); // Pause for 1/10 second
// Then update coordinates of each flake...
for(f=0; f< NUMFLAKES; f++) {
icons[f][YPOS] += icons[f][DELTAY];
// If snowflake is off the bottom of the screen...
if (icons[f][YPOS] >= display.height()) {
// Reinitialize to a random position, just off the top
icons[f][XPOS] = random(1 - LOGO_WIDTH, display.width());
icons[f][YPOS] = -LOGO_HEIGHT;
icons[f][DELTAY] = random(1, 6);
}
}
}
}
Try to write a simple sketch that reads from the GPIO pin you’re using and prints the result. This will confirm whether the pin is properly reading the state or if the issue is with the hardware setup.
void setup() {
Serial.begin(115200);
pinMode(4, INPUT); // Replace with your actual pin
}
void loop() {
int val = digitalRead(4); // Replace with your actual pin
Serial.println(val);
delay(500);
}