<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>http://calebneedscollege.com/wiki/index.php?action=history&amp;feed=atom&amp;title=Can_bus_battery_monitor</id>
	<title>Can bus battery monitor - Revision history</title>
	<link rel="self" type="application/atom+xml" href="http://calebneedscollege.com/wiki/index.php?action=history&amp;feed=atom&amp;title=Can_bus_battery_monitor"/>
	<link rel="alternate" type="text/html" href="http://calebneedscollege.com/wiki/index.php?title=Can_bus_battery_monitor&amp;action=history"/>
	<updated>2026-04-24T19:04:18Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.33.1</generator>
	<entry>
		<id>http://calebneedscollege.com/wiki/index.php?title=Can_bus_battery_monitor&amp;diff=22&amp;oldid=prev</id>
		<title>Legg: /* Code */</title>
		<link rel="alternate" type="text/html" href="http://calebneedscollege.com/wiki/index.php?title=Can_bus_battery_monitor&amp;diff=22&amp;oldid=prev"/>
		<updated>2020-11-02T22:42:12Z</updated>

		<summary type="html">&lt;p&gt;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Code&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;Revision as of 22:42, 2 November 2020&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l6&quot; &gt;Line 6:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 6:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot; line='line'&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot; line='line'&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;#define ARDUINO_UNO&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;//Arduino UNO&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;//Arduino UNO&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;//MCP2515&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;//MCP2515&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l12&quot; &gt;Line 12:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 13:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;////Pin 11 MOSI&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;////Pin 11 MOSI&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;////Pin 10 Cable Select&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;////Pin 10 Cable Select&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;#define ARDUINO_MEGA2560&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;//Arduino MEGA 2560&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;//MCP2515&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;////Pin 52 SPI clock&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;////Pin 50 MISO&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;////Pin 51 MOSI&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;////Pin 53 Cable Select&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;#include &amp;lt;SPI.h&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;#include &amp;lt;SPI.h&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l35&quot; &gt;Line 35:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 44:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;bool buzzer = HIGH;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;bool buzzer = HIGH;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;#ifdef ARDUINO_MEGA2560&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;const int spiCSPin = 53;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;#endif&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;#ifdef ARDUINO_UNO&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;const int spiCSPin = 10;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;const int spiCSPin = 10;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;#endif&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;boolean ledON = 1;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;boolean ledON = 1;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;float voltage[NUMPACKS][NUMCELLS];&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;float voltage[NUMPACKS][NUMCELLS];&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Legg</name></author>
		
	</entry>
	<entry>
		<id>http://calebneedscollege.com/wiki/index.php?title=Can_bus_battery_monitor&amp;diff=21&amp;oldid=prev</id>
		<title>Legg: Created page with &quot;==Synopsis== This code is designed for the Arduino UNO.  Attached is a MCP2515 CAN module.  This is designed to monitor cell voltages in large battery packs containing LiFePO4...&quot;</title>
		<link rel="alternate" type="text/html" href="http://calebneedscollege.com/wiki/index.php?title=Can_bus_battery_monitor&amp;diff=21&amp;oldid=prev"/>
		<updated>2020-11-02T22:23:53Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;==Synopsis== This code is designed for the Arduino UNO.  Attached is a MCP2515 CAN module.  This is designed to monitor cell voltages in large battery packs containing LiFePO4...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;==Synopsis==&lt;br /&gt;
