The personal website of Scott W Harden

RF Circuitry Links

PSK-31 receiver - sports a crystal filter front-end and active receiver

Neophyte Receiver - old article based around an NE602 / SA602 / SA612.

602 Primer - old document but very good about SA602, includes method to estimate capacitor values for Colpitts oscillator mode.

Hans' 30m receiver where he used an inverting gate buffer oscillator to generate 5v square waves which he fed into a SA602

Making Friends with the SA602 - an attempt at a write-up of the circuitry behind the Ramsey receiver kits (which only do 1 band each), although the manuals (example for 40m) may be useful

3.5-10MHz receiver - around a few SA602s, uses IF transformers too

30m receiver design - "The Limerick Sudden 30m Receiver Kit" based around a SA602/LM386 very simple and pretty

Sudden Storm Receiver - tuna tun style, check out schem a few pages in... sa602 + LM386 + crystal

Etching PCBs with hydrogen peroxide, vinegar, and table salt (wow!)

Morse.exe - A good way to learn Morse code!

High Altitude Balloon

Oscillator page which has a section mentioning that the 7th overtone can be used in an oscillator. The 7th overtone of 18mhz (17m) is 144mhz (2m) smack dab in the CW region. Nice!

Path prediction - note that UF is 29.642276 latitude and -82.344949 longitude

Icarus - a HAB project run on advertising revenue that seems successful and has launched many balloons with some awesome photos. Robert Harrison knows his stuff!

Project Space Planes - launches paper airplanes from 30km above the earth which glide down and land all over the world!

HALO project - very well documented HAB with pictures/video

JBOT - An SSB linear amplifier made from Just a Bunch of Transistors. It's pretty straightforward, cheap, and converts 1mW input to 5W output.

harmonic oscillator

tuned oscillator example

overtone oscillator

amplifier design walk-through

Lessons in Electric Circuits - A very good (free) textbook. Anyone starting to learn about electronics should start by skimming over relevant chapters of this text!

1W CW transmitter kit - Although I don't own one, I appreciate the kit and love the schematic. This guy uses a buffer chip (a 74HC04n, similar to a 74HC240 often used in QRP too) to act as an oscillator and small amplifier. The output is then further amplified by a 2n3866 transistor.

30M Solar QRSS transmitter - such an inspiring project! This guy uses a buffer chip (74hc245) to amplify the output of CKOUT of a microcontroller clocked at the transmit frequency. The thing is solar powered, and has a unique temperature compensation mechanism which uses the chip's built-in thermosensor to adjust its offset. I haven't seen this technique used anywhere else in a QRP transmitter!

HansSummers.com - Everything this man does is impressive! His QRSS section is wonderful, and I won't detract from it by trying to describe it here. He also has a simple QRSS receiver circuit based upon a SA602, something I replicated (tuned front-end not shown) to operate my W4DFU QRSS Grabber at the University of Florida.

MOSFET "Switched Mode" Amplifiers - a wonderful document, read it multiple times! Transistors are traditionally used in many QRP circuits as amplifiers, but MOSFETs have some unique qualities which in many ways makes them easier to work with in simple circuits. I found this guide EXTREMELY helpful!

Amplifier design - a cool walk-through of the design of an amplifier with the math described every step of the way

IRF-510 QRP transmitter design which looks pretty interesting... Note that increasing efficiency lets the MOSFET run cool!

Similar IRF-510 transmitter I like as well....

SA602 as an oscillator - clever, clock with tank, mix with nothing, output (mixed?) is clock only!

JFET Rainglasz/Colpitts Oscillator Design which looks interesting

Misc

Battery info - useful for calculating life of batteries under load

Battery tests - tests common batteries at different loads to determine real (not optimal) amp hour ratings!

Filter design software I use for low pass filter design

Mini ring and core calculator very convenient for designing inductors with toroids or calculating resonance of LC networks

Knights QRSS Compendium - Live image feeds of QRSS grabbers all around the world, often situated at the QRSS watering hole of 10.140MHz

Knights QRSS Mailing List - Sign up for this mailing list to see who's transmitting what on which frequency. People also often post photos of their transmitters, and interesting captures from grabbers that you may have missed!

Experimental Methods in RF Design - Only $32 on Amazon.com right now, this book is an amazing resource for anyone interested in building RF circuits. It goes from extremely simple transmitters, receivers, and amplifiers all the way through advanced topics, modulation methods, etc. It even describes how to build your own test equipment, and even how to use an oscilloscope and assess various stages of your transmitter designs. Flipping through the pages of this book gives me new ideas every time! I requested it many times from my university library (interlibrary loan, often came from Vanderbilt University) before I broke down and got it. I highly recommend this book!

Markdown source code last modified on January 18th, 2021
---
title: RF Circuitry Links
date: 2009-01-09 15:30:00
tags: circuit, amateur radio
---

# RF Circuitry Links

<a href="http://www.nutsvolts.com/media-files/A_Universal_Direct_Conversion_Receiver_For_PSK-31.pdf">PSK-31 receiver</a> - sports a crystal filter front-end and active receiver

<a href="http://www.arrl.org/files/file/Technology/tis/info/pdf/28814.pdf">Neophyte Receiver</a> - old article based around an NE602 / SA602 / SA612.

<a href="http://techdoc.kvindesland.no/radio/b1/20051213190607573.pdf">602 Primer</a> - old document but very good about SA602, includes method to estimate capacitor values for Colpitts oscillator mode.

<a href="http://www.hanssummers.com/30m.html">Hans' 30m receiver</a> where he used an inverting gate buffer oscillator to generate 5v square waves which he fed into a SA602

<a href="http://frrl.wordpress.com/2008/11/15/direct-conversion-receiver-making-friends-with-the-signetics-sa602/">Making Friends with the SA602</a> - an attempt at a write-up of the circuitry behind the <a href="http://www.ramseyelectronics.com/cgi-bin/commerce.exe?preadd=action&amp;key=HR-SERIES">Ramsey receiver kits</a> (which only do 1 band each), although the manuals (<a href="http://www.ramseyelectronics.com/downloads/manuals/HR40.pdf">example for 40m</a>) may be useful

<a href="http://www.seekic.com/forum/22_circuit_diagram/25644_35_TO_10_MHz_SIMPLE_SUPERHETERODYNE_RECEIVER.html">3.5-10MHz receiver</a> - around a few SA602s, uses IF transformers too

<a href="http://www.gqrp.com/suddenbuildingyourkitbooklet30m.pdf">30m receiver design</a> - "The Limerick Sudden 30m Receiver Kit" based around a SA602/LM386 very simple and pretty

<a href="http://www.qrpme.com/docs/ORIGINAL%20SS%20Instructions.pdf">Sudden Storm Receiver</a> - tuna tun style, check out schem a few pages in... sa602 + LM386 + crystal

<a href="http://www.stephenhobley.com/blog/2011/03/02/still-messing-with-forces-i-dont-understand-the-formula/">Etching PCBs</a> with hydrogen peroxide, vinegar, and table salt (wow!)

