Difference between revisions of "Electronics"

From Wiki2
Line 1: Line 1:
[http://circuitlab.com circuitlab] mcktimo 6j
[http://circuitlab.com circuitlab] mcktimo 6j
==[[projects in process]]==
==[[projects in process]]==
==[[water control project]]==
{{:water control project-desc}}
{{:water control project-desc}}
{{:online heating system control project}}
{{:online heating system control project}}

Revision as of 15:14, 3 June 2013

circuitlab mcktimo 6j

projects in process

little app to communicate between browser/app and microcontroller to run a small waterfall

We have two little ponds in the yard fed by the rainwater from the roof. They are at the base of a big outcropping of roxbury pudding stone. Water is pumped from the lower pond to the upper pond and from the upper pond up the side of the ledge.

There is an app, "cascada" that starts the pumps and energizes the circuits to turn on the waterfall and control the level of the lower pond.

If it hasn't rained in a while, over time water evaporates and leaks out. The level of the pond is controlled using a $10 lawn sprinkler valve to inject water into the pond when the falls below a certain level. Water gets added while the pumps are on until it reaches the max level then it goes off. If you turn on the pumps again it doesn't continue filling but waits to inject water til the water falls to the low water sensor.

The water level control is independent of the pond timer, is located in its own circuit box on the porch and is activated whenever the waterfall is on.

The other circuit is connected to the house ethernet and contains a server, relays and timers to turn the system on and off. Its microcontroller is connected to an Enc28j60 chip that implements a server capable of delivering GET string variables to the microcontroller.

The app is written in HTML5/javascript, resides on http://cascada.sitebuilt.net and uses $.get to send a string to a php script on the that server which transfers it by curl to the external Enc28j60 server located in the house. It does this via a http://www.noip.com/ since the home network's IP can change. It tells the controller which circuit it wants on and for how long. more info back to electronics

the pitch

Hi, I used run a company that built houses. I have prototyped a device that replaces all the thermostats in your house with temperature sensors. Data from those sensors streams to the cloud every 20 seconds. Your interface to your heating and cooling system is any device, smartphone, tablet of laptop. You can use the data collected to monitor your energy use and to optimize system performance or to help you decide on a system upgrade. A multiple-zone HVAC system can be controlled and monitored for less than the cost of one nest thermostat.

I plan on producing small run of hand assembled devices by the fall and I want to get them into the homes of people who could help get this product to market. My name is Tim Mckenna. The company is Site-Built Systems.

description

The most advanced and easy to use user interface these days is probably the one contained in your smartphone or tablet. Apps are easy to use, interactive and readily update-able. The interface on your programmable thermostat probably wouldn't be high on that list. And if you have more than one heating zone then the difficulty is multiplied.

Replace those thermostats with temperature sensors and control the whole house from one interface. Slip a microcontroller device between the thermostat connections and the heating/cooling system. Connect it to the home network and you are ready to go. From 1 zone to 8 zones, it will monitor and control them all.

Start collecting data on your energy use. Which zone calls for heat the most? Which takes longest to heat up? How much would it cost to be a little warmer? How much is setting back the thermostat saving me in my house? Optimize your hydronic system by running the boiler at a lower temperature on a warmer day.

Overriding any zones program is easy and can be done remotely from any connected device, phone tablet or browser.

An Avr microcontroller takes in temperature readings from multiple locations. At the control room the AVR hub polls temperature and for each zone knows the set temperature, the default temperature and whether or not a zone is ON and how long it has been on. If it doesn't hear from the (linux) scheduler then it falls back to act as a multi-zone thermostat set at the default temperatures.

The scheduler would take temperature data from the AVR client and would know the schedule. Whenever a schedule change point would come up, it would notify the AVR and instruct it to change the set point.

The controller would on the client probably an HTML5/javascript client. Here you can read the temperatures and view the schedule. You can override or change the schedule.

online heating system control project

table

documentation

Small articles

  • communication with arduino through the get string
  • offloading computation to server and javascript

Do I have the fire in the belly to create a product out of this?

hvac.sitebuilt.net

Control all your hvac zones online.

  1. replace thermostats with temperature sensors
  2. install system microcontroller
  3. connect to internet

Control all your hvac zones online

replace thermostats with temperature sensors

install system microcontroller

connect to internet

troubleshooting

sql

curl

development log

12/18/13

  • re holds:
    hold on master puts hold on tv_display & hold on tv puts hold on master_display and shuts off
    hold on TVroom for 67 when is 64 puts system on in TVroom but displays 67ON at Master
    hold on TVroom for 62 when is 64 puts system on in TVroom since Master reads 60 which is over 62
    hold on TVroom for 59 when is 64 puts system OFF in TVroom since Master reads 60 which is over 59

conclusion for holds: TVroom reads temp of Master, displays setting/state in Master, state is controlled by temp of Master.

  • hold on Master for 67 when Master reads 60 and TV reads 64 -> puts 67On inTV and turns on zoneMaster
    hold on Master for 63 when Master reads 60 and TV reads 64 -> puts 63Off inTV and turns off zoneMaster

conclusion for holds: for TV and Master

  • upper right display is switched
  • temp of one controls state of other


http://homecontrol.sitebuilt.net jquery-mobile app

deployment - sensors for 7 zones live

One wire sensors are known to be weird when connected in a star network of varying lengths < 100ft. See...

on one wire problems
guidelines for relaiable 1 wire networks

In general if they can be found on search then they will work for reporting temperatures. So I unplugged sensors until I got a configuration that worked then put the rest in a second OneWire network ds1(26). and then modified the code to read the first network then the second. You can tell how a particular configuration does by running setup. Screwing the wires in sucks. Plugging them in is good.

TODO:

  • get rid of swipe right/swipe left
  • fix sort ordering
  • refresh on home
  • fix so not always LR
  • fix save program so it looks like something happenede (get rid of checks)

beta 0.1 - cleaned up colors, some testing on multiple devices

TODO: back to electronics. Build working relays. on relaysS

version I:

on callback functions from things like $.get(... this.something doesn't refer back to the object method but must be explicitly referred to by like sys.somethhing

version H: titeObj -time temp array: display, sort, clear, edit

TODO:create a datObj. Arrays/objects push/slice/delete

All the functions and data are encapsulated. A coulple of 'this' problems were solved by replacing this. with titeObj.

My kind of oops: http://www.javascriptkit.com/javatutors/oopjs.shtml

version G: tempA -time temp array: display, sort, clear, edit

(TODO: flesh out the program data structure) OK now I know at least about the tempA array

   0: Object
   temp: "69"
   time: "00:45"
   __proto__: Object
   1: Object
   temp: "69"
   time: "09:45"
   __proto__: Object
   2: Object
   temp: "69"
   time: "12:45"
   __proto__: Object

andthere a boatload of functions to manipulate it and its display. Strong candidate for an Object with member functions.

Moved away from using JQuery and delved further into CSS3 for creating buttons and widgets. Everything works better.

Javascript
nth children

<syntaxhighlight>

   $(".prog-tes li").click(function() {
       time=$(':nth-child(2)', $(this)).html();
       temp=($(':nth-child(3)', $(this)).html()).substring(0,2);
       alert(temp+"clicked it "+time);
   });	

</syntaxhighlight>

javascript array.push(newval);
$(this)[0];//same as getElementById
dataset data-mydata
 ddd=$(this)[0];//same as getElementById
 dow = ddd.dataset.dow;
$(document).on('pageshow', '#aroom', function (e) {

Use when you have programmatically changed page and now need to do somethin on that page

scroll to anchor

<syntaxhighlight>

   if(anc.length>0){
       $('html, body').animate({
           scrollTop: $(anc).offset().top-95
       }, 1000);  
       anc=""; 	
   }

</syntaxhighlight>

CSS

If styling isn't getting picked up specify the hell out of the selector. - .prog-day div.day2 li, .prog-time div.prog-time-box li{

version F: CSS3 and media queries

col1, col2, col3 do wahht they should
just cloumn 1a is working in terms of element layout

version E: write schedule progs to database

PUT request to /prog/80302/ver/ multiple ckts and multiple days for those ckts
PUT request to /prog/80302/ver/99/5, multiple ckts for day 5
PUT request to /prog/80302/ver/4/, multiple days for ckt 4
PUT request to /prog/80302/ver/4/5, day4 for ckt 5

remembering the flow from the case:put case:feed arduino loop is

  • getTodayLTEnow()
  • ckHolds($db, $req); //(calls updateSetptArr())
  • $se = getSetptArr($db, $path);
  • echo $se; //sends it to arduino
  • zeroSetptArr($db, $path);

Work on, from app end, routines and interface for writing programs

The structure of prog data is {"feed":"80302","ckts":[[{"time":"9:30","setpt":"147"},null,null,null,null,null,{"time":"9:30","setpt":"147"}],null,null,null,null,null,null,null,null,null,null,[{"time":"9:30","setpt":"147"},null,null,null,null,null,{"time":"9:30","setpt":"147"}]]} and it is roughed out in comments at bottom of ha.js


version-D prog data and hold data

ACTUALLY: didn't touch getTodayLTEnow()

  • added a RewriteRule boho /var/www/hsc/index.php?id=$1 in defauls sites
  • worked on hold.php driven from .button-boost and .button.setpt (data structures are the same {"feed":"80302","ckt":4,"start":1363707975,"finish":1363688100,"setpt":167})
  • worked on release as DELETErequest inhad deleteHold.php wcase:delete:case:boho callinging existing method in index.php called delHold()

PLANNED: Will be combining dialog for boost and hold. Working to have /feed do the following extra tasks

   getTodayLTEnow(); //(calls updateSetptArr())
   ckHolds($db, $req); //(calls updateSetptArr())
   $se = getSetptArr($db, $path);
   echo $se; //sends it to arduino
   zeroSetptArr($db, $path);	

Have been using the dialog pages as test pages for moving prog data and hold data through system.

post of new program data (was getting tested boost-yes button )

<syntaxhighlight> //{"feed":"80302","ckts":[[{"time":"9:30","setpt":"147"},null,null,null,null,null,{"time":"9:30","setpt":"147"}],null,null,null,null,null,null,null,null,null,null,[{"time":"9:30","setpt":"147"},null,null,null,null,null,{"time":"9:30","setpt":"147"}]]}

   schedJ =JSON.stringify(sched);
   console.log(schedJ);
   console.log(ckt.length);
   console.log(sched.ckts[11]==null);
   console.log(sched.ckts[11][7]==null);
   $.post("../services/newProg.php", {data: schedJ}).done(function(data){
           alert("Data Loaded: " + data);

</syntaxhighlight>

this data tracks through newProg.php and then to http://198.23.156.78/hsc/prog/80302 as a a JSON post string
post of new hold/boost entry (was getting tested in hold-yes button)

<syntaxhighlight>

   $(".hold-yes").click(function() {	
       console.log("clicked hold-yes");		
       holdS='{"feed":"80302","ckt":99,"start":1363707975,"finish":1364000000,"setpt":140}';
       holdArr = JSON.parse(holdS);
       holdStr =JSON.stringify(holdArr);
       console.log(holdArr);
       $.post("../services/hold.php", {data: holdStr}).done(function(data){
           alert("Data Loaded: " + data);
       });
       return false;
   });		

</syntaxhighlight>

header-menu

If you want menus in your header use this code, just don't let any class in the data-role="page"

mess with your formatting

<syntaxhighlight>

<a href="#popupMenu" data-rel="popup" data-role="button" data-inline="true">Menu</a> <a href="#popupNested" data-rel="popup" data-role="button" data-inline="true">Nested menu</a>

Dog

  • Popup API
  • <a href="options.html">Options</a>
  • <a href="methods.html">Methods</a>
  • <a href="events.html">Events</a>

Farm animals

  • <a href="../dialog.html" data-rel="dialog">Chicken</a>
  • <a href="../dialog.html" data-rel="dialog">Cow</a>
  • <a href="../dialog.html" data-rel="dialog">Duck</a>
  • <a href="../dialog.html" data-rel="dialog">Sheep</a>

Pets

  • <a href="../dialog.html" data-rel="dialog">Cat</a>
  • <a href="../dialog.html" data-rel="dialog">Dog</a>
  • <a href="../dialog.html" data-rel="dialog">Iguana</a>
  • <a href="../dialog.html" data-rel="dialog">Mouse</a>

Ocean Creatures

  • <a href="../dialog.html" data-rel="dialog">Fish</a>
  • <a href="../dialog.html" data-rel="dialog">Octopus</a>
  • <a href="../dialog.html" data-rel="dialog">Shark</a>
  • <a href="../dialog.html" data-rel="dialog">Starfish</a>

Wild Animals

  • <a href="../dialog.html" data-rel="dialog">Lion</a>
  • <a href="../dialog.html" data-rel="dialog">Monkey</a>
  • <a href="../dialog.html" data-rel="dialog">Tiger</a>
  • <a href="../dialog.html" data-rel="dialog">Zebra</a>

</syntaxhighlight>

system versions -arduino+server code

version C - /hsc/index.php /services/putSetptArr.php

Cron calls have to build the data into the URL so they will look like:

http://homecontrol.sitebuilt.net/services/putSetpt.php?feed=80302&type=prog&sensor=6&setpt=167

Not a PUT but in Curl it gets converted for the rest api as a PUT with data encoded

$bdata=json_encode($data);   
curl_setopt($ch, CURLOPT_POSTFIELDS,$bdata);
http://198.23.156.78/hsc/prog/80302/4
$req = RestUtils::processRequest()- index.php starts with this. The request object has...
$path =$req->getPathArr()- path[0]=hsc(the db name), path[1]=80303=2(the feed id), path[3]=sensor#
$data=$req->getData() - rest.api finds the data depending on PUT GET POST etc setpt=167

Index.php looks at PUT||GET||POST, feed||prog, and sensor||noSensor to determine what to do.

updateSetptArr($db, $path, $data); - appends to setPtArr one value

when PUT/feed/ fires it first grabs any new setpts from the db, then echo's it back to the Arduino and then zero's it out.

$se = getSetptArr($db, $path);
echo $se;
zeroSetptArr($db, $path);

getHttpHeaders() holds hidden stuff like apikey and that stuff gets set here:

curl_setopt($ch, CURLOPT_HTTPHEADER, array( 
  "Accept: json",
  "HTTP/1.1 Host: api.cosm.com",
  "X-ApiKey:  xxxxxxjxjndjjxn",
  "User-Agent: sitebuilt Arduino Example (83080)" ));  
       
version C - hsc-run: C code - no more String class, everything indexed on MAXCKTS, new setpts in (simple)<JSONarray>
setup() starts the serial monitor and ethernet then reads from memory an array of sensor id's (char lu[MAXCKTS][9]), the numckts and an array of setpts[MAXCKTS] where 12 is MAXCKTS. It then assigns an array of pins as outputs (to relays not yet arrived from China)
The main loop() begins zipping along taking in a character of incoming data on each loop and printing it to the serial monitor while grabbing characters if they come between < and > and storing them in a character array cdata[]
updateSetpts() then kicks in, first reading current setpt[] data from memory, and, as long as some data has come (strlen(cdata)-2>4) it loads up ps[] from cdata[] with everything inside <[]>. This incoming dat must be in the form <[0,0,0,0,0,0,0,0,0,167,0,0]> with MAXCKTS entries.
strtok then breaks up that ps[] character array on the ',' and puts each setpt in an array of char arrays *strings[pslen] which gets indexed for each of the MAXCKTS setpt values coming in. Each is then atoi'd into an integer newVal which is compared with curVal and if(curVal != newVal && newVal > 0){ //not equal to each other and newVal isn't 0, then the newVal is written to memory and replaces the curVal.
   cdata[0]='\0';
   getSensorIds();
   readTemps();
   orderTemps();    
   setRelays(); 
   assembleData();
   sendData(); 
   lastConnectionTime = millis();  

Next: only record to db if temp changes

in c://Users/tim/Documents/tech/electronics/Arduino/hsc_run.ino
in c://Users/tim/Documents/tech/electronics/Arduino/hsc_setup.ino
in c://Users/tim/Documents/tech/electronics/Arduino/hsc_readSetup.ino
version B - no more String class, missing readings retain order
version A - mega as server sending to ReSt API and client receiving new setpts

in c://Users/tim/Documents/tech/electronics/Arduino/thermoc.ino

bits and pieces

version 6

Moving things to 10.0.1.101 but first set up api framework there
Added rewrite rules in /etc/apache2/sites-available/default by following beginner link <syntaxhighlight> <Directory /var/www/hsc>

   RewriteEngine On
   RewriteRule feed/([0-9]+) /var/www/hsc/index.php?id=$1
   RewriteRule feeds /var/www/hsc/index.php
   RewriteRule datastreams /var/www/hsc/index.php?id=$1	
   RewriteRule prog /var/www/hsc/index.php?id=$1		
   RewriteRule progs /var/www/hsc/index.php?id=$1		

</Directory> </syntaxhighlight> Test code to parse url <syntaxhighlight> <?php echo("hi dog
"); print_r($_SERVER['REQUEST_URI']); echo "
"; $urlarr = (parse_url($_SERVER['REQUEST_URI'])); echo "
"; print_r($_GET); echo "
"; print_r($urlarr); echo "
"; $pathstr=($urlarr["path"]); echo $pathstr; echo "
"; print_r(explode("/", $pathstr)); ?> </syntaxhighlight>

version 3
php www-data program that creates a crontab and calls a C program that executes root commands to copy it into crontabs and install it
write a php file that PUTS some light on on the AVR
collect data from AVR and store it in mysql
view the saved data on a client using javascript

code working on arduino

versions now use both arduino and php code so new versions sill be listed under #system versions -arduino+server code
version 5
raw DS18B20 to server, convert and send back to serial monitor

Uploaded to Arduino is hsc_tempJSONphp.ino Raw data is sent by arduino to /var/www/feeds/getnoise.php which puts it in an object and then creates another object containing F converted sensor readings for data coming off ONEWIRE connected sensors. Then it sends that data back.

Trying to convert to float on the Arduino wasn't working. Why push it? I've got unlimited power on LAMP server.

version 4 - temp readings beyond serial monitor
version 4a - DS18B20 readings to JSON
version 4b - JSON from arduino to PHP server
a) separate out a function to provide a reading to send to cosm for pin 0(14) and 1(15)
1 one possibility - send to cosm. This is better than having a webclient like thermometer.ino. Get it to Cosm and then later set up an api like cosm
version 3 - onewire demo

Put sample code in function getTemp(). Subsequent calls of the function don't reset the device counter. this is good.

DS18B20wiring.PNG

On serial monitor running DS18x20_Temperature.ino ala the library here. Of note: How it polls each device: <syntaxhighlight>

 if ( !ds.search(addr)) {//this is where it loops to the next address
   Serial.println("No more addresses.");
   Serial.println();
   ds.reset_search();//if there are no more devices go back to start of list
   delay(250);
   return;
 }

</syntaxhighlight>

version 2
Online thermometer creating web page in which you call for the data by clicking a button. Uses design from Practical Arduino in /tim/Documents/electronics/arduino/thermometerthermometer.ino and it runs at http://10.0.1.79
version 1
Take random readings from analog pins start an etehrnet client that sends them out to http://cosm.com (mcktimo 6j) every ten seconds :comtest.ino

final narrative

An Avr takes in temperature readings from multiple locations. At the control room the AVR hub polls temperature and for each zone knows the set temperature, the default temperature and whether or not a zone is ON and how long it has been on. If it doesn't hear from the (linux) scheduler then it falls back to act as a multi-zone thermostat set at the default temperatures. Through a rudimentary display it would allow you to set temperatures for each zone.

The scheduler would take temperature data from the AVR client and would know the schedule. Whenever a schedule change point would come up, it would notify the AVR and instruct it to change the set point. It would do this via chrontab maybe.

The controller would on the client probably an HTML5/javascript client. Here you can read the temperatures and view the schedule. You can override or change the schedule.

possible routes

A cheap circuit like http://www.craig.copperleife.com/tech/thermo/ or more complicated http://www.rentron.com/project01.htm using http://datasheets.maximintegrated.com/en/ds/DS1620.pdf which can be overridden by server program that controls multiple thermostats.

ReST

Angular and PHP

Apache setup
Add rewrite rules

so a restful path /hsc/feeds/1234 (which doesn't really exist) sends you to the API which processes the request using the /feeds/12345 information from the path.

In /etc/apache2/sites-available/default add rules like <syntaxhighlight lang="html5"> <Directory /var/www/hsc> RewriteEngine On RewriteRule feed/([0-9]+) /var/www/hsc/index.php?id=$1 RewriteRule feeds /var/www/hsc/index.php RewriteRule datastreams /var/www/hsc/index.php?id=$1 RewriteRule prog /var/www/hsc/index.php?id=$1 RewriteRule progs /var/www/hsc/index.php?id=$1 </Directory> remember to restart apache /usr/sbin/apache2ctl restart </syntaxhighlight> The API processing code resides in /hsc in this case.

when to GET PUT POST
GET when you want some data
PUT when you've got data to put in the API
POST when you want to setup something new
DELETE duh

In the case of home_system_control (hsc):


  • GET request to /api/users – List all users
  • GET request to /api/users/1 – List info for user with ID of 1
  • POST request to /api/users – Create a new user
  • PUT request to /api/users/1 – Update user with ID of 1
  • DELETE request to /api/users/1 – Delete user with ID of 1
refs
cosm curl helper
http://api.cosm.com/v2/feeds/83080/datastreams/noise.csv?start=2013-01-11T19:30:00Z&end=2013-01-11T21:00:00Z&interval=0 doesn't work
http://cosm.github.com/cosm-js/tutorial/
accessing-incoming-put-data-from-php
create-a-rest-api-with-php
http://rest.elkstein.org/2008/02/using-rest-in-php.html
http://blog.garethj.com/2009/02/17/building-a-restful-web-application-with-php/
get for my feed
making-reliable-connections-with-arduino

Cron Jobs

Hudsonvalley#cron_and_backups
http://net.tutsplus.com/tutorials/php/managing-cron-jobs-with-php-2/
http://stackoverflow.com/questions/4421020/use-php-to-create-edit-and-delete-crontab-jobs

parts

on one wire problems

guidelines for relaiable 1 wire networks

DS1620 Digital Thermometer and Thermostat

In a thermostat circuit $2.20 for dip

DS18B20 Maxim 1-wire temperature sensors
DS18B20 datasheet$1.00 each for chip, $3.00 each for waterproof sensor
one-wire protocol
https://arduino-info.wikispaces.com/Brick-Temperature-DS18B20 multiple
OneWire tutorial another better library
color code for encased DS18B20 sensor red=vcc,black=gnd,yellow=data

DS18B20-pinout.jpg

pic

schematics, circuits, projects

collection of schematics
Craig's thermostat circuits
Solar differential controller (diffarduino)

parts

needed parts (next order)

  • thermistors
  • 5K and 10K POTS

dx.com

atmel 328 $5.50 arduino atmel 328 $3.50

ATmega328 with Arduino Optiboot (Uno)DEV-10524 Description: The name says it all on this one. An ATmega328 in DIP package, pre-loaded with the Arduino Optiboot (Uno 16MHz) Bootloader. This will allow you to use Arduino code in your custom embedded project without having to use an actual Arduino board. To get this chip working with Arduino IDE, you will need an external 16MHz crystal or resonator

DS1620 Digital Thermometer and Thermostat

In a thermostat circuit

DS18B20 Maxim 1-wire temperature sensors
DS18B20 datasheet$1.00 each for chip, $3.00 each for waterproof sensor
one-wire protocol
https://arduino-info.wikispaces.com/Brick-Temperature-DS18B20 multiple
OneWire tutorial another better library
color code for encased DS18B20 sensor red=vcc,black=gnd,yellow=data

DS18B20-pinout.jpg

Graphic LCD 84x48 - Nokia 5110

Graphic LCD 84x48 - Nokia 5110 runs on 3.3v so you have to interface carefully

KTM-S1201 lcd module

http://arduino.cc/forum/index.php/topic,22098.0.html

DK-duino DKUNO Atmega328p-20PU USB Board

cegoot001.jpg


Descriptions

Compatible with Arduino duemilanove 2009 Microcontroller: ATmega328P-PU USB to RS232 Controller: PL2303HX I/O compatible with Arduino UNO R3 Operating Voltage (logic level) : 5V Input Voltage (recommended) : 7.2-11.1V Input Voltage (limits) : 6-20V Package Content

1*DK-duino DKUNO Atmega328p-20PU USB Board 1* USB 2.0 cable

Ethernet Shield With Wiznet W5100 Ethernet Chip

( latest version ) Compatible Duemilanove (168/328) / Mega (1280/2560) / UNO

m.jpg

Product Description

     This is the latest version  of the Ethernet Shield. This Arduino Ethernet Shield which is based on the Wiznet W5100 Ethernet Chip gives you an easy way to get your Arduino Online. It is directly supported by Arduino official Ethernet Library. It adds a micro-SD card slot, which can be used to store files for serving over the network. It is compatible with the Arduino Duemilanove (168 or 328), Uno as well as Mega (1280/2560) and can be accessed using the SD library.

The Wiznet W5100 provides a network (IP) stack capable of both TCP and UDP. It supports up to four simultaneous socket connections. Use the Ethernet library to write sketches which connect to the internet using the shield.

6002

circuits

MPPT charge circuit

freechargecontroller.org

Arduino PPT Solar Charger Hardware Description by Tim Nolan 5/9/09

a better res pdf

These are my notes on the hardware and schematic for my Arduino Peak Power Tracker Solar Charger project. These notes are based on my schematic ArduinoSolar.pdf on my website www.timnolan.com.

This project is based on the open source hardware platform of the Arduino Duemilanove. I got mine at Sparkfun (www.sparkfun.com) but there are other places you can get them (www.makershed.com). The Arduino webpage that includes links to the Duemilanove schematic is at http://arduino.cc/en/Main/ArduinoBoardDuemilanove.

The Arduino Duemilanove takes care of the microprocessor part of the project. I built the charger part of the project on a ProtoShield Development Kit that I also got at Sparkfun. This is a small prototype board that has connectors to mate directly to the Arduino processor board and bring all the signals up to the prototype space. I was able to fit the complete charger circuit into this prototype space. If you take a look at the photos on my website you can see how the components are placed on the ProtoShield. I've also included the parts list for this project with the Digikey and Sparkfun parts numbers in the file ArduinoSolarPartsList.txt on my website www.timnolan.com.

The charger circuit is basically a DC/DC converter (in a buck configuration) controlled by the software in the microprocessor. The software figures out the voltage of solar panels where the Peak or Maximum Power is produced and controls the DC/DC converter to match the solar panel voltage to the battery voltage. The processor controls the DC/DC converter by generating a PWM signal that switches the MOSFETs at a 50kHz frequency. The transfer ratio of voltage in vs. voltage out is based on the duty cycle of the PWM signal.

Looking at the schematic ArduinoSolar.pdf the connector (J1) for the Solar Panel input is in the upper left corner. There is no protection for polarity reversal so make sure that the solar panels are connected correctly. The solar panel input voltage is connected to the Vin or Raw input to the Arduino board which goes to a voltage regulator to generate 5V to run the processor. The 5v also comes back to the ProtoShield board. The solar panel ground input is connected to the ground of the ProtoShield and Arduino processor board. The solar panel input voltage is divided down by R4 and R5 and sent to the Analog_0 input of the Arduino to be read by the processor.

The solar input current is read by R1 the .005 ohm current sense resistor that generates a very small voltage when the current flows. That voltage is picked up and amplified by IC1 the MAX4173H which is a high side current sense amplifier. The MAX4173H has an amplification of factor of 100. So if 5A is flowing through R1 it generates 5A x .005 ohms = 0.025V x 100 = 2.5V to be read by the processor. The MAX4173H only comes in surface mount SOIC8 package so I used a little conversion board from Sparkfun. I soldered the MAX4173H to the board and then used the 8 pin dip socket to plug it into the ProtoShield board.

C2 is the input filter capacitor that smooths out the input current pulses. Q1 is the blocking MOSFET that keeps the battery power from flowing back into the solar panels at night. Normally this is done by a diode in the power path but a since all diodes have a voltage drop a MOSFET is much more efficient. Notice that Q1 is turned around so the intrinsic MOSFET diode does not conduct. Q1 turns on when Q2 is on from voltage through D2. R3 drains the voltage off the gate of Q1 so it turns off when Q2 turns off.

Q2 is the main switching MOSFET for the buck converter and Q3 is the synchronous switching MOSFET. The MOSFET are driven by IC2 which is an IR2104 MOSFET driver. The IR2104 takes the PWM signal (Digital_9) from the processor input on pin 2 and uses it to drive the switching MOSFETs. The IR2104 can also be shut down with the control signal (low on Digital_8) from the processor on pin 3. Since Q2 is an NFET it needs a gate drive voltage that is 10V higher than the source voltage which is the solar input. So the IR2104 uses a charge pump circuit made of D3 and C4 to boost the gate drive voltage to turn on the high side MOSFET. This charge pump circuit only works when the MOSFETs are switching. The software keeps track of the PWM duty cycle and never allows 100% or always on. It caps the PWM duty cycle at 99.9% to keep the charge pump working.

D1 is an ultra fast diode that will start conducting current before Q3 turns on. It is supposed to make the converter more efficient but it may not be necessary. L1 is the main inductor that smooths the switching current and along with C3 it smooths the output voltage. Since the DC/DC converter is switching at 50kHz the 33uH value of the inductor should be sufficient. C7 and R10 are the snubber network used to cut down on the ringing of the inductor voltage.

To measure the battery voltage R6 and R7 make up the voltage divider which feeds the signal to Analog_2 to be read by the processor. J3 is the battery connector, there is no reverse polarity protection so make sure the battery is connected correctly. I did not have space to fit a fuse so make sure you put a fuse in your battery wiring harness. Batteries hold a lot of energy and you can start a fire if something goes wrong and you do not have a fuse. Also you might want to put a diode in battery wiring harness during development. If you look at the schematic you can see that if Q3 ever stays on for any length of time that it is a dead short across the battery. This would not happen in normal operation but if you have a software bug or you stop the system to load new software it might end up with Q3 on. A diode would stop this from happening but you would lose efficency in the diode voltage drop. Once you have the software worked out this diode is no longer necessary. I've burned up my fair share of MOSFETs before I figured this out.

I've included the two LEDs and switch that are on the ProtoShield board in my schematic. I use the one LED JC2 as a heartbeat indicator in my system.

12vdc-5vdc step down converter

Error creating thumbnail: File missing

using a $.37 MC34063ECN Switching Converters, Regulators & Controllers 3.0 to 40V DC-DC Cnv from mouser datasheet

The simplest way to reduce the voltage of a DC supply is to use a linear regulator (such as a 7805), but linear regulators waste energy as they operate by dissipating excess power as heat. Buck converters, on the other hand, can be remarkably efficient (95% or higher for integrated circuits), making them useful for tasks such as converting the main voltage in a computer (12 V in a desktop, 12-24 V in a laptop) down to the 0.8-1.8 volts needed by the processor. http://en.wikipedia.org/wiki/Buck_converter

switching converters explained

arduino

resistor color codes

refs

http://www.qsl.net/ve3lny/index.html
arduino-info - Nrf24L01-2.4GHz-HowTo
Arduino Differential Conntroller | Arduino Solar Hot Water | Differduino | Nateful
My Page - GarageLab (arduino, electronics, robotics, hacking)
Ethernet Arduino Library, using WizNET Ethernet modules with Teensy
PC/CP300 Electronics Laboratory II
8-Channel 12V Relay Module for Arduino PIC ARM AVR DSP - Free Shipping - DealExtreme
Shield stacking headers for Arduino ID: 85 - $1.50 : Adafruit Industries, Unique & fun DIY electronics and kits
Circuit Boards within Project Accessories - MCM Electronics Category
Relays and Practical Circuits
Embedded PIC based SBC board with Ethernet, RS232, I2C, 12 Analog Inputs, 32 Digital I/Os, free TCP
tuxgraphics.org: An AVR microcontroller based Ethernet device
FreePCB: freeware PCB layout software
Parts & Kits for Arduino Online, Buy Microcontroller Boards, Electronic Components for Arduino - EtherMega (100% Arduino Mega 2560 compatible with onboard Ethernet) - Freetronics
TCP/IP Stack, FAT16 System on a Microcontroller - CodeProject
Start Using HTML5 WebSockets Today | Nettuts+
www.clare.com/home/pdfs.nsf/www/CPC1998.pdf/$file/CPC1998.pdf
How To Solder - Soldering Tutorial
Solid State Relays
Transistor Circuits
Datasheet4U.net - World Electronic Components Datasheet Search Site!
[http://nl.bu.edu/research/software/downloads/ Downloads �� Software �� Research �� Neuromorphics Lab]
Graphical Resistance Calculator
How to Build a Robot Tutorial - Society of Robots
Reverse-Engineering an LCD Display
SMPS Basics - The Buck Converter
GuideCircuit : Free Electronics Circuit on website ; Digital thermostat
GuideCircuit : Free Electronics Circuit on website ; Schematics of Digital thermostat
===newmodel===

basics

  • LED flat section toward ground
  • breadboard power bars 1/2 of long side

op amps

on using wall warts in circuit design

http://www.dxing.info/equipment/wall_warts_bryant.dx

sample circuits

http://www.discovercircuits.com/S/solidstate.htm

http://members.vol.at/home.floery/electronix/picnic/documentation.html

http://www.edaboard.com/thread5683.html

http://microcontrollerkits.blogspot.com/2011/11/arduino-microcontroller-control-tcpip.html

http://tuxgraphics.org/electronics/200606/article06061.shtml

http://www.freetronics.com/

http://8bitmicro.blogspot.com/2012_02_01_archive.html

http://www.freetronics.com/products/etherten

testing diodes and transistors w/DVM