Yeah, that’s the ticket.
So where am I as I start 2013. Well, My Arduino based weather thingy is basically working. The rain counter still dead… the now obsolete Maxim DS2423 seems a bad design choice now. There must be a better way to keep track of the tipping rain bucket ( 5o tips per inch) that is non-volatile for those power outage times.
My Arduino based “make your own work bench tool” project is sort of stalled. Though I did find a neat oversize retro cabinet to put it in. (So 1980’s)
I’ll close up this update by sharing an old project… the Live For Speed Outgauge Bus Arduino interface (gear and RPM meter).
PC Network UDP to Serial conversion: “PC CODE” and the Schematic.
Arduino Code: (pre-IDE 1.0)
//----[ OutGaugeBus ]------------------------------------------------------ // Name : OGBUS.PDE //------------------------------------------------------------------------- // Purpose : Receive serial commmands from "Live For Speed" INSIM OUTGAUGE // : Client and then display real-time dashboard information // : on Arduino based output devices, such as LED's. // : Live For Speed References: // : LFS/DOCS/INSIM.TXT // : http://en.lfsmanual.net/wiki/InSim_Tutorials // : http://www.brunsware.de/insim/ // : See Also: http://www.lfs.net/ //------------------------------------------------------------------------- // Date : 25 Oct, 2007 ( Started as a Parallax SX28 project ) // Version : 2.11 // Modified: 12/22/2010 11:30:34 AM // Author : Pete Willard // : //Additional: // Credits : * Mike McRoberts - Earthshine Design - // : Arduino Starter Kit PDF // : // : * Hacktronics - http://www.hacktronics.com/Tutorials // : // : * Arduino ShiftOut tutorial // : // : To keep code "recognizable", available references were used // : and changed very little from reference sources listed above. //------------------------------------------------------------------------- // Notes : Includes using a 74HC595 Shift Register for the Bar Graph // : and discrete 7-segment display for gear indicator // : // : Commands come from OGBUS.EXE (DevC++ UDP Client) and convert // : INSIM OUTGAUGE data into serial packet data for Arduino // : INSIM Client Software will send ALL vaalues every update // : but can send as little as Clear Command "C0" // : // : Expansion: // : With a little creative wiring, it would be possible to // : daisy chain multiple serial Arduino boards or if USB is // : used, multiple OGBUS clients can be run at one time // : // : Command Examples: // : (Comma Separated Values) Any Order up to 24 Characters // : Format: <command></command>,<command></command>... // : C0 = Clear All Outputs // : G0-G8 = Gear Indicator // : R0-R8 = RPM Bargraph // : S0|S1 = Shift Light Pin On|Off (binary) // : P0|P1 = Pit Limiter Pin On|Off (binary) // : //------------------------------------------------------------------------- //----[ Variables ]-------------------------------------------------------- const int buffsize = 25; // Buffer Size char buffer[buffsize]; // Incoming Serial Data Buffer int debug = 0; // Set to NON-ZERO to test with Serial Monitor int ledCount = 8; // The number of LEDs in the Bar Graph LED //------------------------------------------------------------------------- // Seven segment LED layout for the Gear Indicator // Arduino pins must be sequential int GIstartpin = 2; // Arduino pin: 2,3,4,5,6,7,8 byte seven_seg_digits[9][7] = { { 0,0,0,0,1,0,1 }, // = R { 0,0,1,0,1,0,1 }, // = N { 0,1,1,0,0,0,0 }, // = 1 { 1,1,0,1,1,0,1 }, // = 2 { 1,1,1,1,0,0,1 }, // = 3 { 0,1,1,0,0,1,1 }, // = 4 { 1,0,1,1,0,1,1 }, // = 5 { 1,0,1,1,1,1,1 }, // = 6 { 0,0,0,0,0,0,0 }, // = 7 (blank) }; // a b c d e f g ------> LED segment //------------------------------------------------------------------------- // Bargraph Values for 8 LED Bargraph // Only 8 values of BYTE are needed to light the 8 bargraph LED's // sequentially // NOTE: Most Bargraph LED's are "10 unit" so I have bottom 2 and top 2 // LED's tied together. // Part Number used: AVAGO "HDSP-4832" 3-Green 4-Yellow 3-Red // Mouser Part Number: 630-HDSP-4832 // The Shift Register lowest outputs start with Green Anodes of the // Bargraph. // byte bargraph[9] = {0x00,0x01,0x03,0x07,0x0F,0x1F,0x3F,0x7F,0xFF}; //------------------------------------------------------------------------- // LED PINS - optional since we are low on pins int shiftlight = 12; //int pitlimit = 13; // Pick one //int lowfuel = 13; //------------------------------------------------------------------------- // 74HC595 Pin Setup int latchPin = 9; // Pin connected to ST_CP (12) of 74HC595 int clockPin = 10; // Pin connected to SH_CP (11) of 74HC595 int dataPin = 11; // Pin connected to DS (14) of 74HC595 //----[ SETUP ]----------------------------------------------------------- void setup() { // Speed needs to match INSIM - Outgauge Client Configuration setting Serial.begin(19200); Serial.flush(); // Set all pins to Outut Mode int a; for(a=0;a < 13;a++){ pinMode(a, OUTPUT); } } //----[ MAIN LOOP ]------------------------------------------------------ void loop() { // Mike McRoberts serial input command routines // from the "Serial Controlled Mood Lamp" example // in Arduino Starter Kit Manual from Earthshine Design if (Serial.available() > 0) { int index=0; delay(10); // let the buffer fill up int numChar = Serial.available(); if (numChar>buffsize) { numChar=buffsize; } while (numChar--) { buffer[index++] = Serial.read(); } splitString(buffer); // Process Serial Packet } } //----[ SubRoutines ]---------------------------------------------------- void splitString(char* data) { // also from "Serial Controlled Mood Lamp" example if (debug) { Serial.print("Data entered: "); Serial.println(data); } // Sequentially De-Tokenize the Serial Commands received char* parameter; parameter = strtok (data, " ,"); while (parameter != NULL) { // Pass result to parseCMD for each Command received parseCMD(parameter); // remove processed commands from the list parameter = strtok (NULL, " ,"); } // Clear the text and serial buffers for (int x=0; x<buffsize; x++) { buffer[x]='\0'; } Serial.flush(); } //======================================================================= void parseCMD(char* data) { // Flexible, easily expanded Command Parser // based on "Serial Controlled Mood Lamp" example // *** Marvelous coding by Mike MCRoberts //--[gear]--------------------------------------- if ((data[0] == 'G') || (data[0] == 'g')) { // Have command, now get Argument "value" while removing whitespace int ArgVal = strtol(data+1, NULL, 10); // then limit the results to what we expect for this command ArgVal = constrain(ArgVal,0,8); sevenSegWrite(ArgVal); if (debug) { Serial.print("Gear is set to: "); Serial.println(ArgVal); } } //--[shift light]-------------------------------- if ((data[0] == 'S') || (data[0] == 's')) { int ArgVal = strtol(data+1, NULL, 10); ArgVal = constrain(ArgVal,0,1); digitalWrite(shiftlight,ArgVal); if (debug) { Serial.print("SHIFT is set to: "); Serial.println(ArgVal); } } //--[reset]-------------------------------------- if ((data[0] == 'C') || (data[0] == 'c')) { int ArgVal = strtol(data+1, NULL, 10); ArgVal = constrain(ArgVal,0,1); sevenSegWrite(8); shiftWrite(0x00); if (debug) { Serial.print("Clear Outputs"); } } //--[rpm bar graph]----------------------------- if ((data[0] == 'R') || (data[0] == 'r')) { int ArgVal = strtol(data+1, NULL, 10); ArgVal = constrain(ArgVal,0,8); shiftWrite(bargraph[ArgVal]); if (debug) { Serial.print("RPM is set to: "); Serial.println(ArgVal); } } } // End parseCMD Loop //======================================================================= void sevenSegWrite(byte digit) { byte pin = GIstartpin; for (byte segCount = 0; segCount < 7; ++segCount) { digitalWrite(pin, seven_seg_digits[digit][segCount]); ++pin; } } //======================================================================= void shiftWrite(byte Rdata){ // prepare the register for data digitalWrite(latchPin, LOW); // shift out the bits: shiftOut(dataPin, clockPin, MSBFIRST, Rdata); //Set the latch pin high to enable the outputs digitalWrite(latchPin, HIGH); }