<a href="http://swharden.com/qrssvd/files/morse.exe">Morse.exe</a> - A good way to learn Morse code!

## High Altitude Balloon

<a href="http://www.ve7zsa.net/technical/advsgtxt/c7oscillator_r00.htm ">Oscillator page</a> which has a section mentioning that the 7th overtone can be used in an oscillator. The 7th overtone of 18mhz (17m) is 144mhz (2m) smack dab in the CW region. Nice!

<a href="http://habhub.org/predict/#!/uuid=6f0e725b992a00555d7b2e65b0bae1ade0d38fae">Path prediction</a> - note that UF is 29.642276 latitude and -82.344949 longitude

<a href="http://www.robertharrison.org/icarus/wordpress/">Icarus</a> - a HAB project run on advertising revenue that seems successful and has launched many balloons with some awesome photos. <a href="http://www.robertharrison.org/index.php?option=com_content&amp;task=view&amp;id=25&amp;Itemid=78">Robert Harrison</a> knows his stuff!

<a href="http://projectspaceplanes.com/">Project Space Planes</a> - launches paper airplanes from 30km above the earth which glide down and land all over the world!

<a href="http://natrium42.com/halo/flight2/">HALO project</a> - very well documented HAB with pictures/video

<a href="http://www.phonestack.com/farhan/jbot.html">JBOT</a> - An SSB linear amplifier made from Just a Bunch of Transistors. It's pretty straightforward, cheap, and converts 1mW input to 5W output.

<a href="http://oz2oe.dk/radio/interference/xtalgen/xtalgen.html">harmonic oscillator</a>

<a href="http://www.radiosparks.com/images_d/OSBA1078.jpg">tuned oscillator example</a>

<a href="http://www.radiosparks.com/images_d/OSCR941.jpg">overtone oscillator</a>

<a href="http://my.integritynet.com.au/purdic/rf-amplifier-with-feedback.htm">amplifier design walk-through</a>

<a href="http://openbookproject.net/electricCircuits/">Lessons in Electric Circuits</a> - A very good (free) textbook. Anyone starting to learn about electronics should start by skimming over relevant chapters of this text!

<a href="http://www.genesisradio.com.au/Q5/">1W CW transmitter kit</a> - Although I don't own one, I appreciate the kit and love the <a href="http://genesisradio.com.au/Q5/q5_20.gif">schematic</a>. This guy uses a buffer chip (a 74HC04n, similar to a 74HC240 often used in QRP too) to act as an oscillator and small amplifier. The output is then further amplified by a 2n3866 transistor.

<a href="http://clayton.isnotcrazy.com/mept_v1">30M Solar QRSS transmitter</a> - such an inspiring project! This guy uses a buffer chip (74hc245) to amplify the output of CKOUT of a microcontroller clocked at the transmit frequency. The thing is solar powered, and has a unique temperature compensation mechanism which uses the chip's built-in thermosensor to adjust its offset. I haven't seen this technique used anywhere else in a QRP transmitter!

<a href="http://www.hanssummers.com/">HansSummers.com</a> - Everything this man does is impressive! His QRSS section is wonderful, and I won't detract from it by trying to describe it here. He also has a simple QRSS receiver circuit based upon a SA602, <a href="http://www.swharden.com/blog/2010-06-09-minimalist-radio-receiver/">something I replicated</a> (tuned front-end not shown) to operate my <a href="http://ham.w4dfu.ufl.edu:8080/">W4DFU QRSS Grabber</a> at the University of Florida.

<a href="http://www.aoc.nrao.edu/~pharden/hobby/_ClassDEF1.pdf">MOSFET "Switched Mode" Amplifiers</a> - a wonderful document, read it multiple times! Transistors are traditionally used in many QRP circuits as amplifiers, but MOSFETs have some unique qualities which in many ways makes them easier to work with in simple circuits. I found this guide EXTREMELY helpful!

<a href="http://my.integritynet.com.au/purdic/rf-amplifier-with-feedback.htm">Amplifier design</a> - a cool walk-through of the design of an amplifier with the math described every step of the way

<a href="http://www.ham.se/en/27939-post26.html">IRF-510 QRP transmitter</a> design which looks pretty interesting... Note that increasing efficiency lets the MOSFET run cool!

<a href="http://www.rason.org/Projects/transmit/transmit.htm">Similar IRF-510 transmitter</a> I like as well....

<a href="http://www.pan-tex.net/usr/r/receivers/svfo.htm">SA602 as an oscillator</a> - clever, clock with tank, mix with nothing, output (mixed?) is clock only!

<a href="http://en.wikipedia.org/wiki/User:Rainglasz/Colpitts-Oscillator">JFET Rainglasz/Colpitts Oscillator Design</a> which looks interesting

## Misc

<a href="http://www.gizmology.net/batteries.htm">Battery info</a> - useful for calculating life of batteries under load

<a href="http://www.powerstream.com/AA-tests.htm">Battery tests</a> - tests common batteries at different loads to determine real (not optimal) amp hour ratings!

<a href="http://www.aade.com/filter32/download.htm">Filter design software</a> I use for low pass filter design

<a href="http://www.dl5swb.de/html/mini_ring_core_calculator.htm">Mini ring and core calculator</a> very convenient for designing inductors with toroids or calculating resonance of LC networks

<a href="http://digilander.libero.it/i2ndt/grabber/grabber-compendium.htm">Knights QRSS Compendium</a> - Live image feeds of QRSS grabbers all around the world, often situated at the QRSS watering hole of 10.140MHz

<a href="http://cnts.be/mailman/listinfo/knightsqrss_cnts.be">Knights QRSS Mailing List</a> - Sign up for this mailing list to see who's transmitting what on which frequency. People also often post photos of their transmitters, and interesting captures from grabbers that you may have missed!

<a href="http://www.amazon.com/Experimental-Methods-Design-Amateurs-Library/dp/0872598799">Experimental Methods in RF Design</a> - Only $32 on Amazon.com right now, this book is an amazing resource for anyone interested in building RF circuits. It goes from extremely simple transmitters, receivers, and amplifiers all the way through advanced topics, modulation methods, etc. It even describes how to build your own test equipment, and even how to use an oscilloscope and assess various stages of your transmitter designs. Flipping through the pages of this book gives me new ideas every time! I requested it many times from my university library (interlibrary loan, often came from Vanderbilt University) before I broke down and got it. I highly recommend this book!

Full-Auto Rapidfire Mouse Modification

I did this purely for the fun of it, and am aware there are many ways to accomplish the same thing. I was playing Counter Strike Source (you should buy it and play with me, name "swharden") and my fingers are really cold from the winter weather, and wondered if I could have a button help with the rapid firing of pistols. I mentioned it on the microphone, and one of the players ("{Ẋpli¢it} shadow") said I should go for it. Because it was a fun little project, I documented it so I could share it. Check out the cool photos and video!

There's a summary of the project in video form. Some details of the project are below...

Here you can see the original circuit board in the mouse. The microchip on the bottom right of the image seems to do the data processing, so I investigated it a bit and found the pin that the left-click button goes to.

Here's the underside. It helped me identify good locations to grab +5V and GND solder points.

This is the microcontroller I decided to use for the project. It's an ATTiny25, $1.33 USD (10+ quantity from Mouser), and has a built in 8MHz oscillator (which can run at 1MHz thanks to the DIV/8 clock prescaler.

I slap the chip in the homebrew development board (a glorified AVR-ISP mkII) and it's ready for programming. Code and schematics are at the bottom.

After programming, I glued the microchip upside-down in the mouse case and soldered wires directly to the pins. I used small (about 28AWG) magnet wire because it's a lot easier than stripping wires. Just heat the tip with a soldering iron, the coating melts away, and you can stick it wherever you need to with a dab of solder. Not too many people use this method, but I recommend you try it at least once! It can be very useful at times, and is about as cheap as you can get. (eBay has good prices)

BIG PROBLEM! It didn't work AT ALL. Why? Didn't know... I checked the o-scope and saw everything seemed to be working fine. It turns out that 50 clicks per second was too fast to register, and when I reduced the speed to 25 clicks per second it worked fine. Unfortunately I had to add extra wires to allow myself to program the chip while it was in the mouse - a major pain that complicated the project more than I wished!

Here's a good view of the transistor. Simply put, when the microcontroller sends power to the "base" pin of the 2n2222 transistor, the "collector" is drained through the "emitter", and the transistor acts like a switch. It's shorting the pin, just like would happen if you physically pressed the left click mouse button. When the mouse microchip is positive (+5V), it's "no click", but when it goes to ground (shorted by the click button), a click is detected. I biased the "base" pin toward ground by connecting it to GND through a high value resistor. This makes sure it doesn't accidentally fire when it's not supposed to.

Here you can clearly see the programmer pins I added. This lets me quickly access the chip and reprogram it if I decide to add/modify functionality.

When it's all said and done, it's surprisingly slick and functional. I'm using it right now to write my blog, and the button isn't really in the way. I think it's one of those el-cheapo buttons you get in a pack of 10 from RadioShack, but I would highly recommend eBay as RadioShack is ridiculously overpriced on components.

There's the schematic. Grabbing 5v and GND from a usb mouse is trivial. Heck, most of the circuity/code is trivial! Now that I think about it, this represents are really great starter project for anyone interested in microcontrollers.

Use this diagram of the pin functions for reference.

Remember there's more than one way to skin a cat! For example, if you don't want to program a microcontroller, a 555 timer is a simple method and there are tutorials out there demonstrating how to do this. I chose a microcontroller because I can precisely control the rate of firing and the duration. If you decide to do something similar, send me photos and I'd be happy to share them on the site! I love doing tangible projects, however silly they are.

And finally, the code!

#define F_CPU 1000000UL // frequency (20MHz)
#include <avr/io.h>
#include <util/delay.h>

void on()
{
    PORTB |= 1 << PB3; //led
    PORTB |= 1 << PB2; //heater
}
void off()
{
    PORTB &= ~(1 << PB3); //led
    PORTB &= ~(1 << PB2); //heater
}

void main()
{
    DDRB |= (1 << PB3) | (1 << PB2);
    int ticks;

    for (;;)
    { //FOREVER
        while ((PINB & _BV(PB4)) == 0)
        {
        }                                     // NOT PRESSED, DO NOTHING
        for (ticks = 0; ticks < 125; ticks++) // CLICK FOR 5 seconds
        {
            on();
            _delay_ms(20);
            off();
            _delay_ms(20);
        } // CLICK TAKES 1/50'th second
    }
}
Markdown source code last modified on January 18th, 2021
---
title: Full-Auto Rapidfire Mouse Modification
date: 2010-12-28 01:52:09
tags: circuit, microcontroller, old
---

# Full-Auto Rapidfire Mouse Modification

__I did this purely for the fun of it, and am aware there are many ways to accomplish the same thing.__ I was playing [Counter Strike Source](http://store.steampowered.com/css) (you should buy it and play with me, name "swharden") and my fingers are really cold from the winter weather, and wondered if I could have a button help with the rapid firing of pistols.  I mentioned it on the microphone, and one of the players ("{Ẋpli¢it} shadow") said I should go for it.  Because it was a fun little project, I documented it so I could share it. Check out the cool photos and video!

![](https://www.youtube.com/embed/pxHLXyPt6N8)

__There's a summary of the project in video form.__ Some details of the project are below...

<div class="text-center img-border">

[![](rapidfire_mouse_mod-1_thumb.jpg)](rapidfire_mouse_mod-1.jpg)

</div>

__Here you can see the original circuit board in the mouse. __The microchip on the bottom right of the image seems to do the data processing, so I investigated it a bit and found the pin that the left-click button goes to.

<div class="text-center img-border">

[![](rapidfire_mouse_mod-2_thumb.jpg)](rapidfire_mouse_mod-2.jpg)

</div>

__Here's the underside.__ It helped me identify good locations to grab +5V and GND solder points.

<div class="text-center img-border">

[![](rapidfire_mouse_mod-3_thumb.jpg)](rapidfire_mouse_mod-3.jpg)

</div>

__This is the microcontroller I decided to use for the project.__ It's an ATTiny25, $1.33 USD (10+ quantity from Mouser), and has a built in 8MHz oscillator (which can run at 1MHz thanks to the DIV/8 clock prescaler.

<div class="text-center img-border">

[![](rapidfire_mouse_mod-4_thumb.jpg)](rapidfire_mouse_mod-4.jpg)

</div>

__I slap the chip in the homebrew development board__ (a glorified AVR-ISP mkII) and it's ready for programming. Code and schematics are at the bottom.

<div class="text-center img-border">

[![](rapidfire_mouse_mod-5_thumb.jpg)](rapidfire_mouse_mod-5.jpg)

</div>

__After programming, I glued the microchip__ upside-down in the mouse case and soldered wires directly to the pins. I used small (about 28AWG) magnet wire because it's a lot easier than stripping wires. Just heat the tip with a soldering iron, the coating melts away, and you can stick it wherever you need to with a dab of solder. Not too many people use this method, but I recommend you try it at least once! It can be very useful at times, and is about as cheap as you can get. (eBay has good prices)

<div class="text-center img-border">

[![](rapidfire_mouse_mod-6_thumb.jpg)](rapidfire_mouse_mod-6.jpg)

</div>

__BIG PROBLEM!__ It didn't work *AT ALL*. Why? Didn't know... I checked the o-scope and saw everything seemed to be working fine.  It turns out that 50 clicks per second was too fast to register, and when I reduced the speed to 25 clicks per second it worked fine. Unfortunately I had to add extra wires to allow myself to program the chip while it was in the mouse - a major pain that complicated the project more than I wished!

<div class="text-center img-border">

[![](rapidfire_mouse_mod-7_thumb.jpg)](rapidfire_mouse_mod-7.jpg)

</div>

__Here's a good view of the transistor. __ Simply put, when the microcontroller sends power to the "base" pin of the 2n2222 transistor, the "collector" is drained through the "emitter", and the transistor acts like a switch. It's shorting the pin, just like would happen if you physically pressed the left click mouse button. When the mouse microchip is positive (+5V), it's "no click", but when it goes to ground (shorted by the click button), a click is detected. I biased the "base" pin toward ground by connecting it to GND through a high value resistor. This makes sure it doesn't accidentally fire when it's not supposed to.

<div class="text-center img-border">

[![](rapidfire_mouse_mod-8_thumb.jpg)](rapidfire_mouse_mod-8.jpg)

</div>

__Here you can clearly see the programmer pins I added.__ This lets me quickly access the chip and reprogram it if I decide to add/modify functionality.

<div class="text-center img-border">

[![](rapidfire_mouse_mod-9_thumb.jpg)](rapidfire_mouse_mod-9.jpg)

</div>

__When it's all said and done, it's surprisingly slick and functional. __ I'm using it right now to write my blog, and the button isn't really in the way. I think it's one of those el-cheapo buttons you get in a pack of 10 from RadioShack, but I would highly recommend eBay as RadioShack is ridiculously overpriced on components.

<div class="text-center img-border">

[![](rapidfire_mouse_mod-10_thumb.jpg)](rapidfire_mouse_mod-10.jpg)

</div>

__There's the schematic.__  Grabbing 5v and GND from a usb mouse is trivial. Heck, most of the circuity/code is trivial!  Now that I think about it, this represents are really great starter project for anyone interested in microcontrollers.

<div class="text-center">

![](ATtiny25-45-85V.jpg)

</div>

__Use this diagram of the pin functions for reference.__

__Remember there's more than one way to skin a cat!__ For example, if you don't want to program a microcontroller, a 555 timer is a simple method and there are tutorials out there demonstrating how to do this.  I chose a microcontroller because I can precisely control the rate of firing and the duration. If you decide to do something similar, send me photos and I'd be happy to share them on the site!  I love doing tangible projects, however silly they are.

__And finally, the code!__

```c
#define F_CPU 1000000UL // frequency (20MHz)
#include <avr/io.h>
#include <util/delay.h>

void on()
{
    PORTB |= 1 << PB3; //led
    PORTB |= 1 << PB2; //heater
}
void off()
{
    PORTB &= ~(1 << PB3); //led
    PORTB &= ~(1 << PB2); //heater
}

void main()
{
    DDRB |= (1 << PB3) | (1 << PB2);
    int ticks;

    for (;;)
    { //FOREVER
        while ((PINB & _BV(PB4)) == 0)
        {
        }                                     // NOT PRESSED, DO NOTHING
        for (ticks = 0; ticks < 125; ticks++) // CLICK FOR 5 seconds
        {
            on();
            _delay_ms(20);
            off();
            _delay_ms(20);
        } // CLICK TAKES 1/50'th second
    }
}
```

My Simple Balcony Antenna

I've been using a new HF antenna recently with surprisingly good results. Hopefully this page will be encouraging to those in apartments with severe antenna restrictions. I used to operate an indoor dipole mounted on my ceiling which was virtually invisible, but ever since solar panels were added to my apartment roof this antenna is picking up a huge amount of noise. In the past I played with a base-loaded vertical antenna made from copper pipe and it worked okay, especially when on my balcony, but it was bulkier than needed and awkward to store. My most recent antenna is made from 24AWG wire helically wrapped around the top element of a 3-element cane pole. My dad found a 15ft cane pole for $4 and it's working pretty well for me. I guess the best description of this antenna is a "fully-loaded vertical" similar to a DIY hamstick. Here are some photos.

Notice that I only wrapped the highest element with wire. (The arrows in the above image depict where the helical element begins and finishes.) My logic is geared toward trying to get as much of the functional antenna above my apartment roof as possible. While it might not be a high-gain antenna, the level of noise reduction I experienced by raising the majority of the antenna above the roof is astounding.

I can hear stations nearly full quieting that I cannot even detect with my indoor dipole. Also, I hate reports like this, but I've only made a few SSB contacts ever with my indoor setup, and always local US stations. The very first contact I made with this vertical antenna was Slovenia! He was calling CQ, I responded, and it picked me up on the first try.

THIS ANTENNA IS UGLY and a certain violation of my lease agreement which specifically states no outdoor antennas are allowed. Therefore, this is something I can only set up at night. Notice the PVC fitting at the base of the antenna - it makes it easy to set up and break down. Maximum setup / breakdown time is 30 seconds. On the floor of my balcony I have wire running up and down the wooden boards which forms a makeshift mesh ground plane. It's not optimal, but I'm limited and it's what I came up with. When I feel ambitious, I have quarter-wavelength radials that I toss off the balcony and in the bushes to improve grounding. Although I'm sure I could have tap points and gator clips to select the antenna's resonant frequency, currently I run the antenna right into a MAC-200 antenna tuner. I've used it on 17m, 20m, 30m, 40m, and 80m. Again, this antenna is far from optimal, it should represent the last resort for extreme cases, but when you're faced with not being able to operate at all this little quick and dirty setup has been a godsend!

I'm sure a lot of people will read this and be angry or argue as to why this doesn't make a good antenna. I'm not claiming it's awesome, but for me it's the best I could come up with in my limited situation. That's my $0.02!

Markdown source code last modified on January 18th, 2021
---
title: My Simple Balcony Antenna
date: 2010-11-29 14:04:54
tags: amateur radio
---

# My Simple Balcony Antenna

__I've been using a new HF antenna recently__ with surprisingly good results. Hopefully this page will be encouraging to those in apartments with severe antenna restrictions. I used to operate an [indoor dipole mounted on my ceiling](http://www.swharden.com/blog/images/dipole_apartment_2.png) which was [virtually invisible](http://www.swharden.com/blog/images/dipole_apartment_1.JPG), but ever since solar panels were added to my apartment roof this antenna is picking up a huge amount of noise.  In the past I played with a [base-loaded vertical antenna made from copper pipe](http://www.swharden.com/blog/2010-01-30-rainy-mornings-and-boring-bicuspids/) and it worked okay, especially when on my balcony, but it was bulkier than needed and awkward to store. My most recent antenna is made from 24AWG wire helically wrapped around the top element of a 3-element cane pole. My dad found a 15ft cane pole for $4 and it's working pretty well for me. __I guess the best description of this antenna is a "fully-loaded vertical" similar to a DIY hamstick.__ Here are some photos.

<div class="text-center img-border">

[![](IMG_4631_thumb.jpg)](IMG_4631.jpg)
[![](IMG_4632_thumb.jpg)](IMG_4632.jpg)
[![](arrows_thumb.jpg)](arrows.jpg)

</div>

__Notice that I only wrapped the highest element with wire.__ (The arrows in the above image depict where the helical element begins and finishes.) My logic is geared toward trying to get as much of the functional antenna above my apartment roof as possible.  While it might not be a high-gain antenna, the level of noise reduction I experienced by raising the majority of the antenna above the roof is astounding.  

<div class="text-center img-border">

[![](antenna-stitched_thumb.jpg)](antenna-stitched.jpg)

</div>

I can hear stations nearly full quieting that I cannot even detect with my indoor dipole. Also, I hate reports like this, but I've only made a few SSB contacts ever with my indoor setup, and always local US stations. The very first contact I made with this vertical antenna was Slovenia! He was calling CQ, I responded, and it picked me up on the first try.

__THIS ANTENNA IS UGLY__ and a certain violation of my lease agreement which specifically states no outdoor antennas are allowed.  Therefore, this is something I can only set up at night.  Notice the PVC fitting at the base of the antenna - it makes it easy to set up and break down. Maximum setup / breakdown time is 30 seconds. On the floor of my balcony I have wire running up and down the wooden boards which forms a makeshift mesh ground plane.  It's not optimal, but I'm limited and it's what I came up with.  When I feel ambitious, I have quarter-wavelength radials that I toss off the balcony and in the bushes to improve grounding.  Although I'm sure I could have tap points and gator clips to select the antenna's resonant frequency, currently I run the antenna right into a MAC-200 antenna tuner.  I've used it on 17m, 20m, 30m, 40m, and 80m. Again, this antenna is far from optimal, it should represent the last resort for extreme cases, but when you're faced with not being able to operate at all this little quick and dirty setup has been a godsend!

__I'm sure a lot of people will read this and be angry or argue__ as to why this doesn't make a good antenna. I'm not claiming it's awesome, but for me it's the best I could come up with in my limited situation. __That's my $0.02!__

Crystal Oven Experiments

Now that I've finished my 6-channel data logger (previous post), it's time to put it to the test! I'm using a handful of LM335 temperature sensors to measure temperature, and a 20 Ohm resistor to act as a heater. When 1A of current passes through it, it gets quite toasty! First, I'll make some temperature probes...

UPDATE: Those photos show a partially completed sensor. Obviously the third wire is required between the resistor and the LM335 to allow for measurement! Here's a more completed sensor before the shrink tube was massaged over the electrical elements:

Then I mounted the sensors on a block of steel with the heater on one side. This way I can use one temperature to measure the heater temperature, and the other to measure the temperature of the metal chassis. I then put the whole thing in a small Styrofoam box.

When I fire the heater, that sucker gets pretty darn hot. In 40 minutes it got almost 250F (!) at which time I pulled the plug on the heater and watched the whole thing cool. Notice how the metal chassis lags behind the temperature of the heater. I guess it's a bit of a "thermal low-pass filter". Also, yes, I'm aware I spelled chassis incorrectly in the graphs.

But how do we use this to build a thermo-stable crystal oven for a MEPT (radio transmitter)? I tried a lot of code, simply "if it's too cold, turn heater on / if it's too hot, turn heater off" but because the chassis always swung behind the heater, and even the heater itself had a bit of a delay in heating up, the results were always slowly oscillating temperatures around 10F every 20 min. That's worse than no heater! My best luck was a program to hold temperature stable at 100F with the following rules:

  • 1.) If heater > 155F, turn heater off (prevent fire)
  • 2.) If chassis < 100F, turn heater on
  • 3.) if (heater-target) > (target-chassis), turn heater off

What a great job! That thing is practically stable in 20 minutes. The advantage of this over an analog method is that I can set the temperature in software (or provide an interface to change temperature) and my readings are analytical, such that they can be conveyed in a radio message. Again, my best results came when I implemented rule 3 in the code above. More experiments to come!

Markdown source code last modified on January 18th, 2021
---
title: Crystal Oven Experiments
date: 2010-11-28 17:06:18
tags: circuit, microcontroller, old
---

# Crystal Oven Experiments

__Now that I've finished my__ 6-channel data logger (previous post), it's time to put it to the test!  I'm using a handful of LM335 temperature sensors to measure temperature, and a 20 Ohm resistor to act as a heater.  When 1A of current passes through it, it gets quite toasty!  First, I'll make some temperature probes...

<div class="text-center img-border">

[![](IMG_4581_thumb.jpg)](IMG_4581.jpg)
[![](IMG_4588_thumb.jpg)](IMG_4588.jpg)

</div>

__UPDATE:__ Those photos show a partially completed sensor. Obviously the third wire is required between the resistor and the LM335 to allow for measurement! Here's a more completed sensor before the shrink tube was massaged over the electrical elements:

<div class="text-center img-border">

[![](IMG_4591_thumb.jpg)](IMG_4591.jpg)

</div>

__Then I mounted the sensors__ on a block of steel with the heater on one side.  This way I can use one temperature to measure the heater temperature, and the other to measure the temperature of the metal chassis.  I then put the whole thing in a small Styrofoam box. 

<div class="text-center img-border">

[![](IMG_4606_thumb.jpg)](IMG_4606.jpg)
[![](IMG_4615_thumb.jpg)](IMG_4615.jpg)

</div>

__When I fire the heater,__ that sucker gets pretty darn hot. In 40 minutes it got almost 250F (!) at which time I pulled the plug on the heater and watched the whole thing cool. Notice how the metal chassis lags behind the temperature of the heater. I guess it's a bit of a "thermal low-pass filter".  Also, yes, I'm aware I spelled chassis incorrectly in the graphs.

<div class="text-center">

[![](howhot_thumb.jpg)](howhot.png)
[![](quicktest_thumb.jpg)](quicktest.png)

</div>

__But how do we use this to build a thermo-stable crystal oven for a MEPT (radio transmitter)?__ I tried a lot of code, simply "if it's too cold, turn heater on / if it's too hot, turn heater off" but because the chassis always swung behind the heater, and even the heater itself had a bit of a delay in heating up, the results were always slowly oscillating temperatures around 10F every 20 min. That's worse than no heater!  My best luck was a program to hold temperature stable at 100F with the following rules:

* `1.) If heater > 155F, turn heater off (prevent fire)`
* `2.) If chassis < 100F, turn heater on`
* `3.) if (heater-target) > (target-chassis), turn heater off`

<div class="text-center">

[![](heaterworks_thumb.jpg)](heaterworks.png)

</div>

__What a great job!__ That thing is practically stable in 20 minutes. The advantage of this over an analog method is that I can set the temperature in software (or provide an interface to change temperature) and my readings are analytical, such that they can be conveyed in a radio message. Again, my best results came when I implemented rule 3 in the code above. More experiments to come!

ATMega48 + LM335 + MAX232 = Serial Port Multi-Channel Temperature Measurement

While working to perfect my temperature-controlled manned experimental propagation transmitter (MEPT), I developed the need to accurately measure temperature inside my Styrofoam enclosure (to assess drift) and compare it to external temperature (to assess insulation effects). I accomplished this utilizing the 8 ADC channels of the ATMega48 and used its in-chip USART capabilities to send this data to a PC for logging. I chose the ATMega48 over the ATTiny2313 (which has USART but no ADCs) and the ATTiny44a (which has ADCs but no USART). From when I see, no ATTiny series ATMEL AVR has both! Lucky for me, the ATMega48 is cheap at $2.84 USD. Here's my basic circuit idea:

EDIT: the voltage reference diagram is wrong at the bottom involving the zener diode. Reference the picture to the right for the CORRECT way to use such a diode as a voltage reference. (stupid me!)

