/* HOS programme permettant : de recupérer les données du bus CAN : VPAN, VBAT, IPAN et IBAT de les envoyer en WiFi avec le protocole modbus. ATTENTION : il faut utliser node-red pour initier la communication modbus. */ #include const String nomSSID="defaultEN3_F6B1"; #include #include #define CS_PIN 21 // Set CAN bus baud rate #define CAN_BAUDRATE (125000) Adafruit_MCP2515 mcp(CS_PIN); //affichage #include "SSD1306Wire.h" //pour OLEDSSD3306 SSD1306Wire display(0x3c, SDA, SCL);//instancier un objet display I2C adresse = $78 (soit $3c sur 7bits) //Modbus Registers Offsets const int SENSOR_HREG = 100; //ModbusIP object ModbusIP mb; //variables long ts; //Modbus Registres utilisés pour les données en modbus (ATTENTION un décalage de 1 apparait avec rapidSCADA - à tester sur nodered) const int UBAT_HREG = 100; const int UPAN_HREG = 101; const int IBAT_HREG = 102; const int IPAN_HREG = 103; /********************************************/ void setup() { Serial.begin(115200); while(!Serial) delay(10); //init du oled LCD display.init(); Serial.println("HOS : CAN - Wifi"); // WiFi.begin(nomSSID, ""); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } //affichage IP Serial.print("SSID : ");Serial.println(nomSSID); Serial.println("IP address: "); Serial.println(WiFi.localIP()); //init CAN if (!mcp.begin(CAN_BAUDRATE)) { Serial.println("Error initializing MCP2515."); while(1) delay(10); } Serial.println("MCP2515 chip found"); //Modbus mb.server(); //Start Modbus IP // Add SENSOR_HREG register - Use addHreg() for analog Inputs mb.addHreg(UBAT_HREG); mb.addHreg(UPAN_HREG); mb.addHreg(IBAT_HREG); mb.addHreg(IPAN_HREG); //fin Modbus /*************************************/ ts = millis(); } // // /**********************************************/ void loop() { //variable locales String message; IPAddress ip; ip = WiFi.localIP(); String val301; String valCAN; String valUPAN,valUBAT, valIBAT,valIPAN; //debut prog message += String(ip[0])+"."+String(ip[1])+"."+String(ip[2])+"."+String(ip[3]); //LCD display.setFont(ArialMT_Plain_16);//font pour oled display.setTextAlignment(TEXT_ALIGN_CENTER); //aligne le texte display.drawString(50, 0, "CAN -> WIFI"); //ecrit la phrase dans le buffer display.drawString(50,20,message); display.display(); //affiche sur l'écran le buffer display.drawString(60,40,nomSSID); display.display(); // lecture d'un packet CAN int packetSize = mcp.parsePacket(); if (packetSize) { // received a packet Serial.print("Received "); if (mcp.packetExtended()) { Serial.print("extended "); } if (mcp.packetRtr()) { // Remote transmission request, packet contains no data Serial.print("RTR "); } Serial.print("packet with id 0x"); Serial.print(mcp.packetId(), HEX); if (mcp.packetRtr()) { Serial.print(" and requested length "); Serial.println(mcp.packetDlc()); } else { Serial.print(" and length "); Serial.println(packetSize); // only print packet data for non-RTR packets while (mcp.available()) { //Serial.print((char)mcp.read()); //Serial.print(mcp.read()); valCAN = mcp.read(); Serial.print(valCAN); if (mcp.packetId()==0x301) { val301+=valCAN; } } Serial.println(); } Serial.print("val301 = ");Serial.println(val301); valUBAT = val301.substring(0,3);Serial.print("UBAT = ");Serial.println(valUBAT);//extraction de UBAT valUPAN = val301.substring(3,6);Serial.print("UPAN = ");Serial.println(valUPAN);//extraction de UPAN // valIBAT = ; // valIPAN = ; Serial.println(); //modbus //ModBus Call once inside loop() - all magic here mb.task(); //Read each two seconds if (millis() > ts + 2000) { ts = millis(); mb.Hreg(UBAT_HREG,valUBAT.toInt());//envoi la valeur de UBAT dans le registre ModBus UBAT_HREG mb.Hreg(UPAN_HREG,valUPAN.toInt()); mb.Hreg(IBAT_HREG,450);//envoi d'une valeur constante à adapter mb.Hreg(IPAN_HREG,222); //envoi d'une valeur constante à adapter Serial.println("envoi modbus"); } message = "Modbus OK"; display.drawString(60,60,message); display.display(); //affiche sur l'écran le buffer } }