Buenas, este es mi primer post y es mi primer proyecto Arduino y mi primer acercamiento a la programación, así que si hay algún problema obvio por favor díganme.
Además agregar que gran parte está basado en CHAT GPT e INFO de youtube.
La idea es crear unas PDM Can Bus para vehículos con diferentes estrategias, aunque por ahora, ya que estoy recién aprendiendo a programar me conformo con que encienda la salida indicada por el interrruptor. (si todo sale bien, la idea es pasarlo a stm32, que según lo poco que entiendo es mejor para trabajos de tiempo real y aparte trae CAN BUS incorporado)
Tengo un problema con los siguientes códigos. (librería de CAN BUS
(GitHub - autowp/arduino-mcp2515: Arduino MCP2515 CAN interface library))
//CODIGO 1 (EMISOR)
'''
#include <SPI.h>
#include <mcp2515.h>
//lights
int parkl = 17;
int lbeam = 18;
int hbeam = 19;
int brake = 43;
int reverse = 25;
//turnlights
int hazard = 23;
int tleft = 20;
int tright= 21;
//keyswitch
int acc = 14;
int on = 15;
int start = 16;
//blower
int blowl = 27;
int blowh = 29;
//wiper
int wiperl = 31 ;
int wiperh = 33;
int wiperwash = 35;
//doorswitch
int leftdoor = 37;
int rightdoor = 39;
//bocina
int bocina = 41;
const int interval = 500;
bool blinkHazard = false;
bool blinkLeft = false;
bool blinkRight = false;
struct can_frame lights;
struct can_frame keyswitch;
struct can_frame blower;
struct can_frame wiper;
struct can_frame doorswitch;
struct can_frame horn;
struct can_frame turnlights;
struct can_frame watertemp;
MCP2515 mcp2515(53);
void setup() {
//lights
pinMode(parkl, INPUT) ;
pinMode(lbeam, INPUT) ;
pinMode(hbeam, INPUT) ;
pinMode(brake, INPUT) ;
pinMode(reverse, INPUT) ;
//turnlights
pinMode(hazard, INPUT) ;
pinMode(tleft, INPUT) ;
pinMode(tright, INPUT) ;
//keyswitch
pinMode(acc, INPUT) ;
pinMode(on, INPUT) ;
pinMode(start, INPUT) ;
//blower
pinMode(blowl, INPUT) ;
pinMode(blowh, INPUT) ;
//wiper
pinMode(wiperl, INPUT) ;
pinMode(wiperh, INPUT) ;
pinMode(wiperwash, INPUT) ;
//doorswitch
pinMode(leftdoor, INPUT) ;
pinMode(rightdoor, INPUT) ;
//bocina
pinMode(bocina, INPUT);
//lights
lights.can_id = 0x101;
lights.can_dlc = 5;
lights.data[0] = 0x00;
lights.data[1] = 0x00;
lights.data[2] = 0x00;
lights.data[3] = 0x00;
lights.data[4] = 0x00;
//turnlights
turnlights.can_id = 0X107;
turnlights.can_dlc= 2;
turnlights.data[0] = 0x00;
turnlights.data[1] = 0x00;
//keyswitch
keyswitch.can_id = 0x102;
keyswitch.can_dlc = 3;
keyswitch.data[0] = 0x00;
keyswitch.data[1] = 0x00;
keyswitch.data[2] = 0x00;
//blower
blower.can_id = 0x103;
blower.can_dlc = 2;
blower.data[0] = 0x00;
blower.data[1] = 0x00;
//wiper
wiper.can_id = 0x104;
wiper.can_dlc = 3;
wiper.data[0] = 0x00;
wiper.data[1] = 0x00;
wiper.data[2] = 0x00;
//doorswitch
doorswitch.can_id = 0x105;
doorswitch.can_dlc = 2;
doorswitch.data[0] = 0x00;
doorswitch.data[1] = 0x00;
//bocina
horn.can_id = 0x106;
horn.can_dlc = 1;
horn.data[0] = 0x00;
while (!Serial);
Serial.begin(115200);
//Inicializacion del MCP2515
mcp2515.reset();
mcp2515.setBitrate(CAN_500KBPS);
mcp2515.setNormalMode();
}
void loop() {
if ((hazard) = HIGH){
unsigned long currentMillis = millis();
unsigned long previousMillis;
if ((currentMillis - previousMillis) < interval){
blinkLeft = true;
blinkRight = true;
} else if ((currentMillis - previousMillis) < (2 * interval)) {
blinkLeft = false;
blinkRight = false;
} else {
blinkLeft = false;
blinkRight = false;
}
}
if ((tleft) = HIGH){
unsigned long currentMillis = millis();
unsigned long previousMillis;
if ((currentMillis - previousMillis) < interval){
blinkLeft = true;
} else if ((currentMillis - previousMillis) < (2 * interval)) {
blinkLeft = false;
} else {
blinkLeft = false;
}
}
if ((tright) = HIGH){
unsigned long currentMillis = millis();
unsigned long previousMillis;
if ((currentMillis - previousMillis) < interval){
blinkRight = true;
} else if ((currentMillis - previousMillis) < (2 * interval)) {
blinkRight = false;
} else {
blinkRight = false;
}
}
//lights
lights.data[0] = digitalRead(parkl);
lights.data[1] = digitalRead(lbeam);
lights.data[2] = digitalRead(hbeam);
lights.data[3] = digitalRead(brake);
lights.data[4] = digitalRead(reverse);
mcp2515.sendMessage(&lights);
//turnlights
turnlights.data[0] = (blinkLeft);
turnlights.data[1] = (blinkRight);
mcp2515.sendMessage(&turnlights);
//keyswitch
keyswitch.data[0] = digitalRead(acc);
keyswitch.data[1] = digitalRead(on);
keyswitch.data[2] = digitalRead(start);
mcp2515.sendMessage(&keyswitch);
//blower
blower.data[0] = digitalRead(blowl);
blower.data[1] = digitalRead(blowh);
mcp2515.sendMessage(&blower);
//wiper
wiper.data[0] = digitalRead(wiperl);
wiper.data[1] = digitalRead(wiperh);
wiper.data[2] = digitalRead(wiperwash);
mcp2515.sendMessage(&wiper);
//doorswitch
doorswitch.data[0] = digitalRead(leftdoor);
doorswitch.data[1] = digitalRead(rightdoor);
mcp2515.sendMessage(&doorswitch);
//bocina
horn.data[0] = digitalRead(bocina);
mcp2515.sendMessage(&horn);
/* if (mcp2515.readMessage(&watertemp) && watertemp.can_id == 0x108){
for (int i = 0; i<watertemp.can_dlc; i++) { // print the data
Serial.print(watertemp.data[i],HEX);
Serial.print(" ");
}
}*/
}
CÓDIGO 2: RECEPTOR
#include <SPI.h>
#include <mcp2515.h>
MCP2515 mcp2515(53);
struct can_frame lights;
struct can_frame keyswitch;
struct can_frame blower;
struct can_frame wiper;
struct can_frame doorswitch;
struct can_frame horn;
struct can_frame turnlights;
//struct can_frame watertemp;
//INPUT PINS
//int waterTemp = A0;
// Define output pins
//lights
int parkl = 23;
int lbeam = 25;
int hbeam = 27;
int brake = 29;
int reverse = 31;
//turnlights
int tleft = 35;
int tright= 37;
//keyswitch
int acc = 39;
int on = 41;
int start = 43;
//blower
int blowl = 13;
int blowh = 12;
//wiper
int wiperl = 11 ;
int wiperh = 9;
int wiperwash = 8;
//doorswitch
int leftdoor = 45;
int rightdoor = 47;
//horn
int bocina = 22;
// Variables para el control de intermitencia
unsigned long previousMillis = 0;
const long interval = 500; // Intervalo de tiempo en milisegundos
bool tleftActive;
bool trightActive;
void setup() {
//lights
pinMode(parkl, OUTPUT) ;
pinMode(lbeam, OUTPUT) ;
pinMode(hbeam, OUTPUT) ;
pinMode(brake, OUTPUT) ;
pinMode(reverse, OUTPUT) ;
//turnlights
pinMode(tleft, OUTPUT) ;
pinMode(tright, OUTPUT) ;
//keyswitch
pinMode(acc, OUTPUT) ;
pinMode(on, OUTPUT) ;
pinMode(start, OUTPUT) ;
//blower
pinMode(blowl, OUTPUT) ;
pinMode(blowh, OUTPUT) ;
//wiper
pinMode(wiperl, OUTPUT) ;
pinMode(wiperh, OUTPUT) ;
pinMode(wiperwash, OUTPUT) ;
//doorswitch
pinMode(leftdoor, OUTPUT) ;
pinMode(rightdoor, OUTPUT) ;
//horn
pinMode(bocina, OUTPUT);
//Input
/* pinMode(waterTemp, INPUT);
watertemp.can_id = 0x108;
watertemp.can_dlc = 1;
watertemp.data[0] = 0x00;*/
while (!Serial);
Serial.begin(115200);
mcp2515.reset();
mcp2515.setBitrate(CAN_500KBPS);
mcp2515.setNormalMode();
}
/*void blinkHazard() {
unsigned long currentMillis = millis();
if ((currentMillis - previousMillis) < interval){
digitalWrite(tleft, HIGH);
digitalWrite(tright, HIGH);
} else {
tleft = !tleft;
tright = !tright;
}
previousMillis = currentMillis;
}
void blinkLeft() {
unsigned long currentMillis = millis();
if ((currentMillis - previousMillis) > (2 * interval)) {
previousMillis = currentMillis;
} else if ((currentMillis - previousMillis) < interval) {
// Encender intermitentes
tleftActive = true;
} else if ((currentMillis - previousMillis) < (2 * interval)) {
tleftActive = true;
}
previousMillis = currentMillis;
digitalWrite(tleft, tleftActive ? HIGH : LOW);
}
void blinkRight() {
unsigned long currentMillis = millis();
if ((currentMillis - previousMillis) > (2 * interval)) {
previousMillis = currentMillis;
} else if ((currentMillis - previousMillis) < interval) {
// Encender intermitentes
digitalWrite(tright, HIGH);
} else if ((currentMillis - previousMillis) < (2 * interval)) {
digitalWrite(tright, LOW);
}
previousMillis = currentMillis;
}*/
void loop() {
/* if (mcp2515.readMessage(&turnlights) && turnlights.can_id == 0x107) {
if (turnlights.data[0] == HIGH) {
blinkHazard();
}
else {
digitalWrite(tleft, LOW);
digitalWrite(tright, LOW);
}
}*/
if (mcp2515.readMessage(&turnlights) && turnlights.can_id == 0x107) {
digitalWrite(tleft, turnlights.data[0]);
}
/* if (mcp2515.readMessage(&turnlights) && turnlights.can_id == 0x107) {
if (turnlights.data[2] == HIGH) {
blinkRight();
}
else {
digitalWrite(tright, LOW);
}
} */
/* if (mcp2515.readMessage(&lights) && lights.can_id == 0x101) {
digitalWrite(parkl, lights.data[0]);
digitalWrite(lbeam, lights.data[1]);
digitalWrite(hbeam, lights.data[2]);
digitalWrite(brake, lights.data[3]);
digitalWrite(reverse, lights.data[4]);
}
if (mcp2515.readMessage(&keyswitch) && keyswitch.can_id == 0x102) {
digitalWrite(acc, keyswitch.data[0]);
digitalWrite(on, keyswitch.data[1]);
digitalWrite(start, keyswitch.data[2]);
}
if (mcp2515.readMessage(&blower) && blower.can_id == 0x103) {
digitalWrite(blowl, blower.data[0]);
digitalWrite(blowh, blower.data[1]);
}
if (mcp2515.readMessage(&wiper) && wiper.can_id == 0x104) {
digitalWrite(wiperl, wiper.data[0]);
digitalWrite(wiperh, wiper.data[1]);
digitalWrite(wiperwash, wiper.data[2]);
}
if (mcp2515.readMessage(&doorswitch) && doorswitch.can_id == 0x105) {
digitalWrite(leftdoor, doorswitch.data[0]);
digitalWrite(rightdoor, doorswitch.data[1]);
}
if (mcp2515.readMessage(&horn) && horn.can_id == 0x106) {
digitalWrite(bocina, horn.data[0]);
}
// watertemp.data[0] = analogRead(waterTemp);
//mcp2515.sendMessage (&watertemp);*/
}
La idea del código es hacer que lea el estado de los interruptores y envíe esta información por CAN BUS, esto funciona bien, el problema surge con los intermitentes, ya que no me encienden cuando apreto el interruptor, probé colocando el código de parpadeo en el receptor, pero me generaba un pequeño delay al apretar el boton ya que previousmillis siempre va a ser menor desde la primera vez que se apreta el botón y yo necesito que el encendido sea instantaneo.
Me faltó añadir que con el codigo EMISOR actual prende por medio segundo la salida de los blinkers cuando enciendo todo, pero no funciona cuando apreto el interruptor
Cabe mencionar que revisé tres veces las conexiones y estan bien. Gracias