MULTIPLE SENSORS - Although in this demonstration post I only show a single sensor, it's possible to easily have 8 sensors in use simultaneously since the ATMega48 has 8 ADC pins, and even more (infinitely) if you want to design a clever way to switch between them.

LM335 Temperature Sensor - selected because it's pretty cheap (< $1) and quantitative. In other words, every 10mV drop in voltage corresponds to a change of 1ºC. If I wanted to be even cheaper, I would use thermistors (<$0.10) which are more qualitative, but can be calibrated I guess.

Notes on power stability - The output of the sensor is measured with the ADC (analog to digital converter) of the microcontroller. The ADC has a 10-bit resolution, so readings are from 0 to 2^10 (1024). AREF and AVCC can be selected as a voltage reference to set what the maximum value (1024) should be. If the ADC value is 1V (for example) and AREF is 1V, the reading will be 1024. If AREF becomes 5V, the reading will be 1024/5. Make sense? If AREF is fluctuating like crazy, the same ADC voltage will be read as differing vales which is not what we want, therefore care should be taken to ensure AREF is ripple-free and constant. Although I did it by adding a few capacitors to the lines of the power supply (not very precise), a better way would be to use a zener diode (perhaps 4.1V?) as a voltage reference.

Here is my circuit. I'm clocking the chip at 9.21MHz which works well for 19200 baud for serial communication. Refer to my other MAX232 posts for a more detailed explanation of how I chose this value. The temperature sensor (blurry) is toward the camera, and the max232 is near the back. Is that an eyelash on the right? Gross!

The data is read by a Python script which watches the serial port for data and averages 10 ADC values together to produce a value with one more significant digit. This was my way of overcoming continuously-fluctuating values.

Here you can see me testing the device by placing an ice cube on the temperature sensor. I had to be careful to try to avoid getting water in the electrical connections. I noticed that when I pressed the ice against the sensor firmly, it cooled at a rate different than if I simply left the ice near it.NOTICE THE PROGRAMMER in the background (slightly blurry). The orange wires connect the AVR programmer to my circuit, and after the final code is completed and loaded onto the microcontroller these orange wires will be cut away.

Here is some actual data from the device. The LM335 readout is in Kelvin, such that 3.00V implies 300K = 80ºF = 27ºC (room temperature). The data is smooth until I touch it with the soldering iron (spike), then it gets cool again and I touch it with a cold piece of metal (wimpy dip), then later I put an ice cube on it (bigger dip). Pretty good huh? Remember, 0.01V change = 1ºC change. The bottom of the dip is about 2.8V = 280K = 44ºF = 7ºC. If I left the cube on longer, I imagine it would reach 0ºC (273K, or 2.73V).For everyone's reference, here's the pinout diagram of the ATMega48:

import socket
import sys
import serial

ser = serial.Serial('COM1', 19200, timeout=1)
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)

chunk=""
i=0
data = ser.readline()
while True:
    i+=1
    data = ser.readline()
    data=data.replace("n","")
    data=data.replace("r","")
    data="["+data[:-1]+"]"
    data=eval(data)
    val=sum(data)/float(len(data))
    print i,data,val
    chunk=chunk+"%.01f,"%val
    if i==100:
        print "nSAVING"
        i=0
        f=open("data.txt","a")
        f.write(chunk)
        f.close()
        chunk=""

and the code to PLOT the data file:


import matplotlib.pyplot as plt
import numpy

def smoothTriangle(data,degree,dropVals=False):
        """performs moving triangle smoothing with a variable degree."""
        """note that if dropVals is False, output length will be identical
        to input length, but with copies of data at the flanking regions"""
        triangle=numpy.array(range(degree)+[degree]+range(degree)[::-1])+1
        smoothed=[]
        for i in range(degree,len(data)-degree*2):
                point=data[i:i+len(triangle)]*triangle
                smoothed.append(sum(point)/sum(triangle))
        if dropVals: return smoothed
        smoothed=[smoothed[0]]*(degree+degree/2)+smoothed
        while len(smoothed)<len(data):smoothed.append(smoothed[-1])
        return smooth

print "loading..."
f=open("data.txt")
raw="["+f.read()+"]"
f.close()
data=eval(raw)

print "converting..."
data=numpy.array(data)
data=data/1024.0*5 #10-bit resolution, 5V max

print "graphing"
plt.plot(data)

plt.grid(alpha=.5)
plt.title("ATMega48 LM335 Temperature Sensor")
plt.ylabel("Voltage (V)")
plt.xlabel("Time (5/sec)")
plt.show()

Also, the AVR-GCC code loaded on the ATMega48:

#define F_CPU 9210000UL

#include <avr/io.h>
#include <util/delay.h>

void init_usart(unsigned long);

unsigned int readADC(char times){
    unsigned long avg=0;
    for (char i=0; i<times; i++){
        ADCSRA |= (1<<ADSC); // reset value
        while (ADCSRA & ( 1<<ADSC)) {}; // wait for measurement
        avg=avg+ADC;
    }
    avg=avg/times;
    return avg;
}

int main (void){

    ADMUX = 0b0100101; // AVCC ref on ADC5
    ADCSRA = 0b10000111; //ADC Enable, Manual Trigger, Prescaler 128
    ADCSRB = 0;

    DDRD=255;

    init_usart(19200);
    for(;;){
        for(char j=0;j<10;j++){
            sendNum(readADC(10)>>6); // shift to offset 10bit 16bit
            send(44); // COMMA
            PORTD=255;_delay_ms(10);
            PORTD=0;_delay_ms(10);
            }
        send(10);send(13); // LINE BREAK
        }
    }

void sendNum(unsigned int num){
        char theIntAsString[7];
        int i;
        sprintf( theIntAsString, "%u", num );
        for (i=0; i < strlen(theIntAsString); i++)
        {send(theIntAsString[i]);}
}

void send (unsigned char c){
        while((UCSR0A & (1<<UDRE0)) == 0) {}
        UDR0 = c;
}

