Thursday, February 15, 2018

Interactive Arduino Uno Ethernet Shield Program

I have developed a Interactive Arduino UNO Ethernet Shield demo program.  It requires lots of memory.  It was a offshoot while I was developing a Ethernet based method of updating my LED signs. However the UNO suffers from a memory shortage just running this demo program!  This is what the screen looks like.  You cannot change D10-D13 because they are used by the Ethernet card.

Here is the video:

I have finally found an easy way to post code on blogger!  Thanks to "" the code can be easily formatted.

 // Arduino Ethernet Interactive with table  
 // By bob Davis  
 // Based on code from Rui Santos  
 #include <Ethernet.h>  
 int led1 = 2;  
 int led2 = 3;  
 int led3 = 4;  
 int led4 = 5;  
 int led5 = 6;  
 int led6 = 7;  
 int din1 = 8;  
 int din2 = 9;  
 int din3 = 10;  
 int din4 = 11;  
 int din5 = 12;  
 int din6 = 13;  
 int data1 = 0;  
 byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };  //physical mac address  
 byte ip[] = { 192, 168, 1, 21 };           // ip in network  
 EthernetServer server(80);               //server port     
 String readString;  
 void setup() {  
  // Open serial communications and wait for port to open:  
  pinMode(led1, OUTPUT);  
  pinMode(led2, OUTPUT);  
  pinMode(led3, OUTPUT);  
  pinMode(led4, OUTPUT);   
  pinMode(led5, OUTPUT);  
  pinMode(led6, OUTPUT);  
  pinMode(din1, INPUT);  
  pinMode(din2, INPUT);  
  // start the Ethernet connection and the server:  
  Ethernet.begin(mac, ip);  
 void loop() {  
  // Create a client connection  
  EthernetClient client = server.available();  
  if (client) {  
   while (client.connected()) {    
    if (client.available()) {  
     char c =;  
     //read char by char HTTP request  
     if (readString.length() < 100) {  
      //store characters to string  
      readString += c;  
      } //if HTTP request has ended  
      if (c == '\n') {       
       client.println("HTTP/1.1 200 OK"); //send new page  
       client.println("Content-Type: text/html");  
       client.println("Refresh: 2"); // refresh every second   
       client.println("<style>table, th, td {padding: 3px; border: 1px solid black;</style>");  
       client.println("<table width=350><tr>");  
       client.println("<th colspan=6>Digital Outputs</th>");  
       client.println("<td><a href=\"/?button1on\"\">Turn On</a></td>");  
       client.println("<td><a href=\"/?button2on\"\">Turn On</a></td>");  
       client.println("<td><a href=\"/?button3on\"\">Turn On</a></td>");  
       client.println("<td><a href=\"/?button4on\"\">Turn On</a></td>");  
       client.println("<td><a href=\"/?button5on\"\">Turn On</a></td>");  
       client.println("<td><a href=\"/?button6on\"\">Turn On</a></td>");  
       client.println("<td><a href=\"/?button1off\"\">Turn Off</a></td>");    
       client.println("<td><a href=\"/?button2off\"\">Turn Off</a></td>");   
       client.println("<td><a href=\"/?button3off\"\">Turn Off</a></td>");    
       client.println("<td><a href=\"/?button4off\"\">Turn Off</a></td>");   
       client.println("<td><a href=\"/?button5off\"\">Turn Off</a></td>");   
       client.println("<td><a href=\"/?button6off\"\">Turn Off</a></td>");   
       client.println("<th colspan=6>Digital Inputs</th>");  
       client.println("<td align='center'>");  
       client.println("<td align='center'>");  
       client.println("<th colspan=6>Analog Inputs</th>");  
       for (int aChannel = 0; aChannel < 6; aChannel++) {  
        int sensorReading = analogRead(aChannel);  
        client.println(" <td align='center'> ");  
       //stopping client  
       //controls the Arduino if you press the buttons  
       if (readString.indexOf("?button1on") >0){ digitalWrite(led1, HIGH); }  
       if (readString.indexOf("?button1off") >0){ digitalWrite(led1, LOW); }  
       if (readString.indexOf("?button2on") >0){ digitalWrite(led2, HIGH); }  
       if (readString.indexOf("?button2off") >0){ digitalWrite(led2, LOW); }  
       if (readString.indexOf("?button3on") >0){ digitalWrite(led3, HIGH); }  
       if (readString.indexOf("?button3off") >0){ digitalWrite(led3, LOW); }  
       if (readString.indexOf("?button4on") >0){ digitalWrite(led4, HIGH); }  
       if (readString.indexOf("?button4off") >0){ digitalWrite(led4, LOW); }  
       if (readString.indexOf("?button5on") >0){ digitalWrite(led5, HIGH); }  
       if (readString.indexOf("?button5off") >0){ digitalWrite(led5, LOW); }  
       if (readString.indexOf("?button6on") >0){ digitalWrite(led6, HIGH); }  
       if (readString.indexOf("?button6off") >0){ digitalWrite(led6, LOW); }  
       //clearing string for next read  

Sunday, February 11, 2018

Chevy HHR Failure to Start or Start then Stall Problem

This fall my HHR started having issues with starting.  By Christmas time it no longer started.  At one point I spent over 30 minutes trying to start it.  When it started there was a multicolored puddle of gas under the tailpipe.  It always smelled of too much gas.  I changed the spark plugs and the old plugs were covered in black from too much gas.

The HHR would sometimes start, and if I pumped the gas it would eventually sustain.  Eventually I discovered that if I floored the gas pedal before starting it it would usually start.  Through research I discovered that flooring the gas pedal should shut off all gas to the motor!  Eventually the check engine light came on.  Here are the codes and what they meant.

The codes are:
P0300 Engine Misfire Detected
P0107 Manifold Absolute Pressure (MAP) Sensor
P0122/P0123/P0223 Throttle Position (TP) Sensor.
P0171 System too Lean

The auto store wanted over $250 in parts.  I bought the MAP sensor on eBay for $10 and the Throttle body form the 1490 motors (an auto salvage place) for $40.  The exact same codes came back on again.  I was getting really frustrated.  Then I got thinking, how could so many sensors be so wrong?  So I decided to replace the motor ground wire.  When I looked at the old wire one end seemed loose.  I puled on it and the wire came right out!  After close examination I determined that the wire was never crimped into the connector.

Here is the new crimped and soldered triple ground wire.  It runs from the right side of the motor to the right strut tower.

This is a close up of the bolt on the cam cover that the ground wire is connected to.

Now I just touch the key for a fraction of a second and the car starts right up!

Monday, January 29, 2018

Arduino WS2812 144 LED per Meter sign

I am building a third sign that has 144LED per meter or 1/4 inch LED spacing.  The first tests indicate lots of bad connections.  The issue is likely in the LED strips being shipped wrapped on a spool that is too small.

In this first picture the middle row quits about 3/4 the way across the sign.  One of the pixels in the "U" is red but that is hard to tell in the picture.

In this next picture the bottom right corner LED is out.  The third row down is a different shade of blue but you cannot see that in the picture.

here is the video of the first test.  Some of the issues went away during the video indicating they are caused by bad connections.

When I tried to run all 16 rows by wrapping the top 8 rows back to the bottom 8 rows this is what I got.  Only 3 of the bottom 8 rows came to life.

I finally was able to fix all of the bad connections.  I even replaced some of the strips to get it to work.  There is a yellow LED that is red in the picture.

This picture shows that there are still some bad connections!!  After fixing many many of them!

Wednesday, January 17, 2018

Audio Spectrum Analyzer with Arduino UNO+MSGEQ7+WS2812 LED Strips Part 2

I have improved the Audio Spectrum Analyzer.  By increasing the number of MSGEQ7's and offsetting them I now have 21 frequencies per channel.  In order to display all of them the sign had to be turned sideways.

This first version supports 8 LED strips:

This second version supports two sets of 8 LED strips for a total of 16 strips.

I can even do an oscilloscope on the WS2812 LED sign.

Friday, January 5, 2018

Even More Arduino Uno With WS2812 LED Strips and Arrays

I have also made a larger higher density LED sign.  It features 90 LED's per row and 16 columns.  That is 1440 LED's.  It is running from an Arduino UNO.  Last night with some adjustments to the timing I was able to get it to work.

The software now supports a different color for each letter as in this picture.

Here is the shades of color test, it supports 256 shades of each color.

Here is a video of it displaying text and running the color test and fireworks effect.

Later on I was able to get the sign to scroll.

Now it can be programmed from a cellphone via bluetooth!

Now you can change the color from the phone.

Monday, January 1, 2018

More Arduino Uno With WS2812 LED Strips and Arrays

I have been continuing to do things with an Arduino UNO and addressable LED's.  I think my next book will be called "Arduino Addressable LED Projects".  I would prefer to keep the title to three words and "Addressable" is a long word.  Another option is "Arduino LED Strip Projects".  What do you think is the best title?

Currently I am experimenting with an 8x32 array.  Internally it is wired as 8 LED segments with a zigzag wiring so each column is reversed.

Here is my worm video that shows how it is wired internally:

Here is some text being displayed on it.

I have improved the software even more!  It now supports 256 shades of each color and a color for each letter.

Wednesday, December 13, 2017

Assembling the Chinese RTL-SDR Kit (Software Defined Radio)

I am building a Chinese RTL-SDR Kit.  To start with I was trained in soldering by MERP (Miniature Electronics Repair) school in the US Navy.  I was taught NASA standards for soldering.  They will surely disown me after seeing these pictures of my soldering. This kit is NOT easy!  I also work for a communications company.  I have built all kinds of communications equipment including surface mounted parts and hand wound coils.

Here is what the kit parts look like.  There are many really tiny parts in the parts bag!

The circuit board comes with none of the surface mount parts installed.

To solder the surface mounted parts you will need a magnifying headband visor.  You will also need tweezers and a really fine soldering tip. Apply a small amount of solder to one pad and place one end of the part in the molten solder.  Then solder the other end.  Then clean up the first side.  The surface mount parts are marked except for the 222 resistors, the LED and the 4.7uH choke.  The LED is in a black part holder and has a green stripe.  There are extras of some parts in case you loose some.

Here is a picture of the circuit board with the surface mounted parts jacks, and capacitors added.  The green stripe of the LED goes towards the USB jack.  The USB Jack is really hard to solder.  I ended up with a solder bridge.  After trying every trick to get rid of the bridge I resorted to using solder wick to soak up the extra solder.  The capacitors should have their ground stripes facing the outer edges of the board.

I skipped adding the coils and went right to the disassembling USB dongle.  Use solder wick to remove the solder on the ground connections.  Then clip off the four USB jack pins using flush cutters.  Then clear the metal out of the holes with a solder sucker. (Or heat and tap).

To add the USB assembly make two jumper hooks out of the former capacitor wires.  Use them to hold the USB assembly up as in the following picture.  Then solder them in place on both the top and bottom sides.

Next make a |_____| to connect the bottom grounds together as in the next picture.
Then add the four USB jumpers (from the old USB jack holes to the new jacks holes), two ground jumpers, and the RF input jumper on the top side of the board.

There is a jumper to add to the bottom of the board.  It runs from one of the pins of a five pin device (likely a voltage regulator) to the edge.

It is easiest to attach the jumper just to the lower side of one of the pins as seen in this next illustration.

Then there is also an extra jumper to run on the top side.  It also runs from one of the pins of a five pin device to the edge.  It runs underneath the IR receiver, unless you have removed the IR (Remote Control) receiver.

There are two small coils to wind.  The specs say 11 turns on a 3mm (.118") drill bit.  From other peoples pictures it looks like some people are using a .125 (1/8 inch) drill bit instead.

 Here it what it looks like with those coils installed.

Next is the beginning of the hardest part.  Making and installing the 25 MHz coil.  First the wire was all one color.  That will require a voltmeter to figure out.  Second it was one wire.  You will need three lengths of wire about one foot each.  You can mark the ends with colors with a permanent marker if you do not have a meter.  Twist the three wires together to form one three conductor wire.  You might need a needle to thread it through the ferrite bead 9 times.

Next label and meter the wires.  You will have to tin them first to get through the enamel.

Twist the Y* and R wires together and solder it to the circuit board. You should have Y then Y*R then R*. Then cut off the B leads and the two that are twisted together.

Monday, December 4, 2017

SainSmart DDS120/DDS140 USB DSO Oscilloscope

I just purchased a SainSmart DDS140 DSO on eBay. So far I have figured out how to get a trace on the screen using the built in signal generator.  Who puts the "Start" button in the bottom right corner?  Next is to test it in some real world situations like my WS2812 LED strip signs.

This is the built in 1 KHz test signal.

This is the "0" bit for my WS2812 signs.  It is .19 us, it is supposed to be about .400 us.

This is the "1" bit for my WS2812 signs.  It is .57 us, it is supposed to be about .800 us.  I had to measure from the center line as the trigger had issues with the lower signal level.  In fact I had to write a version of the sign software that sent all 1's to be able to capture the pulses.

Monday, November 27, 2017

Big Audio Spectrum Analyzer with Arduino UNO+MSGEQ7+WS2812 LED Strips

I have finally been able to get the combination of a MSGEQ7 and WS2812 LED strips to work together.  The trick was to not use any machine language code.  Instead, to access the WS2812 I just used parallel output commands like this:
  PORTD= 0xFF;  // turn on
  PORTD= 0xFF;  // delay
  PORTD= 0xFF;  // delay
  PORTD= 0xFF;  // delay (add more for faster processors)
  PORTD= bits;  // send data
  PORTD= bits;  // delay
  PORTD= bits;  // delay
  PORTD= bits;  // delay
  PORTD= 0x00;  // Turn off;
Sending the same command over and over just results in a delay.

This setup gives 90 steps to the top.  I am missing one LED strip for the needed total of 14.  I will add three more strips as soon as they arrive from China.

Here are some links to the videos on YouTube.  For some reason they don't embed the videos like they used to?  I think they are working now.

This is the code for the right channel only, but blogspot might remove all of the < and > from the code.....

// BOB Davis Enhanced Version for sending data to 8 Parallel WS2812 strings
// Removed Assembler and simplified the code
// Changed to VU meter with MSGEQ7

// PORTD is Digital Pins 0-7 on the Uno change for other boards.
#define PIXEL_PORT  PORTD  // Port of the pin the pixels are connected to
#define PIXEL_DDR   DDRD   // Port of the pin the pixels are connected to

// MSGEQ7 pins
#define PIN_STROBE 9
#define PIN_RESET 10
#define PIN_LEFT 4 //analog input
#define PIN_RIGHT 5 //analog input

//band arrays
int left[7];
int right[7];
int col=0;

void readMSGEQ7() { //reset the chip
  digitalWrite(PIN_RESET, HIGH);
  digitalWrite(PIN_RESET, LOW);
  for(int band=0; band < 7; band++) {  //loop thru all 7 bands
    digitalWrite(PIN_STROBE,LOW);      // go to the next band
    delayMicroseconds(30);             // gather data
    left[band] = analogRead(PIN_LEFT); // store left band reading
    right[band] = analogRead(PIN_RIGHT); // store right band reading
    digitalWrite(PIN_STROBE,HIGH);     // reset the strobe pin

// Actually send the next set of 8 WS2812B encoded bits to the 8 pins.
// The delay timing is for an Arduino UNO.
void sendBitX8( uint8_t bits ) {
  PORTD= 0xFF;  // turn on
  PORTD= 0xFF;  // delay
  PORTD= 0xFF;  // delay
  PORTD= 0xFF;  // delay (Add more for faster processors)
  PORTD= bits;  // send data
  PORTD= bits;  // delay
  PORTD= bits;  // delay
  PORTD= bits;  // delay
  PORTD= bits;  // delay
  PORTD= 0x00;  // Turn off;

// Set default color for letters
int red=1;
int green=1;
int blue=1;

void sendPixelRow( uint8_t row ) {
  // Send the bit 8 times down every row, each pixel is 8 bits each for R,G,B
    for (int bit=0; bit <8; bit++){     
      if (green==1)sendBitX8( row );
      else sendBitX8( 0x00 ); }
    for (int bit=0; bit <8; bit++){     
      if (red==1)sendBitX8( row );
      else sendBitX8( 0x00 ); }
    for (int bit=0; bit <8; bit++){     
      if (blue==1)sendBitX8( row );
      else sendBitX8( 0x00 ); }
void setup() {
  PIXEL_DDR = 0xff;    // Set all row pins to output
  pinMode(PIN_RESET, OUTPUT); // reset
  pinMode(PIN_STROBE, OUTPUT); // strobe
void loop() {
    readMSGEQ7();                   // collect samples
    cli();                          // No time for interruptions!
    for (int b=1; b > 90; b++){
      if (b > 60) {red=1; green=0;}
      else       {red=0; green=1;}
      if (right[0]-64 >= b) col=col+1;  // Send bytes as VU meter data
      if (right[1]-64 >= b) col=col+2;  // Send bytes as VU meter data
      if (right[2]-64 >= b) col=col+4;  // Send bytes as VU meter data
      if (right[3]-64 >= b) col=col+8;  // Send bytes as VU meter data
      if (right[4]-64 >= b) col=col+16;  // Send bytes as VU meter data
      if (right[5]-64 >= b) col=col+32;  // Send bytes as VU meter data
      if (right[6]-64 >= b) col=col+64;  // Send bytes as VU meter data
    sei();                        // interrupts back on
    delay (50);
//  }

Thursday, October 26, 2017

Better to sell using Auctions instead of fixed price on eBay!

A while back eBay offered me a deal on fixed price 30 day listings, they were free.  I always look at the "buy it now" prices because I do not want to wait for an auction.  On top of that auction listings are 30 cents each so it made sense to switch, right?  Wrong!  My sales tanked.  So I have gone back to auctions.  First here is a picture of my 30 day listings after 15 or more days with typically 10-20 views over that time.

Now compare that to some auctions that are only 1 day old with 60-150 views per 24 hours!
So forget about the 30 day fixed price listings they are free but a total waste of time!

Tuesday, October 17, 2017

More problems and another solution to the Head Gasket Problem with Bar's Leaks Professional.

UPDATE - 3 months later and still no problems.  There has been little if any loss of Antifreeze nor any overheating of the motor.

My HHR overheated again only two months after the last time that I tried to fix it.  The radiator was down about two quarts of fluid.  This time I decided to spend some more money and get something that stays in the radiator.  It is called "Bar's Leaks Professional HEAD SEAL Blown Head Gasket Repair" and runs about $45.  Just add 1/2 the container to the antifreeze - for a 4 cylinder engine.

Its only been a few days but so far so good.  I might have to change the oil once again. It looks a little brown.  There was no foam on the oil fill cap this time.

Sunday, October 15, 2017

What my Lab/Office looks like

I thought I would update what my office looks like.  Maybe I am bored or lacking in posts this year so I thought I would post something.  My F-550 is hanging from the ceiling with only its legs visible.  I am now using a rolling desk for my 3D printer 24 inch monitor and tools.  There is another book shelf to the right but it has not changed any.  My CNC found itself hidden in the closet....
I have a "New to me" notebook computer.  Its a EliteBook 8560W.  It was $5 at a Hamfest because of a bad screen.  The necessary repairs are elsewhere on my blog.

Saturday, September 9, 2017

Lancaster NY 2017 Hamfest

I think this was my first time at the Lancaster NY Hamfest.  It was also the first time I used my latest LED sign.  I had to misspell Arduino as I had a 6 character limit.  Here are some pictures of my stuff for sale.  The sign is running off a car battery with a 5 volt 10 amp regulator module.

Here are some pictures of interesting items for sale.

Friday, August 4, 2017

E470i LED Back-lit TV Repair

I picked up a 47 inch LCD TV with LED back-light that was no longer working.  I discovered that these LED back-lit TVs have the LED's wired in series and that eventually one opens up and the lights go out.

To dissemble the TV start by removing the back cover.  Then remove the metal cover in the foreground of the next picture it covers the LCD Connectors.

The cables need to be un-taped before they can be disconnected.  There is a black lock that flips out to release the cables.
Then remove the front bezel.  Besides lots of screws on all four sides there are some tabs across the bottom as can be seen in the front center of this picture.

Then there are several catches that will need to be unhooked.

The screen lifts out, being careful about the ribbon cables that are still connected to it.  Then there are four metal strips that hold the back-light filters in place.  There is a solid plastic filter and three flexible filters that will fall out if you are not careful.  Be careful to keep them in the right order but set them somewhere out of the way.
 Next is to remove the last layer covering the LED strips.  You will need to remove the pins that hold the plastic back and control the spacing to the front.  Two of them are under the power supply board.
 They are removed by pinching them with needle nose pliers on the back side.

Now to remove and test the LED strips.  They can be carefully pealed up with a flat blade screwdriver.  I used my fingernails to get underneath them to start the process.  Each strip has 4 or 5 three volt LED's (12 to 15 volts).  You can use two old 9 volt batteries to test them.  There should be a 100 ohm resistor in series with the batteries.  The end strips are tested by applying power to the test points near the connector.  The middle strips are tested the same way but you will need to short out the opposite end connector.

You will likely find 2 dead strips and maybe some dead LED's as well.  I actually broke one LED strip in the process of removing it.
Once you have the LED strips replacements you can test them out by removing the power distribution bad and testing them out like in the following picture before reassembling everything.  Remember that there are two sets of LED strips.

Here is a video on testing LED strops with 9 volt batteries: