So I added to my code the ability to read the 2s voltage, but suddenly it stopped working
The previous version: (working)
// Ultima edicao: 25/12/2024
#include <Arduino.h>
#include <SPI.h>
#include <Wire.h>
#include "Adafruit_MCP23X17.h"
#include "U8g2lib.h"
#include "nRF24L01.h"
#include "RF24.h"
#define LCDWidth u8g2.getDisplayWidth()
#define ALIGN_CENTER(t) ((LCDWidth - (u8g2.getUTF8Width(t))) / 2)
#define ALIGN_RIGHT(t) (LCDWidth - u8g2.getUTF8Width(t))
#define ALIGN_LEFT 0
#define SDA1 14
#define SCL1 13
TwoWire I2C_1 = TwoWire(1);
Adafruit_MCP23X17 mcp;
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0); // All Boards without Reset of the Display
RF24 radio(4, 5);
uint8_t joyAX; // Joystick Esquerdo X (0-255) (Midpoint: 119)
uint8_t joyAY; // Joystick Esquerdo Y (0-255) (Midpoint: 119)
uint8_t joyBX; // Joystick Direito X (0-255) (Midpoint: 119)
uint8_t joyBY; // Joystick Direito Y (0-255) (Midpoint: 119)
uint8_t pot1;
uint8_t pot2;
uint8_t pot3;
uint8_t pot4;
struct MeuControleRemoto {
boolean BotEsqCim = 0;
boolean BotEsqEsq = 0;
boolean BotEsqDir = 0;
boolean BotEsqBai = 0;
boolean BotDirCim = 0;
boolean BotDirEsq = 0;
boolean BotDirDir = 0;
boolean BotDirBai = 0;
boolean Mts1 = 0;
boolean Mts2 = 0;
boolean Mts3 = 0;
boolean Mts4 = 0;
byte Pot1 = 0;
byte Pot2 = 0;
byte Pot3 = 0;
byte Pot4 = 0;
byte JoyDireitaX = 127;
byte JoyDireitaY = 127;
byte JoyEsquerdaX = 127;
byte JoyEsquerdaY = 127;
};
MeuControleRemoto ControleRemoto;
// Os 2 Joysticks + 4 Potenciometros
byte joyAXp = 27;
byte joyAYp = 26;
byte joyBXp = 25;
byte joyBYp = 33;
byte pot1p = 35;
byte pot2p = 34;
byte pot3p = 2;
byte pot4p = 15;
// No esp
#define Mts1Pin 16
#define Mts2Pin 17
#define Mts3Pin 32
// No MCP
#define BotEsqCimPin 0 // GPA0
#define BotEsqDirPin 1 // GPA1
#define BotEsqBaiPin 2 // GPA2
#define BotEsqEsqPin 3 // GPA3
#define BotDirCimPin 4 // GPA4
#define BotDirDirPin 5 // GPA5
#define BotDirBaiPin 6 // GPA6
#define BotDirEsqPin 7 // GPA7
#define Mts4Pin 8 // GPB0
#define JoyEsqBotao 9 // GPB1
#define JoyDirBotao 10 // GPB2
const int numReadings = 10; // Número de leituras para calcular a média
const int numJoysticks = 8; // Número de entradas de joystick
// Pinos dos joysticks
const int joystickPins[numJoysticks] = {joyAXp, joyAYp, joyBXp, joyBYp, pot1p, pot2p, pot3p, pot4p};
struct Joystick {
int pin;
int readings[numReadings];
int readIndex;
long total;
int count;
};
Joystick joysticks[numJoysticks];
int getSmoothedJoystickValue(Joystick &joystick) {
joystick.total -= joystick.readings[joystick.readIndex];
int newValue = analogRead(joystick.pin);
joystick.readings[joystick.readIndex] = newValue;
joystick.total += newValue;
joystick.readIndex = (joystick.readIndex + 1) % numReadings;
if (joystick.count < numReadings) {
joystick.count++;
}
return joystick.total / joystick.count;
}
char *rcName = "TESTE";
uint8_t canal = 76;
uint8_t remoteBattery = 30;
void setup(void) {
Serial.begin(115200);
u8g2.begin();
for (int i = 0; i < numJoysticks; i++) {
joysticks[i] = {joystickPins[i], {0}, 0, 0, 0};
pinMode(joysticks[i].pin, INPUT);
}
if (radio.isChipConnected())
Serial.println("\n\nTransmitter NF24 connected to SPI");
else Serial.println("\n\nNF24 is NOT connected to SPI");
// Inicialize o segundo barramento I2C
I2C_1.begin(SDA1, SCL1, 100000); // 100kHz é a frequência do I2C
// Inicialize o MCP23017 com o barramento I2C1
if (!mcp.begin_I2C(0x20, &I2C_1)) { // Inicializa com o endereço 0x20
Serial.println("Erro ao iniciar MCP23017.");
while (1); // Pare o programa se o MCP23017 não puder ser inicializado
}
for (int i = 0; i < 11; i++) {mcp.pinMode(i, INPUT_PULLUP);}
// Configure o pino 0 como entrada com pull-up interno ativado
radio.begin(); // Inicializando o MÓDULO RF24l01 para comunicação.
radio.setAutoAck(false); // Desativando pacotes ACK (Pacote de Confirmação de Recebimento de Mensagem)
radio.setChannel(76); // Configurando Módulo para operar no canal número 1 (você pode escolher um canal de 0 a 127) (Canal Padrão é o 76)
radio.setDataRate(RF24_250KBPS); // Configurando Módulo para operar em uma taxa de 250kbps (Menor taxa de dados possível para um maior alcance do rádio)
radio.setPALevel(RF24_PA_HIGH); // Configurando Módulo para transmitir em potência máxima
radio.powerUp(); // Ativando Módulo, caso entre em estado de baixo consumo.
radio.openWritingPipe(0xE8E8F0F0E1LL); // Abrindo o meio de comunicação entre transmissor e receptor e configurando endereço de comunicação (0xE8E8F0F0E1LL)
radio.stopListening(); // Interrompendo mecanismos de recepção "escuta" do Módulo
pinMode(Mts1Pin, INPUT);
pinMode(Mts2Pin, INPUT);
pinMode(Mts3Pin, INPUT);
}
void loop()
{
joyAX = map(getSmoothedJoystickValue(joysticks[0]), 0, 4095, 0, 255);
joyAY = map(getSmoothedJoystickValue(joysticks[1]), 0, 4095, 0, 255);
joyBX = map(getSmoothedJoystickValue(joysticks[2]), 0, 4095, 0, 255);
joyBY = map(getSmoothedJoystickValue(joysticks[3]), 0, 4095, 0, 255);
pot1 = map(getSmoothedJoystickValue(joysticks[4]), 0, 4095, 0, 255);
pot2 = map(getSmoothedJoystickValue(joysticks[5]), 0, 4095, 0, 255);
pot3 = map(getSmoothedJoystickValue(joysticks[6]), 0, 4095, 0, 255);
pot4 = map(getSmoothedJoystickValue(joysticks[7]), 0, 4095, 0, 255);
Serial.print("joyAX: ");
Serial.print(joyAX);
Serial.print(" joyAY: ");
Serial.print(joyAY);
Serial.print(" | ");
Serial.print("joyBX: ");
Serial.print(joyBX);
Serial.print(" joyBY: ");
Serial.println(joyBY);
ControleRemoto.JoyEsquerdaX = joyAX;
ControleRemoto.JoyEsquerdaY = joyAY;
ControleRemoto.JoyDireitaX = joyBX;
ControleRemoto.JoyDireitaY = joyBY;
ControleRemoto.Pot1 = pot1;
ControleRemoto.Pot2 = pot2;
ControleRemoto.Pot3 = pot3;
ControleRemoto.Pot4 = pot4;
ControleRemoto.BotEsqCim = mcp.digitalRead(BotEsqCimPin);
ControleRemoto.BotEsqDir = mcp.digitalRead(BotEsqDirPin);
ControleRemoto.BotEsqBai = mcp.digitalRead(BotEsqBaiPin);
ControleRemoto.BotEsqEsq = mcp.digitalRead(BotEsqEsqPin);
ControleRemoto.BotDirCim = mcp.digitalRead(BotDirCimPin);
ControleRemoto.BotDirDir = mcp.digitalRead(BotDirDirPin);
ControleRemoto.BotDirBai = mcp.digitalRead(BotDirBaiPin);
ControleRemoto.BotDirEsq = mcp.digitalRead(BotDirEsqPin);
ControleRemoto.Mts1 = digitalRead(Mts1Pin);
ControleRemoto.Mts2 = digitalRead(Mts2Pin);
ControleRemoto.Mts3 = digitalRead(Mts3Pin);
ControleRemoto.Mts4 = mcp.digitalRead(Mts4Pin);
if (0)
{
Serial.println("Atualizou");
u8g2.clearBuffer(); // clear the internal memory
u8g2.setFont(u8g2_font_amstrad_cpc_extended_8u);
u8g2.setCursor(1, 13);
u8g2.print(F("CANAL: "));
u8g2.setCursor(55, 13);
u8g2.print(canal);
u8g2.setFont(u8g2_font_t0_11_mr);
u8g2.setCursor(ALIGN_CENTER(rcName), 30);
u8g2.print(rcName);
u8g2.setCursor(97, 11); // 12
u8g2.print(String(remoteBattery / 10.0, 1) + "v");
u8g2.setCursor(97, 61);
// u8g2.print(String(ControleRemoto.rcBattery / 10.0, 1) + "v");
/* Ícones
u8g2.drawXBMP(107, 3, 20, 10, batLevel);
u8g2.drawXBMP(107, 52, 20, 10, RCbatLevel);
u8g2.drawXBMP(1, 50, 13, 13, configIcon);
*/
u8g2.drawHLine(0, 15, 128);
u8g2.drawHLine(0, 47, 128);
u8g2.sendBuffer(); // transfer internal memory to the display
//u8g2.setPowerSave(1);
//delay(5000);
//u8g2.setPowerSave(0);
//x += 1;
}
radio.write(&ControleRemoto, sizeof(ControleRemoto));
}
The modified version: (Not working)
// Ultima edicao: 25/12/2024
#include <Arduino.h>
#include <SPI.h>
#include <Wire.h>
#include "Adafruit_MCP23X17.h"
#include "U8g2lib.h"
#include "nRF24L01.h"
#include "RF24.h"
#define LCDWidth u8g2.getDisplayWidth()
#define ALIGN_CENTER(t) ((LCDWidth - (u8g2.getUTF8Width(t))) / 2)
#define ALIGN_RIGHT(t) (LCDWidth - u8g2.getUTF8Width(t))
#define ALIGN_LEFT 0
#define SDA1 14
#define SCL1 13
TwoWire I2C_1 = TwoWire(1);
Adafruit_MCP23X17 mcp;
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0); // All Boards without Reset of the Display
RF24 radio(4, 5);
uint8_t joyAX; // Joystick Esquerdo X (0-255) (Midpoint: 119)
uint8_t joyAY; // Joystick Esquerdo Y (0-255) (Midpoint: 119)
uint8_t joyBX; // Joystick Direito X (0-255) (Midpoint: 119)
uint8_t joyBY; // Joystick Direito Y (0-255) (Midpoint: 119)
uint8_t pot1;
uint8_t pot2;
uint8_t pot3;
uint8_t pot4;
struct MeuControleRemoto {
boolean BotEsqCim = 0;
boolean BotEsqEsq = 0;
boolean BotEsqDir = 0;
boolean BotEsqBai = 0;
boolean BotDirCim = 0;
boolean BotDirEsq = 0;
boolean BotDirDir = 0;
boolean BotDirBai = 0;
boolean Mts1 = 0;
boolean Mts2 = 0;
boolean Mts3 = 0;
boolean Mts4 = 0;
byte Pot1 = 0;
byte Pot2 = 0;
byte Pot3 = 0;
byte Pot4 = 0;
byte JoyDireitaX = 127;
byte JoyDireitaY = 127;
byte JoyEsquerdaX = 127;
byte JoyEsquerdaY = 127;
};
MeuControleRemoto ControleRemoto;
// Os 2 Joysticks + 4 Potenciometros
byte joyAXp = 27;
byte joyAYp = 26;
byte joyBXp = 25;
byte joyBYp = 33;
byte pot1p = 35;
byte pot2p = 34;
byte pot3p = 2;
byte pot4p = 15;
// No esp
#define Mts1Pin 16
#define Mts2Pin 17
// No MCP
#define BotEsqCimPin 0 // GPA0
#define BotEsqDirPin 1 // GPA1
#define BotEsqBaiPin 2 // GPA2
#define BotEsqEsqPin 3 // GPA3
#define BotDirCimPin 4 // GPA4
#define BotDirDirPin 5 // GPA5
#define BotDirBaiPin 6 // GPA6
#define BotDirEsqPin 7 // GPA7
#define Mts4Pin 8 // GPB0
#define JoyEsqBotao 9 // GPB1
#define JoyDirBotao 10 // GPB2
#define Mts3Pin 11
const int numReadings = 10; // Número de leituras para calcular a média
const int numJoysticks = 8; // Número de entradas de joystick
// Pinos dos joysticks
const int joystickPins[numJoysticks] = {joyAXp, joyAYp, joyBXp, joyBYp, pot1p, pot2p, pot3p, pot4p};
struct Joystick {
int pin;
int readings[numReadings];
int readIndex;
long total;
int count;
};
Joystick joysticks[numJoysticks];
int getSmoothedJoystickValue(Joystick &joystick) {
joystick.total -= joystick.readings[joystick.readIndex];
int newValue = analogRead(joystick.pin);
joystick.readings[joystick.readIndex] = newValue;
joystick.total += newValue;
joystick.readIndex = (joystick.readIndex + 1) % numReadings;
if (joystick.count < numReadings) {
joystick.count++;
}
return joystick.total / joystick.count;
}
char *rcName = "TESTE";
uint8_t canal = 76;
float Bateria;
unsigned long lastLeituraBateriaMillis = 0;
unsigned long currentMillis = millis();
void setup() {
Serial.println("oi");
Serial.begin(115200);
u8g2.begin();
for (int i = 0; i < numJoysticks; i++) {
joysticks[i] = {joystickPins[i], {0}, 0, 0, 0};
pinMode(joysticks[i].pin, INPUT);
}
if (radio.isChipConnected())
Serial.println("\n\nTransmitter NF24 connected to SPI");
else Serial.println("\n\nNF24 is NOT connected to SPI");
// Inicialize o segundo barramento I2C
I2C_1.begin(SDA1, SCL1, 100000); // 100kHz é a frequência do I2C
// Inicialize o MCP23017 com o barramento I2C1
if (!mcp.begin_I2C(0x20, &I2C_1)) { // Inicializa com o endereço 0x20
Serial.println("Erro ao iniciar MCP23017.");
while (1); // Pare o programa se o MCP23017 não puder ser inicializado
}
for (int i = 0; i < 11; i++) {mcp.pinMode(i, INPUT_PULLUP);}
// Configure o pino 0 como entrada com pull-up interno ativado
radio.begin(); // Inicializando o MÓDULO RF24l01 para comunicação.
radio.setAutoAck(false); // Desativando pacotes ACK (Pacote de Confirmação de Recebimento de Mensagem)
radio.setChannel(76); // Configurando Módulo para operar no canal número 1 (você pode escolher um canal de 0 a 127) (Canal Padrão é o 76)
radio.setDataRate(RF24_250KBPS); // Configurando Módulo para operar em uma taxa de 250kbps (Menor taxa de dados possível para um maior alcance do rádio)
radio.setPALevel(RF24_PA_HIGH); // Configurando Módulo para transmitir em potência máxima
radio.powerUp(); // Ativando Módulo, caso entre em estado de baixo consumo.
radio.openWritingPipe(0xE8E8F0F0E1LL); // Abrindo o meio de comunicação entre transmissor e receptor e configurando endereço de comunicação (0xE8E8F0F0E1LL)
radio.stopListening(); // Interrompendo mecanismos de recepção "escuta" do Módulo
pinMode(Mts1Pin, INPUT);
pinMode(Mts2Pin, INPUT);
pinMode(Mts3Pin, INPUT);
}
void loop()
{
currentMillis = millis();
if (currentMillis - lastLeituraBateriaMillis >= 5000) {
Bateria = (analogReadMilliVolts(32) * 11) / 1000.0;
lastLeituraBateriaMillis = millis();
Serial.println(Bateria);
}
joyAX = map(getSmoothedJoystickValue(joysticks[0]), 0, 4095, 0, 255);
joyAY = map(getSmoothedJoystickValue(joysticks[1]), 0, 4095, 0, 255);
joyBX = map(getSmoothedJoystickValue(joysticks[2]), 0, 4095, 0, 255);
joyBY = map(getSmoothedJoystickValue(joysticks[3]), 0, 4095, 0, 255);
pot1 = map(getSmoothedJoystickValue(joysticks[4]), 0, 4095, 0, 255);
pot2 = map(getSmoothedJoystickValue(joysticks[5]), 0, 4095, 0, 255);
pot3 = map(getSmoothedJoystickValue(joysticks[6]), 0, 4095, 0, 255);
pot4 = map(getSmoothedJoystickValue(joysticks[7]), 0, 4095, 0, 255);
Serial.print("joyAX: ");
Serial.print(joyAX);
Serial.print(" joyAY: ");
Serial.print(joyAY);
Serial.print(" | ");
Serial.print("joyBX: ");
Serial.print(joyBX);
Serial.print(" joyBY: ");
Serial.println(joyBY);
ControleRemoto.JoyEsquerdaX = joyAX;
ControleRemoto.JoyEsquerdaY = joyAY;
ControleRemoto.JoyDireitaX = joyBX;
ControleRemoto.JoyDireitaY = joyBY;
ControleRemoto.Pot1 = pot1;
ControleRemoto.Pot2 = pot2;
ControleRemoto.Pot3 = pot3;
ControleRemoto.Pot4 = pot4;
ControleRemoto.BotEsqCim = mcp.digitalRead(BotEsqCimPin);
ControleRemoto.BotEsqDir = mcp.digitalRead(BotEsqDirPin);
ControleRemoto.BotEsqBai = mcp.digitalRead(BotEsqBaiPin);
ControleRemoto.BotEsqEsq = mcp.digitalRead(BotEsqEsqPin);
ControleRemoto.BotDirCim = mcp.digitalRead(BotDirCimPin);
ControleRemoto.BotDirDir = mcp.digitalRead(BotDirDirPin);
ControleRemoto.BotDirBai = mcp.digitalRead(BotDirBaiPin);
ControleRemoto.BotDirEsq = mcp.digitalRead(BotDirEsqPin);
ControleRemoto.Mts1 = digitalRead(Mts1Pin);
ControleRemoto.Mts2 = digitalRead(Mts2Pin);
ControleRemoto.Mts3 = mcp.digitalRead(Mts3Pin);
ControleRemoto.Mts4 = mcp.digitalRead(Mts4Pin);
// Gonna work on this later
if (currentMillis - lastLeituraBateriaMillis >= 5000)
{
Serial.println("Atualizou");
u8g2.clearBuffer(); // clear the internal memory
u8g2.setFont(u8g2_font_amstrad_cpc_extended_8u);
u8g2.setCursor(1, 13);
u8g2.print(F("CANAL: "));
u8g2.setCursor(55, 13);
u8g2.print(canal);
u8g2.setFont(u8g2_font_t0_11_mr);
u8g2.setCursor(ALIGN_CENTER(rcName), 30);
u8g2.print(rcName);
u8g2.setCursor(97, 11);
u8g2.print(String(Bateria, 1) + "v");
if (Bateria <= 6.8) {
u8g2.setFont(u8g2_font_amstrad_cpc_extended_8u);
u8g2.setCursor(ALIGN_CENTER("BATERIA FRACA!"), 60);
u8g2.print("BATERIA FRACA!");
}
/* Ícones
u8g2.drawXBMP(107, 3, 20, 10, batLevel);
u8g2.drawXBMP(107, 52, 20, 10, RCbatLevel);
u8g2.drawXBMP(1, 50, 13, 13, configIcon);
*/
u8g2.drawHLine(0, 15, 128);
u8g2.drawHLine(0, 47, 128);
u8g2.sendBuffer(); // transfer internal memory to the display
//u8g2.setPowerSave(1);
//delay(5000);
//u8g2.setPowerSave(0);
//x += 1;
}
radio.write(&ControleRemoto, sizeof(ControleRemoto));
}
The modified version keeps throwing this:
02:48:54.696 -> NF24 is NOT connected to SPI
02:48:56.085 ->
02:48:56.085 ->
02:48:56.085 -> NF24 is NOT connected to SPI
02:49:00.354 ->
02:49:00.354 ->
02:49:00.354 -> NF24 is NOT connected to SPI
02:49:01.765 ->
02:49:01.765 ->
02:49:01.765 -> NF24 is NOT connected to SPI
02:49:03.160 ->
02:49:03.160 ->
02:49:03.160 -> NF24 is NOT connected to SPI
02:49:04.542 ->
02:49:04.542 ->
02:49:04.542 -> NF24 is NOT connected to SPI
02:49:05.956 ->
02:49:05.956 ->
02:49:05.956 -> NF24 is NOT connected to SPI
02:49:07.366 ->
02:49:07.366 ->
02:49:07.366 -> NF24 is NOT connected to SPI
- When I upload the previous version, it works, but when I upload the new version, I keep getting this error