void init_usart (unsigned long baud)
{
    /////////////////////////
    //        Baud Generation
    unsigned int UBRR_2x_off;
    unsigned int UBRR_2x_on;
    unsigned long closest_match_2x_off;
    unsigned long closest_match_2x_on;
    unsigned char off_2x_error;
    unsigned char on_2x_error;

    UBRR_2x_off = F_CPU/(16*baud) - 1;
    UBRR_2x_on = F_CPU/(8*baud) - 1;

    closest_match_2x_off = F_CPU/(16*(UBRR_2x_off + 1));
    closest_match_2x_on = F_CPU/(8*(UBRR_2x_on + 1));

    off_2x_error = 255*(closest_match_2x_off/baud - 1);
    if (off_2x_error <0) {off_2x_error *= (-1);}
    on_2x_error = 255*(closest_match_2x_on/baud -1);
    if (on_2x_error <0) {on_2x_error *= (-1);}

    if(baud > F_CPU / 16)
    {
        UBRR0L = 0xff & UBRR_2x_on;
        UBRR0H = 0xff & (UBRR_2x_on>>8);
        UCSR0A |= (1<<U2X0);
    } else {

        if (off_2x_error > on_2x_error)
        {
            UBRR0L = 0xff & UBRR_2x_on;
            UBRR0H = 0xff & (UBRR_2x_on>>8);
            UCSR0A |= (1<<U2X0);
        } else {
            UBRR0L = 0xff & UBRR_2x_off;
            UBRR0H = 0xff & (UBRR_2x_off>>8);
            UCSR0A &= ~(1<<U2X0);
        }
    }
    /////////////////////////
    //    Configuration Registers
    UCSR0B = (0<<RXCIE0) |//We don't want this interrupt
    (0<<TXCIE0) |//We don't want this interrupt
    (0<<UDRIE0) |//We don't want this interrupt
    (1<<RXEN0) |//Enable RX, we wont use it here but it can't hurt
    (1<<TXEN0) |//Enable TX, for Talkin'
    (0<<UCSZ02);//We want 8 data bits so set this low

    UCSR0A |= (0<<U2X0) |//already set up, so don't mess with it
    (0<<MPCM0) ;//We wont need this

    UCSR0C = (0<<UMSEL01) | (0<<UMSEL00) |//We want UART mode
    (0<<UPM01) | (0<<UPM00) |//We want no parity bit
    (0<<USBS0) |//We want only one stop bit
    (1<<UCSZ01) | (1<<UCSZ00) |//We want 8 data bits
    (0<<UCPOL0) ;//This doesn't effect UART mode
}

UPDATE: A day later I added multiple sensors to the device. I calibrated one of them by putting it in a plastic bag and letting it set in ice water, then I calibrated the rest to that one. You can see as my room temperature slowly falls for the night, the open air sensor (red) drops faster than the insulated one in a Styrofoam box. Also, I did a touch of math to convert voltage to kelvin to Fahrenheit. You can also see spikes where it quickly approached 90+ degrees from the heat of my fingers as I handled the sensor. Cool!

UPDATE: a day and a half later, here's what the fluctuations look like. Notice the cooling of night, the heating of day, and now (near the end of the graph) the scattered rain causes more rapid fluctuations. Also, although one sensor is in an insulated styrofoam box, it still fluctuates considerably. This measurement system is prepped and ready to go for crystal oven tests!

Markdown source code last modified on January 18th, 2021
---
title: Serial Port Multi-Channel Temperature Measurement
date: 2010-11-24 08:17:03
tags: circuit, microcontroller, python, old
---

# ATMega48 + LM335 + MAX232 = Serial Port Multi-Channel Temperature Measurement