This code is designed for the Arduino UNO.  Attached is a MCP2515 CAN module.  This is designed to monitor cell voltages in large battery packs containing LiFePO4 cells in arrays.  In this particular instance, there are 5 packs, each containing 8 cells.  The output is delivered on 1 second intervals into a spreadsheet friendly format.&lt;br /&gt;
==Notes==&lt;br /&gt;
Display is over Serial IO&lt;br /&gt;
==Code==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot; line='line'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//Arduino UNO&lt;br /&gt;
//MCP2515&lt;br /&gt;
////Pin 13 SPI clock&lt;br /&gt;
////Pin 12 MISO&lt;br /&gt;
////Pin 11 MOSI&lt;br /&gt;
////Pin 10 Cable Select&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;SPI.h&amp;gt;&lt;br /&gt;
#include &amp;quot;mcp_can.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
//Graphics&lt;br /&gt;
//#include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
//#include &amp;lt;Adafruit_GFX.h&amp;gt;&lt;br /&gt;
//#include &amp;lt;Adafruit_SSD1306.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//#define SCREEN_WIDTH 128 // OLED display width, in pixels&lt;br /&gt;
//#define SCREEN_HEIGHT 64 // OLED display height, in pixels&lt;br /&gt;
// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)&lt;br /&gt;
//#define OLED_RESET     4 // Reset pin # (or -1 if sharing Arduino reset pin)&lt;br /&gt;
//Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &amp;amp;Wire, OLED_RESET);&lt;br /&gt;
&lt;br /&gt;
//Software constants&lt;br /&gt;
#define NUMPACKS 5     //Number of packs installed on line.  Must edit knownID[] array&lt;br /&gt;
#define NUMCELLS 8     //Hazardous to modify&lt;br /&gt;
#define REFRESH 1000   //Refresh rate display&lt;br /&gt;
#define ALARM 3.645    //Alarm threshold&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
bool buzzer = HIGH;&lt;br /&gt;
const int spiCSPin = 10;&lt;br /&gt;
boolean ledON = 1;&lt;br /&gt;
float voltage[NUMPACKS][NUMCELLS];&lt;br /&gt;
float sum[NUMPACKS];&lt;br /&gt;
long knownID[NUMPACKS] = {0x00000004, 0x00000006, 0x00000020, 0x00000021, 0x00000022};&lt;br /&gt;
long packID;&lt;br /&gt;
int slot;&lt;br /&gt;
&lt;br /&gt;
float Pack = 0.0;&lt;br /&gt;
&lt;br /&gt;
unsigned char bufA[10];&lt;br /&gt;
unsigned char buf0[10];&lt;br /&gt;
unsigned char buf3[10];&lt;br /&gt;
unsigned char buf5[10];&lt;br /&gt;
unsigned char buf20[10];&lt;br /&gt;
unsigned char buf21[10];&lt;br /&gt;
unsigned char buf22[10];&lt;br /&gt;
&lt;br /&gt;
unsigned long time;&lt;br /&gt;
unsigned long TriggerTime = 0;&lt;br /&gt;
unsigned long unknownId = 0;&lt;br /&gt;
&lt;br /&gt;
MCP_CAN CAN(spiCSPin);&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
&lt;br /&gt;
  //Graphics&lt;br /&gt;
