Hi everyone,
I’m trying to porting some of previous weatherstation samples I’ve built on others Arduino (mkrwifi1010, nano33iot, arduino R4 wifi) to the new Arduino Q.
I’m doing this usind Arduino IDE 2.3.6
I’ve learnt the hard way that there is no serial communication possible for debugging purposes and so I’m waiting for future updates.
But… never mind, it should be possible to write temperature and humidity to the led matrix!
So I wrote a strange piece of code that read sensors value and write them to the led matrix.
This code is perfectly compiling on Arduino R4 Wifi. I did the try to validate the matrix approach and the sensor communication.
This code is compiling and uploading without error on Arduino Uno Q but NOTHING IS HAPPENING. I tried to desperately add some blinking of leds just for debugging, but.. nothing.
Here comes the code:
#include <Arduino_LED_Matrix.h>
#include "DHT.h"
#define DHTPIN 2
#define DHTTYPE DHT22
Arduino_LED_Matrix matrix;
DHT dht(DHTPIN, DHTTYPE);
float dhtTemp = 0;
float dhtHum = 0;
unsigned long previousMillis = 0;
const unsigned long interval = 3000;
int displayMode = 0;
bool sensorInitialized = false;
void setup() {
// Initialize LED Matrix FIRST and show it works
matrix.begin();
// Show startup immediately
uint8_t startup[104] = {
1,1,1,1,1,1,1,1,1,1,1,1,1,
1,0,0,0,0,0,0,0,0,0,0,0,1,
1,0,0,0,0,0,0,0,0,0,0,0,1,
1,0,0,0,0,0,0,0,0,0,0,0,1,
1,0,0,0,0,0,0,0,0,0,0,0,1,
1,0,0,0,0,0,0,0,0,0,0,0,1,
1,0,0,0,0,0,0,0,0,0,0,0,1,
1,1,1,1,1,1,1,1,1,1,1,1,1
};
matrix.draw(startup);
delay(2000);
// Show "initializing" pattern
uint8_t init[104] = {
0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,1,1,1,1,1,0,0,0,0,
0,0,0,0,1,1,1,1,1,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0
};
matrix.draw(init);
// NOW initialize DHT - but don't let it block
dht.begin();
// Brief delay
delay(1000);
sensorInitialized = true;
// Show ready pattern
uint8_t ready[104] = {
0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,1,1,1,1,1,1,1,0,0,0,
0,0,0,1,1,1,1,1,1,1,0,0,0,
0,0,0,1,1,1,1,1,1,1,0,0,0,
0,0,0,1,1,1,1,1,1,1,0,0,0,
0,0,0,1,1,1,1,1,1,1,0,0,0,
0,0,0,1,1,1,1,1,1,1,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0
};
matrix.draw(ready);
delay(1000);
}
void loop() {
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
if (sensorInitialized) {
// Try to read sensor - use shorter timeout
dhtTemp = dht.readTemperature();
dhtHum = dht.readHumidity();
}
displayData();
displayMode = (displayMode + 1) % 2;
}
}
void displayData() {
uint8_t frame[104] = {0};
if (displayMode == 0) {
// Temperature
if (!isnan(dhtTemp) && dhtTemp > -50 && dhtTemp < 100) {
int temp = (int)round(dhtTemp);
drawNumber(frame, temp, true);
} else {
drawError(frame);
}
} else {
// Humidity
if (!isnan(dhtHum) && dhtHum >= 0 && dhtHum <= 100) {
int hum = (int)round(dhtHum);
drawNumber(frame, hum, false);
} else {
drawError(frame);
}
}
matrix.draw(frame);
}
void drawNumber(uint8_t frame[], int num, bool isTemp) {
if (num < 0) num = 0;
if (num > 99) num = 99;
int tens = num / 10;
int ones = num % 10;
// Icon
if (isTemp) {
frame[1*13 + 0] = 1; frame[1*13 + 1] = 1; frame[1*13 + 2] = 1;
frame[2*13 + 1] = 1;
frame[3*13 + 1] = 1;
frame[4*13 + 1] = 1;
frame[5*13 + 1] = 1;
frame[6*13 + 1] = 1;
} else {
frame[1*13 + 0] = 1; frame[1*13 + 2] = 1;
frame[2*13 + 0] = 1; frame[2*13 + 2] = 1;
frame[3*13 + 0] = 1; frame[3*13 + 1] = 1; frame[3*13 + 2] = 1;
frame[4*13 + 0] = 1; frame[4*13 + 2] = 1;
frame[5*13 + 0] = 1; frame[5*13 + 2] = 1;
frame[6*13 + 0] = 1; frame[6*13 + 2] = 1;
}
if (tens > 0) {
drawDigit(frame, tens, 5);
drawDigit(frame, ones, 9);
} else {
drawDigit(frame, ones, 7);
}
}
void drawDigit(uint8_t frame[], int digit, int startCol) {
switch(digit) {
case 0:
frame[1*13 + startCol] = 1; frame[1*13 + startCol+1] = 1;
frame[1*13 + startCol+2] = 1;
frame[2*13 + startCol] = 1; frame[2*13 + startCol+2] = 1;
frame[3*13 + startCol] = 1; frame[3*13 + startCol+2] = 1;
frame[4*13 + startCol] = 1; frame[4*13 + startCol+2] = 1;
frame[5*13 + startCol] = 1; frame[5*13 + startCol+2] = 1;
frame[6*13 + startCol] = 1; frame[6*13 + startCol+1] = 1; frame[6*13 + startCol+2] = 1;
break;
case 1:
frame[1*13 + startCol+1] = 1;
frame[2*13 + startCol+1] = 1;
frame[3*13 + startCol+1] = 1;
frame[4*13 + startCol+1] = 1;
frame[5*13 + startCol+1] = 1;
frame[6*13 + startCol+1] = 1;
break;
case 2:
frame[1*13 + startCol] = 1; frame[1*13 + startCol+1] = 1; frame[1*13 + startCol+2] = 1;
frame[2*13 + startCol+2] = 1;
frame[3*13 + startCol] = 1; frame[3*13 + startCol+1] = 1; frame[3*13 + startCol+2] = 1;
frame[4*13 + startCol] = 1;
frame[5*13 + startCol] = 1;
frame[6*13 + startCol] = 1; frame[6*13 + startCol+1] = 1; frame[6*13 + startCol+2] = 1;
break;
case 3:
frame[1*13 + startCol] = 1; frame[1*13 + startCol+1] = 1; frame[1*13 + startCol+2] = 1;
frame[2*13 + startCol+2] = 1;
frame[3*13 + startCol] = 1; frame[3*13 + startCol+1] = 1; frame[3*13 + startCol+2] = 1;
frame[4*13 + startCol+2] = 1;
frame[5*13 + startCol+2] = 1;
frame[6*13 + startCol] = 1; frame[6*13 + startCol+1] = 1; frame[6*13 + startCol+2] = 1;
break;
case 4:
frame[1*13 + startCol] = 1; frame[1*13 + startCol+2] = 1;
frame[2*13 + startCol] = 1; frame[2*13 + startCol+2] = 1;
frame[3*13 + startCol] = 1; frame[3*13 + startCol+1] = 1; frame[3*13 + startCol+2] = 1;
frame[4*13 + startCol+2] = 1;
frame[5*13 + startCol+2] = 1;
frame[6*13 + startCol+2] = 1;
break;
case 5:
frame[1*13 + startCol] = 1; frame[1*13 + startCol+1] = 1; frame[1*13 + startCol+2] = 1;
frame[2*13 + startCol] = 1;
frame[3*13 + startCol] = 1; frame[3*13 + startCol+1] = 1; frame[3*13 + startCol+2] = 1;
frame[4*13 + startCol+2] = 1;
frame[5*13 + startCol+2] = 1;
frame[6*13 + startCol] = 1; frame[6*13 + startCol+1] = 1; frame[6*13 + startCol+2] = 1;
break;
case 6:
frame[1*13 + startCol] = 1; frame[1*13 + startCol+1] = 1; frame[1*13 + startCol+2] = 1;
frame[2*13 + startCol] = 1;
frame[3*13 + startCol] = 1; frame[3*13 + startCol+1] = 1; frame[3*13 + startCol+2] = 1;
frame[4*13 + startCol] = 1; frame[4*13 + startCol+2] = 1;
frame[5*13 + startCol] = 1; frame[5*13 + startCol+2] = 1;
frame[6*13 + startCol] = 1; frame[6*13 + startCol+1] = 1; frame[6*13 + startCol+2] = 1;
break;
case 7:
frame[1*13 + startCol] = 1; frame[1*13 + startCol+1] = 1; frame[1*13 + startCol+2] = 1;
frame[2*13 + startCol+2] = 1;
frame[3*13 + startCol+2] = 1;
frame[4*13 + startCol+1] = 1;
frame[5*13 + startCol+1] = 1;
frame[6*13 + startCol+1] = 1;
break;
case 8:
frame[1*13 + startCol] = 1; frame[1*13 + startCol+1] = 1; frame[1*13 + startCol+2] = 1;
frame[2*13 + startCol] = 1; frame[2*13 + startCol+2] = 1;
frame[3*13 + startCol] = 1; frame[3*13 + startCol+1] = 1; frame[3*13 + startCol+2] = 1;
frame[4*13 + startCol] = 1; frame[4*13 + startCol+2] = 1;
frame[5*13 + startCol] = 1; frame[5*13 + startCol+2] = 1;
frame[6*13 + startCol] = 1; frame[6*13 + startCol+1] = 1; frame[6*13 + startCol+2] = 1;
break;
case 9:
frame[1*13 + startCol] = 1; frame[1*13 + startCol+1] = 1; frame[1*13 + startCol+2] = 1;
frame[2*13 + startCol] = 1; frame[2*13 + startCol+2] = 1;
frame[3*13 + startCol] = 1; frame[3*13 + startCol+1] = 1; frame[3*13 + startCol+2] = 1;
frame[4*13 + startCol+2] = 1;
frame[5*13 + startCol+2] = 1;
frame[6*13 + startCol] = 1; frame[6*13 + startCol+1] = 1; frame[6*13 + startCol+2] = 1;
break;
}
}
void drawError(uint8_t frame[]) {
frame[1*13 + 4] = 1; frame[1*13 + 8] = 1;
frame[2*13 + 5] = 1; frame[2*13 + 7] = 1;
frame[3*13 + 6] = 1;
frame[4*13 + 6] = 1;
frame[5*13 + 5] = 1; frame[5*13 + 7] = 1;
frame[6*13 + 4] = 1; frame[6*13 + 8] = 1;
}
Consider that if I use same approach to the led matrix and I remove the sensor reading part as in following code:
//Arduino UNO Q LED Matrix - Number Display Test
//8 rows x 13 columns matrix
//No sensors - just displays numbers 0-99 in a loop
#include <Arduino_LED_Matrix.h>
Arduino_LED_Matrix matrix;
int currentNumber = 0;
unsigned long previousMillis = 0;
const unsigned long interval = 1000; // Change number every 1 second
void setup() {
// Initialize LED Matrix
matrix.begin();
// Show startup pattern - 8x13 array
uint8_t startup[104] = {
1,1,1,1,1,1,1,1,1,1,1,1,1,
1,0,0,0,0,0,0,0,0,0,0,0,1,
1,0,0,0,0,0,0,0,0,0,0,0,1,
1,0,0,0,0,0,0,0,0,0,0,0,1,
1,0,0,0,0,0,0,0,0,0,0,0,1,
1,0,0,0,0,0,0,0,0,0,0,0,1,
1,0,0,0,0,0,0,0,0,0,0,0,1,
1,1,1,1,1,1,1,1,1,1,1,1,1
};
matrix.draw(startup);
delay(2000);
}
void loop() {
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
// Display current number
displayNumber(currentNumber);
// Increment number (loop back to 0 after 99)
currentNumber++;
if (currentNumber > 99) {
currentNumber = 0;
}
}
}
void displayNumber(int num) {
// 8 rows x 13 columns = 104 elements
uint8_t frame[104] = {0};
// Limit to valid range
if (num < 0) num = 0;
if (num > 99) num = 99;
int tens = num / 10;
int ones = num % 10;
// Each digit is 3 columns wide
if (tens > 0) {
// Two digit number: tens at column 3, ones at column 8
drawDigit(frame, tens, 3);
drawDigit(frame, ones, 8);
} else {
// Single digit: center it at column 5
drawDigit(frame, ones, 5);
}
matrix.draw(frame);
}
void drawDigit(uint8_t frame[], int digit, int startCol) {
// Draw digit starting at row 1, using rows 1-6 (leaving top and bottom empty)
// Array position = row * 13 + col
switch(digit) {
case 0:
// Row 1
frame[1*13 + startCol] = 1; frame[1*13 + startCol+1] = 1; frame[1*13 + startCol+2] = 1;
// Row 2
frame[2*13 + startCol] = 1; frame[2*13 + startCol+2] = 1;
// Row 3
frame[3*13 + startCol] = 1; frame[3*13 + startCol+2] = 1;
// Row 4
frame[4*13 + startCol] = 1; frame[4*13 + startCol+2] = 1;
// Row 5
frame[5*13 + startCol] = 1; frame[5*13 + startCol+2] = 1;
// Row 6
frame[6*13 + startCol] = 1; frame[6*13 + startCol+1] = 1; frame[6*13 + startCol+2] = 1;
break;
case 1:
frame[1*13 + startCol+1] = 1;
frame[2*13 + startCol+1] = 1;
frame[3*13 + startCol+1] = 1;
frame[4*13 + startCol+1] = 1;
frame[5*13 + startCol+1] = 1;
frame[6*13 + startCol+1] = 1;
break;
case 2:
frame[1*13 + startCol] = 1; frame[1*13 + startCol+1] = 1; frame[1*13 + startCol+2] = 1;
frame[2*13 + startCol+2] = 1;
frame[3*13 + startCol] = 1; frame[3*13 + startCol+1] = 1; frame[3*13 + startCol+2] = 1;
frame[4*13 + startCol] = 1;
frame[5*13 + startCol] = 1;
frame[6*13 + startCol] = 1; frame[6*13 + startCol+1] = 1; frame[6*13 + startCol+2] = 1;
break;
case 3:
frame[1*13 + startCol] = 1; frame[1*13 + startCol+1] = 1; frame[1*13 + startCol+2] = 1;
frame[2*13 + startCol+2] = 1;
frame[3*13 + startCol] = 1; frame[3*13 + startCol+1] = 1; frame[3*13 + startCol+2] = 1;
frame[4*13 + startCol+2] = 1;
frame[5*13 + startCol+2] = 1;
frame[6*13 + startCol] = 1; frame[6*13 + startCol+1] = 1; frame[6*13 + startCol+2] = 1;
break;
case 4:
frame[1*13 + startCol] = 1; frame[1*13 + startCol+2] = 1;
frame[2*13 + startCol] = 1; frame[2*13 + startCol+2] = 1;
frame[3*13 + startCol] = 1; frame[3*13 + startCol+1] = 1; frame[3*13 + startCol+2] = 1;
frame[4*13 + startCol+2] = 1;
frame[5*13 + startCol+2] = 1;
frame[6*13 + startCol+2] = 1;
break;
case 5:
frame[1*13 + startCol] = 1; frame[1*13 + startCol+1] = 1; frame[1*13 + startCol+2] = 1;
frame[2*13 + startCol] = 1;
frame[3*13 + startCol] = 1; frame[3*13 + startCol+1] = 1; frame[3*13 + startCol+2] = 1;
frame[4*13 + startCol+2] = 1;
frame[5*13 + startCol+2] = 1;
frame[6*13 + startCol] = 1; frame[6*13 + startCol+1] = 1; frame[6*13 + startCol+2] = 1;
break;
case 6:
frame[1*13 + startCol] = 1; frame[1*13 + startCol+1] = 1; frame[1*13 + startCol+2] = 1;
frame[2*13 + startCol] = 1;
frame[3*13 + startCol] = 1; frame[3*13 + startCol+1] = 1; frame[3*13 + startCol+2] = 1;
frame[4*13 + startCol] = 1; frame[4*13 + startCol+2] = 1;
frame[5*13 + startCol] = 1; frame[5*13 + startCol+2] = 1;
frame[6*13 + startCol] = 1; frame[6*13 + startCol+1] = 1; frame[6*13 + startCol+2] = 1;
break;
case 7:
frame[1*13 + startCol] = 1; frame[1*13 + startCol+1] = 1; frame[1*13 + startCol+2] = 1;
frame[2*13 + startCol+2] = 1;
frame[3*13 + startCol+2] = 1;
frame[4*13 + startCol+1] = 1;
frame[5*13 + startCol+1] = 1;
frame[6*13 + startCol+1] = 1;
break;
case 8:
frame[1*13 + startCol] = 1; frame[1*13 + startCol+1] = 1; frame[1*13 + startCol+2] = 1;
frame[2*13 + startCol] = 1; frame[2*13 + startCol+2] = 1;
frame[3*13 + startCol] = 1; frame[3*13 + startCol+1] = 1; frame[3*13 + startCol+2] = 1;
frame[4*13 + startCol] = 1; frame[4*13 + startCol+2] = 1;
frame[5*13 + startCol] = 1; frame[5*13 + startCol+2] = 1;
frame[6*13 + startCol] = 1; frame[6*13 + startCol+1] = 1; frame[6*13 + startCol+2] = 1;
break;
case 9:
frame[1*13 + startCol] = 1; frame[1*13 + startCol+1] = 1; frame[1*13 + startCol+2] = 1;
frame[2*13 + startCol] = 1; frame[2*13 + startCol+2] = 1;
frame[3*13 + startCol] = 1; frame[3*13 + startCol+1] = 1; frame[3*13 + startCol+2] = 1;
frame[4*13 + startCol+2] = 1;
frame[5*13 + startCol+2] = 1;
frame[6*13 + startCol] = 1; frame[6*13 + startCol+1] = 1; frame[6*13 + startCol+2] = 1;
break;
}
}
the magic happens and I see numbers incrementing on the led matrix as it should be.
The conclusion is that DHT.h library is not supported?
If so, why didn’t I get any compiling error?
And, how is possible to read a DHT22 (and ds18b02, and BME280,..) sensor with ArduinoQ?
Thanks a lot for support and guidance on these questions.



