Electric Imp ▬ the internet of things ▬ AM2303

Sinds kort heb ik een Electric Imp met een Arduino-breakout board.

Mijn doel een Luchtvochtigheidssensor AM2303 online te krijgen slaagde door de techniek die anderen hebben neergelegd. Ik ben onder de indruk van het gemak waarmee dit lukte.
Hier de setup op mijn buro. Zit alleen vast aan 12 volt stroom:
Electric Imp Arduino AM2303 COSM

En hier mijn eerste real-time & online output op www.cosm.com:

Als je na aanmelden en inloggen op www.cosm.com op ‘phuin’ zoekt, krijg je als het goed is ‘RH% kantoor’ te zien. Die moet je selecteren. Dat is real-time & online de luchtvochtigheid in mijn kantoor. Je kunt je data natuurlijk ook verborgen houden. COSM werkt als een youtube, maar dan voor data en bovenal dus real-time. Kan niet beter.

De wisselingen in luchtvochtigheid komen door mijn ademhaling. De schaal past zich automatisch aan. Hier is hij heel smal tussen de 37 en 43 % RH.

Wat overigens SUPER is, is dat je op de site van COSM triggers kunt instellen. Dit kan ook via TWITTER. Dus dan krijg je een tweet als de temperatuur bij de buizen onder je huis onder het vriespunt dalen! Enzo.

De onderstaande arduino-Sketch is een samenvoegsel van een eerder sketch en eigenlijk niets anders dan een Seriele.print naar mijn Electric Imp.

#include <SoftwareSerial.h>

SoftwareSerial impSerial(8, 9); // RX on 8, TX on 9

//http://sheepdogguides.som/arduino/ar3ne1humDHT11.htm
//http://huinink.info/luchtvochtigheid-am2303-humidity-and-temperature-sensor/

#define DHT11_PIN 1      // ADC1...

byte read_dht11_dat()

{
byte i = 0;
byte result=0;
for(i=0; i< 8; i++){
while(!(PINC & _BV(DHT11_PIN)));
delayMicroseconds(30);

if(PINC & _BV(DHT11_PIN))
result |=(1<<(7-i));
while((PINC & _BV(DHT11_PIN)));
}
return result;
}

void setup()
{
Serial.begin(19200);
impSerial.begin(19200);
DDRC |= _BV(DHT11_PIN);
PORTC |= _BV(DHT11_PIN);
delay(300);
Serial.println("Humidity and temperature\n\n");
delay(700);
}

void loop()
{
byte dht11_dat[5];
byte dht11_in;
byte i;
PORTC &= ~_BV(DHT11_PIN);
delay(18);
delay(5);
PORTC |= _BV(DHT11_PIN);
delayMicroseconds(40);
DDRC &= ~_BV(DHT11_PIN);
delayMicroseconds(40);
dht11_in = PINC & _BV(DHT11_PIN);
if(dht11_in){
Serial.println("dht11 start condition 1 not met");
return;
}
delayMicroseconds(80);
dht11_in = PINC & _BV(DHT11_PIN);
if(!dht11_in){
Serial.println("dht11 start condition 2 not met");
return;
}
delayMicroseconds(80);
for (i=0; i<5; i++)
dht11_dat[i] = read_dht11_dat();
DDRC |= _BV(DHT11_PIN);
PORTC |= _BV(DHT11_PIN);
byte dht11_check_sum = dht11_dat[0]+dht11_dat[1]+dht11_dat[2]+dht11_dat[3];
if(dht11_dat[4]!= dht11_check_sum) {
Serial.println("DHT11 checksum error");
}
float rh = ((dht11_dat[0]*0x100)+dht11_dat[1])/10.24;
float tmp = ((dht11_dat[2]*0x100)+dht11_dat[3])/10.24;

impSerial.write(rh);

Serial.print("Current humdity = ");
Serial.print(rh);
Serial.print("%  ");
Serial.print("temperature = ");
Serial.print(tmp);
Serial.println("C  ");
delay(800);
}

Het online krijgen van de electric imp was via de mobile telefoon haast magie. via een knipper sequentie werd de Electric Imp gevoed met de toegangscodes voor mijn WIFI.

Vervolgens verscheen mijn “Arduino/E-Imp” in de planner op electricimp.com. Hierin heb ik onderstaande code ( copy-paste van www.sparkfun.com – tutorial over de Electric Imp ) in de Electric Imp gezet.

// Transmit data between UART and Input/OutputPorts on the impee
// by: Jim Lindblom
//     SparkFun Electronics
// date: September 26, 2012
// license: BeerWare
//          Please use, reuse, and modify this code as you need.
//          We hope it saves you some time, or helps you learn something!
//          If you find it handy, and we meet some day, you can buy me a beer or iced tea in return.

local rxLEDToggle = 1;  // These variables keep track of rx/tx LED toggling status
local txLEDToggle = 1;

// impeeIn will override the InputPort class. 
// Whenever data is received to the impee, we'll jump into the set(c) function defined within
class impeeIn extends InputPort
{
    name = "UART Out";
    type = "string";