&lt;br /&gt;
  //Pin 8 voltage alarm&lt;br /&gt;
  pinMode(8, OUTPUT);&lt;br /&gt;
  //Initialize against undefined values&lt;br /&gt;
  for(int i=0;i&amp;lt;NUMPACKS;i++)&lt;br /&gt;
  {&lt;br /&gt;
    for(int j=0;j&amp;lt;NUMCELLS;j++)&lt;br /&gt;
    {&lt;br /&gt;
      voltage[i][j]=0.0;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
  while (CAN_OK != CAN.begin(CAN_125KBPS,MCP_8MHz))&lt;br /&gt;
  {&lt;br /&gt;
    Serial.println(&amp;quot;CAN BUS Init Failed, waiting for hardware...&amp;quot;);&lt;br /&gt;
    delay(100);&lt;br /&gt;
  }&lt;br /&gt;
  Serial.println(&amp;quot;CAN BUS  Init OK!&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  long msgID = 0x00000FFF;&lt;br /&gt;
  bool skip = LOW;&lt;br /&gt;
  unsigned char len = 0;&lt;br /&gt;
  unsigned char buf[10];&lt;br /&gt;
  unsigned long canId = 0x00000000;&lt;br /&gt;
&lt;br /&gt;
  if(CAN_MSGAVAIL == CAN.checkReceive())&lt;br /&gt;
  {&lt;br /&gt;
&lt;br /&gt;
    CAN.readMsgBuf(&amp;amp;len, buf);&lt;br /&gt;
    canId = CAN.getCanId();&lt;br /&gt;
    if (canId &amp;amp; 0xFFFFF000 != 0x08010000)&lt;br /&gt;
    {&lt;br /&gt;
      Serial.println(&amp;quot;Unsupported device attached!  Correct and restart monitor.&amp;quot;);&lt;br /&gt;
      Serial.print(&amp;quot;Device: 0x&amp;quot;);&lt;br /&gt;
      Serial.print(canId &amp;amp; 0xFFFFF000,HEX);&lt;br /&gt;
      Serial.println(&amp;quot;.&amp;quot;);&lt;br /&gt;
      //Sound alarm&lt;br /&gt;
      digitalWrite(8,1);&lt;br /&gt;
      while(1){}&lt;br /&gt;
    }    &lt;br /&gt;
    //detect if pack is registered&lt;br /&gt;
    packID = canId &amp;amp; 0x000000FF;&lt;br /&gt;
    slot = 0xFF;&lt;br /&gt;
    for(int i = 0; i&amp;lt;NUMPACKS ; i++)&lt;br /&gt;
    {&lt;br /&gt;
      if(knownID[i]==packID)&lt;br /&gt;
      {&lt;br /&gt;
        slot=i;&lt;br /&gt;
      }&lt;br /&gt;
      if(i==NUMPACKS-1 &amp;amp;&amp;amp; slot==0xFF)&lt;br /&gt;
      {&lt;br /&gt;
        Serial.println(&amp;quot;Unregistered Device attached!  Skipping!&amp;quot;);&lt;br /&gt;
        Serial.print(&amp;quot;  Device : 0x&amp;quot;);&lt;br /&gt;
        Serial.print(packID,HEX);&lt;br /&gt;
        Serial.println(&amp;quot;.&amp;quot;);&lt;br /&gt;
        skip = HIGH;    &lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    //If pack is registered, collect it's data into local storage.&lt;br /&gt;
    if(!skip)&lt;br /&gt;
    {&lt;br /&gt;
    &lt;br /&gt;
      msgID = canId &amp;amp; 0x00000F00;&lt;br /&gt;
      //Interpret message 3&lt;br /&gt;
      if (msgID == 0x00000300)&lt;br /&gt;
      {&lt;br /&gt;
        for(int i = 0; i&amp;lt;len; i++)&lt;br /&gt;
        {&lt;br /&gt;
          buf3[i] = buf[i];&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      //Interpret message 3&lt;br /&gt;
      else if (msgID == 0x00000500)&lt;br /&gt;
      {&lt;br /&gt;
        for(int i = 0; i&amp;lt;len; i++)&lt;br /&gt;
        {&lt;br /&gt;
          buf5[i] = buf[i];&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      //Interpret message A&lt;br /&gt;
      else if (msgID == 0x00000A00)&lt;br /&gt;
      {&lt;br /&gt;
        for(int i = 0; i&amp;lt;len; i++)&lt;br /&gt;
        {&lt;br /&gt;
          bufA[i] = buf[i];&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      //Interpret message 0&lt;br /&gt;
      else if (msgID == 0x00000000)&lt;br /&gt;
      {&lt;br /&gt;
        for(int i = 0; i&amp;lt;len; i++)&lt;br /&gt;
        {&lt;br /&gt;
          buf0[i] = buf[i];&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      //Interpret message 2&lt;br /&gt;
      else if (msgID == 0x00000200)&lt;br /&gt;
      {&lt;br /&gt;
        if (buf[0] == 0)&lt;br /&gt;
        {&lt;br /&gt;
          unsigned int Cell  = buf[2] * 256 + buf[1];&lt;br /&gt;
          voltage[slot][7] = Cell / 1000.0;&lt;br /&gt;
          Cell  = buf[4] * 256 + buf[3];&lt;br /&gt;
          voltage[slot][6] = Cell / 1000.0;&lt;br /&gt;
          Cell  = buf[6] * 256 + buf[5];&lt;br /&gt;
          voltage[slot][5] = Cell / 1000.0;&lt;br /&gt;
&lt;br /&gt;
          for(int i = 0; i&amp;lt;len; i++)&lt;br /&gt;
          {&lt;br /&gt;
              buf20[i] = buf[i];&lt;br /&gt;
          } &lt;br /&gt;
        }&lt;br /&gt;
        if (buf[0] == 1)&lt;br /&gt;
        {&lt;br /&gt;
          unsigned int Cell  = buf[2] * 256 + buf[1];&lt;br /&gt;
          voltage[slot][4] = Cell / 1000.0;&lt;br /&gt;
          Cell  = buf[4] * 256 + buf[3];&lt;br /&gt;
          voltage[slot][3] = Cell / 1000.0;&lt;br /&gt;
          Cell  = buf[6] * 256 + buf[5];&lt;br /&gt;
          voltage[slot][2] = Cell / 1000.0;&lt;br /&gt;
&lt;br /&gt;
          for(int i = 0; i&amp;lt;len; i++)&lt;br /&gt;
          {&lt;br /&gt;
            buf21[i] = buf[i];&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
        if (buf[0] == 2)&lt;br /&gt;
        {&lt;br /&gt;
          unsigned int Cell  = buf[2] * 256 + buf[1];&lt;br /&gt;
          voltage[slot][1] = Cell / 1000.0;&lt;br /&gt;
          Cell  = buf[4] * 256 + buf[3];&lt;br /&gt;
          voltage[slot][0] = Cell / 1000.0;&lt;br /&gt;
&lt;br /&gt;
          for(int i = 0; i&amp;lt;len; i++)&lt;br /&gt;
          {&lt;br /&gt;
            buf22[i] = buf[i];&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      else &lt;br /&gt;
      {&lt;br /&gt;
        unknownId = canId;&lt;br /&gt;
        Serial.println(&amp;quot;Unexpected Message type detected!&amp;quot;);&lt;br /&gt;
        Serial.println(canId &amp;amp; 0x00000F00, HEX);&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      //Run every REFRESHms&lt;br /&gt;
      time = millis();&lt;br /&gt;
      if (time &amp;gt;= TriggerTime)&lt;br /&gt;
      {&lt;br /&gt;
&lt;br /&gt;
        //Detect for alarm condition&lt;br /&gt;
        for(int i=0; i&amp;lt;NUMPACKS;i++)&lt;br /&gt;
        {&lt;br /&gt;
          for(int j=0;j&amp;lt;NUMCELLS;j++)&lt;br /&gt;
          {&lt;br /&gt;
&lt;br /&gt;
            if(voltage[i][j]&amp;gt;=ALARM)   //KILLER LINE&lt;br /&gt;
              buzzer=HIGH;&lt;br /&gt;
            else&lt;br /&gt;
              buzzer=LOW; &lt;br /&gt;
              &lt;br /&gt;
          }            &lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        //Execute alarm condition&lt;br /&gt;
        if(buzzer)&lt;br /&gt;
          digitalWrite(8,1);&lt;br /&gt;
        else&lt;br /&gt;
          digitalWrite(8,0);          &lt;br /&gt;
        TriggerTime = TriggerTime + REFRESH;&lt;br /&gt;
        Pack=0.0;&lt;br /&gt;
&lt;br /&gt;
        //Dump cell voltages to CSV&lt;br /&gt;
        for(int i=0; i&amp;lt;NUMPACKS;i++)&lt;br /&gt;
        {&lt;br /&gt;
          Pack=0.0;&lt;br /&gt;
          for(int j=0; j&amp;lt;NUMCELLS ; j++) &lt;br /&gt;
          {&lt;br /&gt;
&lt;br /&gt;
            Serial.print(voltage[i][j],3); //KILLER&lt;br /&gt;
&lt;br /&gt;
            Serial.print(&amp;quot;,&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            Pack += voltage[i][j];  //KILLER&lt;br /&gt;
&lt;br /&gt;
          }&lt;br /&gt;
          Serial.print(Pack,3);&lt;br /&gt;
          if(NUMPACKS-1!=i)&lt;br /&gt;
            Serial.print(',');&lt;br /&gt;
          else&lt;br /&gt;
            Serial.println();     &lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if(unknownId != 0)&lt;br /&gt;
        {&lt;br /&gt;
          Serial.print(&amp;quot;Unknown Message: &amp;quot;);&lt;br /&gt;
          Serial.print(unknownId, HEX);&lt;br /&gt;
          Serial.println();&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
    else skip=LOW;    &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Legg</name></author>
		
	</entry>
</feed>