__While working to perfect my temperature-controlled manned experimental propagation transmitter (MEPT), I developed the need to accurately measure temperature inside my Styrofoam enclosure (to assess drift) and compare it to external temperature (to assess insulation effects).__ I accomplished this utilizing the 8 ADC channels of the ATMega48 and used its in-chip USART capabilities to send this data to a PC for logging.  I chose the ATMega48 over the ATTiny2313 (which has USART but no ADCs) and the ATTiny44a (which has ADCs but no USART).  From when I see, no ATTiny series ATMEL AVR has both!  Lucky for me, the [ATMega48 is cheap](http://search.digikey.com/scripts/DkSearch/dksus.dll?Detail&name=ATMEGA48-20PU-ND) at $2.84 USD. Here's my basic circuit idea: 

<div class="text-center img-border"> 

[![](IMG_4559_thumb.jpg)](IMG_4559.jpg)

</div>

EDIT: the voltage reference diagram is wrong at the bottom involving the zener diode. Reference the picture to the right for the CORRECT way to use such a diode as a voltage reference. (stupid me!)

<div class="text-center"> 

![](aref.jpg)

</div>

__MULTIPLE SENSORS__ - Although in this demonstration post I only show a single sensor, it's possible to easily have 8 sensors in use simultaneously since the ATMega48 has 8 ADC pins, and even more (infinitely) if you want to design a clever way to switch between them.

__LM335 Temperature Sensor__ - selected because it's pretty cheap (< $1) and quantitative. In other words, every 10mV drop in voltage corresponds to a change of 1ºC.  If I wanted to be even cheaper, I would use thermistors (<$0.10) which are more qualitative, but can be calibrated I guess.

Notes on power stability  - The output of the sensor is measured with the ADC (analog to digital converter) of the microcontroller. The ADC has a 10-bit resolution, so readings are from 0 to 2^10 (1024).  AREF and AVCC can be selected as a voltage reference to set what the maximum value (1024) should be.  If the ADC value is 1V (for example) and AREF is 1V, the reading will be 1024.  If AREF becomes 5V, the reading will be 1024/5. Make sense?  If AREF is fluctuating like crazy, the same ADC voltage will be read as differing vales which is not what we want, therefore care should be taken to ensure AREF is ripple-free and constant.  Although I did it by adding a few capacitors to the lines of the power supply (not very precise), a better way would be to use a <a href="http://en.wikipedia.org/wiki/Zener_diode">zener diode (perhaps 4.1V?) as a voltage reference.

<div class="text-center img-border">

[![](IMG_4575_thumb.jpg)](IMG_4575.jpg)

</div>

<b>Here is my circuit.</b> I'm clocking the chip at 9.21MHz which works well for 19200 baud for serial communication. Refer to my other MAX232 posts for a more detailed explanation of how I chose this value. The temperature sensor (blurry) is toward the camera, and the max232 is near the back. Is that an eyelash on the right? Gross!

<div class="text-center img-border"> 

![](logger.jpg)

</div>

<b>The data is read by a Python script</b> which watches the serial port for data and averages 10 ADC values together to produce a value with one more significant digit. This was my way of overcoming continuously-fluctuating values.

<div class="text-center img-border"> 

[![](IMG_4564_thumb.jpg)](IMG_4564.jpg)

</div>

<b>Here you can see me testing the device</b> by placing an ice cube on the temperature sensor. I had to be careful to try to avoid getting water in the electrical connections. I noticed that when I pressed the ice against the sensor firmly, it cooled at a rate different than if I simply left the ice near it.<b>NOTICE THE PROGRAMMER</b> in the background (slightly blurry). The orange wires connect the AVR programmer to my circuit, and after the final code is completed and loaded onto the microcontroller these orange wires will be cut away.

<div class="text-center"> 

[![](lm335-microcontroller-graph-annotated_thumb.jpg)](lm335-microcontroller-graph-annotated.png)

</div>

<b>Here is some actual data from the device.</b> The LM335 readout is in Kelvin, such that 3.00V implies 300K = 80ºF = 27ºC (room temperature). The data is smooth until I touch it with the soldering iron (spike), then it gets cool again and I touch it with a cold piece of metal (wimpy dip), then later I put an ice cube on it (bigger dip). Pretty good huh? Remember, 0.01V change = 1ºC change. The bottom of the dip is about 2.8V = 280K = 44ºF = 7ºC. If I left the cube on longer, I imagine it would reach 0ºC (273K, or 2.73V).<b>For everyone's reference, here's the pinout diagram of the ATMega48:</b>

<div class="text-center img-medium"> 

[![](atmega48pinout_thumb.jpg)](atmega48pinout.png)

</div>

```python
import socket
import sys
import serial

ser = serial.Serial('COM1', 19200, timeout=1)
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)

chunk=""
i=0
data = ser.readline()
while True:
    i+=1
    data = ser.readline()
    data=data.replace("n","")
    data=data.replace("r","")
    data="["+data[:-1]+"]"
    data=eval(data)
    val=sum(data)/float(len(data))
    print i,data,val
    chunk=chunk+"%.01f,"%val
    if i==100:
        print "nSAVING"
        i=0
        f=open("data.txt","a")
        f.write(chunk)
        f.close()
        chunk=""

```

<b>and the code to PLOT the data file:</b>

```python

import matplotlib.pyplot as plt
import numpy

def smoothTriangle(data,degree,dropVals=False):
        """performs moving triangle smoothing with a variable degree."""
        """note that if dropVals is False, output length will be identical
        to input length, but with copies of data at the flanking regions"""
        triangle=numpy.array(range(degree)+[degree]+range(degree)[::-1])+1
        smoothed=[]
        for i in range(degree,len(data)-degree*2):
                point=data[i:i+len(triangle)]*triangle
                smoothed.append(sum(point)/sum(triangle))
        if dropVals: return smoothed
        smoothed=[smoothed[0]]*(degree+degree/2)+smoothed
        while len(smoothed)<len(data):smoothed.append(smoothed[-1])
        return smooth

print "loading..."
f=open("data.txt")
raw="["+f.read()+"]"
f.close()
data=eval(raw)

print "converting..."
data=numpy.array(data)
data=data/1024.0*5 #10-bit resolution, 5V max

print "graphing"
plt.plot(data)

plt.grid(alpha=.5)
plt.title("ATMega48 LM335 Temperature Sensor")
plt.ylabel("Voltage (V)")
plt.xlabel("Time (5/sec)")
plt.show()
```

<b>Also, the AVR-GCC code loaded on the ATMega48:</b>

```c
#define F_CPU 9210000UL

#include <avr/io.h>
#include <util/delay.h>

void init_usart(unsigned long);

unsigned int readADC(char times){
    unsigned long avg=0;
    for (char i=0; i<times; i++){
        ADCSRA |= (1<<ADSC); // reset value
        while (ADCSRA & ( 1<<ADSC)) {}; // wait for measurement
        avg=avg+ADC;
    }
    avg=avg/times;
    return avg;
}

int main (void){

    ADMUX = 0b0100101; // AVCC ref on ADC5
    ADCSRA = 0b10000111; //ADC Enable, Manual Trigger, Prescaler 128
    ADCSRB = 0;

    DDRD=255;

    init_usart(19200);
    for(;;){
        for(char j=0;j<10;j++){
            sendNum(readADC(10)>>6); // shift to offset 10bit 16bit
            send(44); // COMMA
            PORTD=255;_delay_ms(10);
            PORTD=0;_delay_ms(10);
            }
        send(10);send(13); // LINE BREAK
        }
    }

void sendNum(unsigned int num){
        char theIntAsString[7];
        int i;
        sprintf( theIntAsString, "%u", num );
        for (i=0; i < strlen(theIntAsString); i++)
        {send(theIntAsString[i]);}
}

void send (unsigned char c){
        while((UCSR0A & (1<<UDRE0)) == 0) {}
        UDR0 = c;
}

void init_usart (unsigned long baud)
{
    /////////////////////////
    //        Baud Generation
    unsigned int UBRR_2x_off;
    unsigned int UBRR_2x_on;
    unsigned long closest_match_2x_off;
    unsigned long closest_match_2x_on;
    unsigned char off_2x_error;
    unsigned char on_2x_error;

    UBRR_2x_off = F_CPU/(16*baud) - 1;
    UBRR_2x_on = F_CPU/(8*baud) - 1;

    closest_match_2x_off = F_CPU/(16*(UBRR_2x_off + 1));
    closest_match_2x_on = F_CPU/(8*(UBRR_2x_on + 1));

    off_2x_error = 255*(closest_match_2x_off/baud - 1);
    if (off_2x_error <0) {off_2x_error *= (-1);}
    on_2x_error = 255*(closest_match_2x_on/baud -1);
    if (on_2x_error <0) {on_2x_error *= (-1);}

    if(baud > F_CPU / 16)
    {
        UBRR0L = 0xff & UBRR_2x_on;
        UBRR0H = 0xff & (UBRR_2x_on>>8);
        UCSR0A |= (1<<U2X0);
    } else {

        if (off_2x_error > on_2x_error)
        {
            UBRR0L = 0xff & UBRR_2x_on;
            UBRR0H = 0xff & (UBRR_2x_on>>8);
            UCSR0A |= (1<<U2X0);
        } else {
            UBRR0L = 0xff & UBRR_2x_off;
            UBRR0H = 0xff & (UBRR_2x_off>>8);
            UCSR0A &= ~(1<<U2X0);
        }
    }
    /////////////////////////
    //    Configuration Registers
    UCSR0B = (0<<RXCIE0) |//We don't want this interrupt
    (0<<TXCIE0) |//We don't want this interrupt
    (0<<UDRIE0) |//We don't want this interrupt
    (1<<RXEN0) |//Enable RX, we wont use it here but it can't hurt
    (1<<TXEN0) |//Enable TX, for Talkin'
    (0<<UCSZ02);//We want 8 data bits so set this low

    UCSR0A |= (0<<U2X0) |//already set up, so don't mess with it
    (0<<MPCM0) ;//We wont need this

    UCSR0C = (0<<UMSEL01) | (0<<UMSEL00) |//We want UART mode
    (0<<UPM01) | (0<<UPM00) |//We want no parity bit
    (0<<USBS0) |//We want only one stop bit
    (1<<UCSZ01) | (1<<UCSZ00) |//We want 8 data bits
    (0<<UCPOL0) ;//This doesn't effect UART mode
}

```

<b>UPDATE:</b> A day later I added multiple sensors to the device. I calibrated one of them by putting it in a plastic bag and letting it set in ice water, then I calibrated the rest to that one. You can see as my room temperature slowly falls for the night, the open air sensor (red) drops faster than the insulated one in a Styrofoam box. Also, I did a touch of math to convert voltage to kelvin to Fahrenheit. You can also see spikes where it quickly approached 90+ degrees from the heat of my fingers as I handled the sensor. Cool!

<div class="text-center"> 

[![](3traces_thumb.jpg)](3traces.png)

</div>

<b>UPDATE:</b> a day and a half later, here's what the fluctuations look like. Notice the cooling of night, the heating of day, and now (near the end of the graph) the scattered rain causes more rapid fluctuations. Also, although one sensor is in an insulated styrofoam box, it still fluctuates considerably. This measurement system is prepped and ready to go for crystal oven tests!

<div class="text-center"> 

[![](insulated3_thumb.jpg)](insulated3.png)

</div>
Pages