    // This function takes whatever character was sent to the impee
    // and sends it out over the UART5/7. We'll also toggle the txLed
    function set(c)
    {
        hardware.uart57.write("kkkkkkk");
        toggleRxLED();
    }
}

local impeeInput = impeeIn();  // assign impeeIn class to the impeeInput
local impeeOutput = OutputPort("UART In", "string");  // set impeeOutput as a string

function initUart()
{
    hardware.configure(UART_57);    // Using UART on pins 5 and 7
    hardware.uart57.configure(19200, 8, PARITY_NONE, 1, NO_CTSRTS); // 19200 baud worked well, no parity, 1 stop bit, 8 data bits
}

function initLEDs()
{
    // LEDs are on pins 8 and 9 on the imp Shield
    // They're both active low, so writing the pin a 1 will turn the LED off
    hardware.pin8.configure(DIGITAL_OUT_OD_PULLUP);
    hardware.pin9.configure(DIGITAL_OUT_OD_PULLUP);
    hardware.pin8.write(1);
    hardware.pin9.write(1);
}

// This function turns an LED on/off quickly on pin 9.
// It first turns the LED on, then calls itself again in 50ms to turn the LED off
function toggleTxLED()
{
    txLEDToggle = txLEDToggle?0:1;    // toggle the txLEDtoggle variable
    if (!txLEDToggle)
    {
        imp.wakeup(0.05, toggleTxLED.bindenv(this)); // if we're turning the LED on, set a timer to call this function again (to turn the LED off)
    }
    hardware.pin9.write(txLEDToggle);  // TX LED is on pin 8 (active-low)
}

// This function turns an LED on/off quickly on pin 8.
// It first turns the LED on, then calls itself again in 50ms to turn the LED off
function toggleRxLED()
{
    rxLEDToggle = rxLEDToggle?0:1;    // toggle the rxLEDtoggle variable
    if (!rxLEDToggle)
    {
        imp.wakeup(0.05, toggleRxLED.bindenv(this)); // if we're turning the LED on, set a timer to call this function again (to turn the LED off)
    }
    hardware.pin8.write(rxLEDToggle);   // RX LED is on pin 8 (active-low)
}

// This is our UART polling function. We'll call it once at the beginning of the program,
// then it calls itself every 10us. If there is data in the UART57 buffer, this will read
// as much of it as it can, and send it out of the impee's outputPort.
function pollUart()
{
    imp.wakeup(0.00001, pollUart.bindenv(this));    // schedule the next poll in 10us

    local byte = hardware.uart57.read();    // read the UART buffer
    // This will return -1 if there is no data to be read.
    while (byte != -1)  // otherwise, we keep reading until there is no data to be read.
    {
        //  server.log(format("%c", byte)); // send the character out to the server log. Optional, great for debugging
        impeeOutput.set(byte);  // send the valid character out the impee's outputPort
        byte = hardware.uart57.read();  // read from the UART buffer again (not sure if it's a valid character yet)
        toggleTxLED();  // Toggle the TX LED
    }
}

// This is where our program actually starts! Previous stuff was all function and variable declaration.
// This'll configure our impee. It's name is "UartCrossAir", and it has both an input and output to be connected:
imp.configure("UartCrossAir", [impeeInput], [impeeOutput]);
initUart(); // Initialize the UART, called just once
initLEDs(); // Initialize the LEDs, called just once
pollUart(); // start the UART polling, this function continues to call itself
// From here, two main functions are at play:
//      1. We'll be calling pollUart every 10us. If data is sent from the UART, we'll send out out of the impee.
//      2. If data is sent into the impee, we'll jump into the set function in the InputPort.
//
// The end

Daarna ben ik naar de website van www.cosm.com gegaan. Na aanmelden kreeg ik (of kon ik aanmaken) een

  • API key
  • feed ID
  • datastream ID

Vervolgens kon ik in de planner op de www.electricalimp.com – site deze informatie invoeren in een eenvoudig bij te pluggen module (groen in onderstaande plaatje. Blauw is mijn ElectricImp, die weer aan mijn Arduino hangt via UART / seriele communicatie met Tx en Rx enzo).

Tot mijn grote vreugde verscheen op COSM.com een life-update van mijn AM2303 sensor. Het bewijs staat aan het begin van deze post.

 

 

2 Responses to Electric Imp ▬ the internet of things ▬ AM2303

  1. tayo says:

    Thank you for sharing this guide and the code.
    I am new to programming but i have tried to compile and upload the arduino code to Arduino Uno with errors such as softwareserial not define.
    Can you please provide text file of the codes that worked.

    Thank you.

  2. tayo says:

    Bedankt voor het delen van deze handleiding en de code.
    Ik ben nieuw in de programmering, maar ik heb geprobeerd om te compileren en uploaden van de Arduino code te Arduino Uno met fouten zoals SoftwareSerial niet definiëren.
    Kunt u bieden tekstbestand van de codes die werkte.

    Dank u.

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>