Arduino The Documentary (2010) English HD from gnd on Vimeo.
It's hard to believe that arduino didn't exist yet when I graduated high school and now it's the key piece I'm using in my Master's Project
Arduino The Documentary (2010) English HD from gnd on Vimeo.
#include <ports.>h> //#include <portslcd.h> #include <rf12.>h> #include <homenet.>h> //#include <homenetdevices.h> #include <homenetdevicelcd.>h> //Start HomeNet Packet Stack HomeNet stack(0x04);//0x01 is RF12 base station //0xFF is PC uplink //Setup Network Adapters //HomeNetPortSerial portSerial(PORT_SERIAL, stack); //PORT_SERIAL tells the adpater which serial serial port to use (for future support of the arduino mega) HomeNetPortRF12 portRF12(stack); //Setup attached devices HomeNetDeviceStatusLights statusLights(stack); //HomeNetDeviceTMP37 tmp37(stack); //HomeNetDeviceLight light(stack); HomeNetDeviceLCD lcd(stack); //package the setup info in a nice neat arrays HomeNetPort* ports[] = {&portRF12};//,&portSerial}; HomeNetDevice* devices[] = {&statusLights, &lcd};// &light , &tmp37}; MilliTimer sendTimer; void setup() { //initize home net with the setup info stack.init(ports, 1, devices, 2); stack.registerStatusLights(statusLights); //setup status lights } void loop() { //receive incoming packets stack.receive(); if (sendTimer.poll(10000)){ // PayloadBuffer buffer; // buffer.print("TEST NODE 3"); // stack.addUdpPacket(0, 2, 0, CMD_STRING, buffer.payload()); //stack.schedule(2,255,0); //type, toNode, toDevice } //process packets in the stack- send packets that ready stack.process(); delay(1); }
#include <ports.h> #include <rf12.h> #include <homenet.h> HomeNet stack(0x04);//start stack with a node id MilliTimer sendTimer; void setup() { // put your setup code here, to run once: stack.init(); } void loop() { // put your main code here, to run repeatedly: stack.receive(); if (sendTimer.poll(2000)){ PayloadBuffer buffer; buffer.print(123,DEC); stack.addUdpPacket(0, 255, 2, CMD_BYTE, buffer.payload()); } stack.process(); }
import processing.serial.*; import xmlrpclib.*; import org.apache.commons.codec.binary.Base64; //part of the xmlrpclib XmlrpcClient homeNetXmlrpcClient = new XmlrpcClient("http://matthew.sgcs.usf.edu/mcdportal/public/xmlrpc.php?api_key=dfgdfgdgdgd"); XmlrpcServer homeNetXmlrpcServer = new XmlrpcServer(8081); final int NODE_ID = 255; final int PACKET_TIMEOUT = 150; PacketStack stack = new PacketStack(NODE_ID); Serial myPort; // The serial port XMLElement xmlConfig; XMLElement commands[]; XMLElement devices[]; String findXMLid(XMLElement[] xml , int value, String rAttribute){ String rValue = ""; for(int a = 0; aMuch easier to use now!if(unhex(commands[a].getAttribute("id")) == value){ return commands[a].getAttribute(rAttribute); } } return rValue; } void setup() { size(600, 400); // Stage size //noStroke(); // No border on the next thing drawn homeNetXmlrpcServer.add("testserver", this); //setup server println("HomeNet XML-RPC Server started at " + homeNetXmlrpcServer.ip()+":8081/RPC2"); // Note that /RPC2 is hard-coded to URI in the Apache Library. textFont(createFont("Consolas", 14)); //fixedFont); xmlConfig = new XMLElement(this, "config.txt"); devices = xmlConfig.getChildren("devices/device"); commands = xmlConfig.getChildren("commands/command"); //load the above as hash table from my sevrer. // Print a list of the serial ports, for debugging purposes: //println(Serial.list()); String portName = Serial.list()[1]; myPort = new Serial(this, portName, 115200); } boolean arduinoBoot = false; int count = 0; long sendTimer; void draw() { if(arduinoBoot == false){ delay(2500); sendTimer = millis(); arduinoBoot = true;; } if((millis() - sendTimer) > 2000){ //DataPacket packet = build_udp_packet(NODE_ID,0,3,2,CMD_STRING,str_to_payload("Hello "+count)); //packet.status = STATUS_READY; sendTimer=millis(); count++; } stack.process(); stack.tempSerialCheck(myPort); //this is temp until I add support for multiple serial ports, and pass a list of ports to the packetStack } void packetEvent(DataPacket packet){ packet.status = STATUS_CLEAR; Hashtable send = new Hashtable(); String packetBase64 = new String(Base64.encodeBase64(packet.payload)); send.put("received",packet.received); send.put("packet", packetBase64); println("Server Reply: "+homeNetXmlrpcClient.execute("HomeNet.addPacket", send)); } void serialEvent(Serial port) { stack.buildSerialPacket(port); }
<?xml version="1.0"?>
<configuration>
<devices>
<device id="0x01" code="DVC_TMP37">Temperature Sensor TMP37</device>
<device id="0x02" code="DVC_LIGHT">Light Sensor LDR</device>
<device id="0x03" code="DVC_SHT21">Temperature and Humidy Sensor SHT21</device>
<device id="0x04" code="DVC_DOORCONTACT">Door Contact Sensor</device>
<device id="0x05" code="DVC_WINDOWCONTACT">Window Contact Sensor</device>
<device id="0x06" code="DVC_MOTION">Motion Sensor</device>
<device id="0x07" code="DVC_2LINEDISPLAY">2 Line Character Display</device>
<device id="0x08" code="DVC_POWER30">30A Current Sensor</device>
<device id="0x09" code="DVC_POWER100">100A Current Sensor</device>
<device id="0x10" code="DVC_SMARTOUTLET">Smart Outlet</device>
<device id="0x11" code="DVC_RGBLIGHT">RGN LED Light</device>
<device id="0x12" code="DVC_sound">Sound Sensor</device>
<device id="0x13" code="DVC_SWITCH">Simple Switch</device>
<device id="0x14" code="DVC_STATUSLED">Simple Status LEDS</device>
<device id="0x15" code="DVC_BUZZER">Alert Buzzer</device>
</devices>
<commands>
<!-- System Commands Port 0 -->
<command id="0x00" code="CMD_ERROR" payload="message" return="CMD_ACK"></command>
<command id="0x01" code="CMD_VERSION" payload="" return="CMD_FLOAT">
Get current version of firmware on the node
</command>
<command id="0x03" code="CMD_BATTERYLEVEL" payload="" return="">
Get current battery level
</command>
<command id="0x3E" code="CMD_PING" payload="varies" return="CMD_PONG">
Send Test Pack, node should reply back pong
</command>
<command id="0xE3" code="CMD_PONG" payload="varies" return="CMD_ACK">
Response to a Ping Command
</command>
<command id="0x11" code="CMD_ACK" payload="packetid" return="CMD_BYTE">
Acknowledge Packet, letting the sender of a packet know that data arriced safely
</command>
<command id="0x21" code="CMD_GETNODEID" payload="" return="CMD_BYTE">
Get Node's current ID (node id 0 is for broadcast)
</command>
<command id="0x22" code="CMD_SETNODEID" payload="passcode" return="CMD_ACK">
Changes NODE ID, used for initial setup
</command>
<command id="0x23" code="CMD_GETPLUG" payload="byte port" return="CMD_BYTE">
Get the device code for what is attached on the node
</command>
<command id="0x24" code="CMD_SETPLUG" payload="passcode" return="CMD_ACK">
Changes Device ID, used for initial setup
</command>
<!-- Plug commands Ports 1-15 -->
<command id="0xC1" code="CMD_AUTOSENDSTART" payload="node to, int" return="CMD_ACK">
Set up the node to automatically send sensor data to a particular node
</command>
<command id="0xC2" code="CMD_AUTOSENDSTOP" payload="node to" return="CMD_ACK">
Stop auto sending sensor data
</command>
<command id="0xD0" code="CMD_GETVALUE" payload="" return="Value">
Get a value from a plug
</command>
<command id="0xD1" code="CMD_SETVALUE" payload="" return="Value">
Send a value to a plug
</command>
<command id="0xE0" code="CMD_ON" payload="" return="CMD_ACK">
Simple Turn on
</command>
<command id="0xE1" code="CMD_OFF" payload="" return="CMD_ACK">
Simple Turn Off
</command>
<command id="0xE2" code="CMD_LEVEL" payload="byte" return="CMD_ACK">
Set a light to a level 0-255
</command>
<!-- Value commands -->
<command id="0xF0" code="CMD_BYTE" payload="byte" return="CMD_ACK"></command>
<command id="0xF1" code="CMD_STRING" payload="string" return="CMD_ACK"></command>
<command id="0xF2" code="CMD_INT" payload="int" return="CMD_ACK"></command>
<command id="0xF3" code="CMD_FLOAT" payload="float" return="CMD_ACK"></command>
<command id="0xF4" code="CMD_LONG" payload="long" return="CMD_ACK"></command>
</commands>
<!-- One day more stuff will be setup too -->
<pachube>
<apikey></apikey>
<feeds>
<feed name="Bedroom">
<datastream id="0" node="" plug="" device="" />
</feed>
</feeds>
</pachube>
<webserver>
<address></address>
</webserver>
</configuration>
XMLElement xml; PFont myFont; PrintWriter file; int i; String spaces(int count){ String spaces = ""; for(int a = 0;a<count;a++){ spaces += " "; } return spaces; } void setup() { size(200, 200); myFont = createFont("Consolas", 14); textFont(myFont); xml = new XMLElement(this, "config.txt"); //in txt file = createWriter("define.txt"); XMLElement commands[] = xml.getChildren("commands/command"); for(i = 0; i<commands.length;i++){ file.println("#define "+ commands[i].getAttribute("code")+spaces(20 - commands[i].getAttribute("code").length())+commands[i].getAttribute("id")); } file.println(""); //blank line XMLElement devices[] = xml.getChildren("devices/device"); for(i = 0; i<devices.length;i++){ file.println("#define "+ devices[i].getAttribute("code")+spaces(20 - devices[i].getAttribute("code").length())+devices[i].getAttribute("id")); } file.flush(); // Write the remaining data file.close(); exit(); }And here is the Arduino Code the script above generated for me
#define CMD_ERROR 0x00 #define CMD_VERSION 0x01 #define CMD_BATTERYLEVEL 0x03 #define CMD_PING 0x3E #define CMD_PONG 0xE3 #define CMD_ACK 0x11 #define CMD_SETNODEID 0x21 #define CMD_GETNODEID 0x21 #define CMD_SETNODEID 0x22 #define CMD_GETPLUG 0x23 #define CMD_SETPLUG 0x24 #define CMD_AUTOSENDSTART 0xC1 #define CMD_AUTOSENDSTOP 0xC2 #define CMD_GETVALUE 0xD0 #define CMD_SETVALUE 0xD1 #define CMD_ON 0xE0 #define CMD_OFF 0xE1 #define CMD_LEVEL 0xE2 #define CMD_BYTE 0xF0 #define CMD_STRING 0xF1 #define CMD_INT 0xF2 #define CMD_FLOAT 0xF3 #define CMD_LONG 0xF4 #define DVC_TMP37 0x01 #define DVC_LIGHT 0x02 #define DVC_SHT21 0x03 #define DVC_DOORCONTACT 0x04 #define DVC_WINDOWCONTACT 0x05 #define DVC_MOTION 0x06 #define DVC_2LINEDISPLAY 0x07 #define DVC_POWER30 0x08 #define DVC_POWER100 0x09 #define DVC_SMARTOUTLET 0x10 #define DVC_RGBLIGHT 0x11 #define DVC_sound 0x12 #define DVC_SWITCH 0x13 #define DVC_STATUSLED 0x14 #define DVC_BUZZER 0x15