/* This library supports ISA Scale IVT Modular current/voltage sensor device. These devices measure current, up to three voltages, and provide temperature compensation. This library was written by Jack Rickard of EVtv - http://www.evtv.me copyright 2014 You are licensed to use this library for any purpose, commercial or private, without restriction. 2024 - Modified to make use of ESP32-Arduino-CAN by miwagner */ #include "SimpleISA.h" template inline Print &operator <<(Print &obj, T arg) { obj.print(arg); return obj; } ISA::ISA() // Define the constructor. { timestamp = millis(); debug=false; debug2=false; framecount=0; firstframe=true; } ISA::~ISA() //Define destructor { } void ISA::begin(int Port, int speed) { } void ISA::handleFrame(CAN_frame_t *frame) //This is our CAN interrupt service routine to catch inbound frames { switch (frame->MsgID) { case 0x511: break; case 0x521: handle521(frame); break; case 0x522: handle522(frame); break; case 0x523: handle523(frame); break; case 0x524: handle524(frame); break; case 0x525: handle525(frame); break; case 0x526: handle526(frame); break; case 0x527: handle527(frame); break; case 0x528: handle528(frame); break; } if(debug)printCAN(frame); } void ISA::handle521(CAN_frame_t *frame) //AMperes { framecount++; long current=0; current = (long)((frame->data.u8[5] << 24) | (frame->data.u8[4] << 16) | (frame->data.u8[3] << 8) | (frame->data.u8[2])); milliamps=current; Amperes=current/1000.0f; if(debug2)Serial<<"Current: "<data.u8[5] << 24) | (frame->data.u8[4] << 16) | (frame->data.u8[3] << 8) | (frame->data.u8[2])); Voltage=volt/1000.0f; Voltage1=Voltage-(Voltage2+Voltage3); if(framecount<150) { VoltageLO=Voltage; Voltage1LO=Voltage1; } if(Voltage150)VoltageLO=Voltage; if(Voltage>VoltageHI && framecount>150)VoltageHI=Voltage; if(Voltage1150)Voltage1LO=Voltage1; if(Voltage1>Voltage1HI && framecount>150)Voltage1HI=Voltage1; if(debug2)Serial<<"Voltage: "<data.u8[5] << 24) | (frame->data.u8[4] << 16) | (frame->data.u8[3] << 8) | (frame->data.u8[2])); Voltage2=volt/1000.0f; if(Voltage2>3)Voltage2-=Voltage3; if(framecount<150)Voltage2LO=Voltage2; if(Voltage2150)Voltage2LO=Voltage2; if(Voltage2>Voltage2HI&& framecount>150)Voltage2HI=Voltage2; if(debug2)Serial<<"Voltage: "<data.u8[5] << 24) | (frame->data.u8[4] << 16) | (frame->data.u8[3] << 8) | (frame->data.u8[2])); Voltage3=volt/1000.0f; if(framecount<150)Voltage3LO=Voltage3; if(Voltage3150 && Voltage3>10)Voltage3LO=Voltage3; if(Voltage3>Voltage3HI && framecount>150)Voltage3HI=Voltage3; if(debug2)Serial<<"Voltage: "<data.u8[5] << 24) | (frame->data.u8[4] << 16) | (frame->data.u8[3] << 8) | (frame->data.u8[2])); Temperature=temp/10; if(debug2)Serial<<"Temperature: "<data.u8[5] << 24) | (frame->data.u8[4] << 16) | (frame->data.u8[3] << 8) | (frame->data.u8[2])); KW=watt/1000.0f; if(debug2)Serial<<"Power: "<data.u8[5] << 24) | (frame->data.u8[4] << 16) | (frame->data.u8[3] << 8) | (frame->data.u8[2]); AH+=(As-lastAs)/3600.0f; lastAs=As; if(debug2)Serial<<"Amphours: "<data.u8[5] << 24) | (frame->data.u8[4] << 16) | (frame->data.u8[3] << 8) | (frame->data.u8[2])); KWH+=(wh-lastWh)/1000.0f; lastWh=wh; if(debug2)Serial<<"KiloWattHours: "<MsgID, frame->data.u8[0],frame->data.u8[1],frame->data.u8[2], frame->data.u8[3],frame->data.u8[4],frame->data.u8[5],frame->data.u8[6],frame->data.u8[7],0); Serial<<"Rcvd ISA frame: 0x"<