Vis indlæg

Denne sektion tillader dig at se alle indlæg oprettet af dette medlem. Bemærk at du kun kan se indlæg der er oprettet i områder du i øjeblikket har adgang til.


Beskeder - salomon

Sider: [1] 2
1
Arduino & Lign. / Sv: Fjernstyring af stikkontakter
« Dato: Marts 29, 2015, 21:16:33 »
Hej,

Jeg har lavet en artikel om det her: http://elektronik-forum.dk/index.php?topic=986&asarticle

2
Arduino & Lign. / Sv: nrf24l01 + Arduino
« Dato: Marts 29, 2015, 21:14:11 »
Hej Julle (Klaus),

Bedre sent end aldrig. Se min artikel: http://elektronik-forum.dk/index.php?topic=987&asarticle

3
Artikler / Arduino MEGA + Ethernet Shield + NRF24l01 + RF433MHZ
« Dato: Marts 29, 2015, 12:33:03 »

Som nævnt i et par af mine andre artikler har jeg i mit sommerhus nogle temperatur-/luftfugtighedsfølere samt fjernbetjente stikkontakter styret vha. en Arduino MEGA webserver.

I denne artikel vil jeg gennemgå, hvordan jeg har lavet det.
Det bygger på RF24Network lavet af maniacbug. Se mere om maniacbugs projekter her: https://maniacbug.wordpress.com/

Jeg har brugt:

1 stk. Arduino MEGA
1 stk. Arduino Ethernet Shield (med 11x11x5.5m Aluminum Heatsink på)
1 stk. Arduino Mini Pro 5v
1 stk. 78L33 3.3V Voltage Regulator (Bruges på Mini Pro 5V for at få 3,3V til NRF24l01 modulet)
2 stk. Arduino Mini Pro 3,3V
4 stk. NRF24l01+  (VIGTIGT: må kun få 3,3V på VCC)
1 stk. RF433MHZ
3 stk. 4K7 modstande
2 stk. DS18B20
1 stk. DHT22
1 stk. FT232RL USB To Serial (til programmering af mini'erne)

Arduino IDE samt følgende library's:

RF24Network https://github.com/maniacbug/RF24Network (til mini pro'erne)
SocketSwitch https://github.com/mortensalomon/Socket_Switch
iBoardRF24/iBoardRF24Network https://github.com/andykarpov (RF24Network på andre pins end standard SPI)
digitalWriteFast http://code.google.com/p/digitalwritefast/downloads/list
Ethernet
SPI
OneWire
DallasTemperature
DHT22


Jeg vil kun løst beskrive hvordan det sættes sammen:

MEGA'en:

Sæt ethernet shield på (har nogle gange været nødt til at tage det af ved upload af programmet)

Da ethernet shield'et bruger SPI er det ikke muligt også at sætte en NRF24l01+ på, idet den også skal bruge SPI.
Man burde kunne sætte flere devices på SPI, men efter hvad jeg har kunnet læse mig til er der en fejl i ethernet library'et der gør det umuligt.
For at omgå dette kan/skal man bruge iBoardRF24Network der bruger alternativ SPI.

Sæt NRF24l01+ modulet på følgende pins:

cepin 3, cspin 4, mosi_pin 6, miso_pin 7, sck_pin 5, irq_pin 8

RF433MHZ sender DATA pin sættes på pin 30

Pro'erne:

God side, der kan bruges, når man skal sætte en NRF24l01+ på en arduino: https://arduino-info.wikispaces.com/Nrf24L01-2.4GHz-HowTo
NRF24l01 sættes på som vist herunder på en Arduino Nano (husk 3,3V regulator på mini pro 5V'en, da der ikke er 3,3V VCC):


4K7 pullup modstand på DHT22 og DS18B20


Og så til MEGA webserver koden:

Kode:
// 1: RF24 ds18b20
// 2: RF24 dht22


#include <digitalWriteFast.h>
#include <iBoardRF24Network.h>
#include <iBoardRF24.h>
#include <SPI.h>
#include <Ethernet.h>
#include <Socketswitch.h>

#define NODES 3

Socketswitch mySwitch(30);


// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(10, 10, 10, 178);

// Initialize the Ethernet server library
// with the IP address and port you want to use
// (port 80 is default for HTTP):
EthernetServer server(80);

// (cepin 3, cspin 4, mosi_pin 6, miso_pin 7, sck_pin 5, irq_pin 8)
iBoardRF24 radio(3, 8, 5, 6, 7, 2);
iBoardRF24Network network(radio);

// Address of our node
const uint16_t this_node = 0;

struct payload_t 
{
  unsigned long ms;
  unsigned long counter;
  byte device_type;
  float humidity;
  float temperature;
  long voltage;
};

struct sensors_t
{
  unsigned long ms;
  unsigned long counter;
  byte device_type;
  float humidity;
  float temperature;
  long voltage;
  unsigned long local_ms;
};

struct sensors_t sensors[NODES];

String readString;

void setup() {
  // Initialize array which holds the data from nodes
  for (int i = 0; i < NODES; i++) {
    sensors[i].device_type = 0;
    sensors[i].humidity = 0;
    sensors[i].temperature = 0;
    sensors[i].voltage = 0;
    sensors[i].counter = 0;
    sensors[i].ms = 0;
    sensors[i].local_ms = 0;
  }

  // start the Ethernet connection and the server:
  Ethernet.begin(mac, ip);
  server.begin();

  mySwitch.setDevice(0x34FCFF);

  SPI.begin();
  radio.begin();
  network.begin(/*channel*/ 93, /*node address*/ this_node);
}


void socketSwicth(int id, int stat) {
  switch (id) {
    case 0:
      if (stat == 1) {
        mySwitch.channelOn(0);
      } else {
        mySwitch.channelOff(0);
      }
      break;
    case 1:
      if (stat == 1) {
        mySwitch.channelOn(1);
      } else {
        mySwitch.channelOff(1);
      }
      break;
    case 2:
      if (stat == 1) {
        mySwitch.channelOn(2);
      } else {
        mySwitch.channelOff(2);
      }
      break;
    case 9:
      if (stat == 1) {
        mySwitch.groupOn();
      } else {
        mySwitch.groupOff();
      }
      break;
  }
}

void loop() {

  const unsigned long tenMinutes = 10 * 60 * 1000UL;
  static unsigned long lastSampleTime = 0 - tenMinutes;  // initialize such that a reading is due the first time through loop()

  unsigned long now = millis();
  if (now - lastSampleTime >= tenMinutes)
  {
    lastSampleTime += tenMinutes;
  }

  // Pump the network regularly
  network.update();

  // Is there anything ready for us?
  while ( network.available() )
  {
    // If so, grab it and print it out
    RF24NetworkHeader header;
    payload_t payload;
    network.read(header, &payload, sizeof(payload));
    sensors[header.from_node - 2].device_type = payload.device_type;
    sensors[header.from_node - 2].humidity = payload.humidity;
    sensors[header.from_node - 2].temperature = payload.temperature;
    sensors[header.from_node - 2].voltage = payload.voltage;
    sensors[header.from_node - 2].counter = payload.counter;
    sensors[header.from_node - 2].ms = payload.ms;
    sensors[header.from_node - 2].local_ms = millis();
  }

  // listen for incoming clients
  readString = "";
  EthernetClient client = server.available();
  if (client) {
    // an http request ends with a blank line
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        if (readString.length() < 100) {
          readString += c;
        }
        // if you've gotten to the end of the line (received a newline
        // character) and the line is blank, the http request has ended,
        // so you can send a reply
        if (c == '\n' && currentLineIsBlank) {
          // send a standard http response header
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println("Connection: close");  // the connection will be closed after completion of the response
          //   client.println("Refresh: 5");  // refresh the page automatically every 5 sec
          client.println();
          client.println("<!DOCTYPE HTML>");
          client.println("<html><head><style>button { width: 400px;  height: 100px; font-size:48px;  }</style></head><title>Salomon Switch server (Remote: ??)</title>");
          if (readString.indexOf("status=yes") > 0) {

            client.println("<center><h1>Status:</h1><br><table>");
            for (int i = 0; i < NODES; i++) {
              client.print("<tr><td>Node:</td><td>");
              client.print(i + 2);
              client.print("</td><td>Device type:</td><td>");
              client.print(sensors[i].device_type);
              client.print("</td><td>Humidity:</td><td>");
              client.print(sensors[i].humidity);
              client.print("</td><td>Temperature:</td><td>");
              client.print(sensors[i].temperature);
              client.print("</td><td>Voltage:</td><td>");
              client.print(sensors[i].voltage);
              client.print("</td><td>Packet #");
              client.print(sensors[i].counter);
              client.print(" at ");
              client.print(sensors[i].ms);
              client.print("</td><td>Received:");
              client.print(sensors[i].local_ms);
              client.print("</td></tr>");
            }
            client.println("</table><br><br><a href=/?switch=yes>Back to control</a></center>");
          } else {
            if (readString.indexOf("switch=yes") > 0) {
              client.println("<center><h1>Control:</h1><br><form method=get><input type=hidden name=switch value=yes><button name=sw type=submit value=01>SW1 ON</button> <button name=sw type=submit value=00>SW1 OFF</button><br><button name=sw type=submit value=11>SW2 ON</button> <button name=sw type=submit value=10>SW2 OFF</button><br><button name=sw type=submit value=21>SW3 ON</button> <button name=sw type=submit value=20>SW3 OFF</button><br><button name=sw type=submit value=91>SWG ON</button> <button name=sw type=submit value=90>SWG OFF</button></form><br><a href=/?status=yes>Status</a></center>");
              int pos = readString.indexOf("sw=");

              if (pos > 0) {
                socketSwicth(readString.substring(pos + 3, pos + 4).toInt(), readString.substring(pos + 4, pos + 5).toInt());
              }
              client.println("<br />");
            }
          }
          client.println("<p><center><h1>Dansk Elektronik Forum's artikel konkurrence  </h1><br><a href=http://elektronik-forum.dk/index.php?topic=987&asarticle target=_new>Dansk Elektronik Forum artikel</a></center></html>");
          break;
        }

        if (c == '\n') {
          // you're starting a new line
          currentLineIsBlank = true;
        }
        else if (c != '\r') {
          // you've gotten a character on the current line
          currentLineIsBlank = false;
        }
      }
    }
    // give the web browser time to receive the data
    delay(1);
    // close the connection:
    client.stop();
  }
}

Sæt MEGA'en til strøm og netværk. Du kan fange status siden via. http://din ip/status=yes



Og stikkontakt styring via. http://din ip/switch=yes




Og koden til DS18B20'erne (low power software version - husk at skifte this_node):

Kode:
#include <RF24Network.h>
#include <RF24.h>
#include <SPI.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include "LowPower.h"

#define ONE_WIRE_BUS 7
#define TEMPERATURE_PRECISION 12


// nRF24L01(+) radio attached using Getting Started board
RF24 radio(9, 10);

// Network uses that radio
RF24Network network(radio);

// Address of our node MAX 6 Nodes
const uint16_t this_node = 3;


// Address of the other node
const uint16_t other_node = 0;


// 1: ds18b20
// 2: dht22

const byte this_type = 1;


// How often to send 'hello world to the other unit
const unsigned long interval = 2000; // 2000; //ms

// When did we last send?
unsigned long last_sent;

// How many have we sent already
unsigned long packets_sent;

// Temp
// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);

// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);

DeviceAddress termo;

float tempC;

// Structure of our payload
struct payload_t
{
  unsigned long ms;
  unsigned long counter;
  byte device_type;
  float humidity;
  float temperature;
  long voltage;
};

boolean serial = false;
boolean device_found;

long readVcc() {
  long result;
  // Read 1.1V reference against AVcc
  ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
  delay(2); // Wait for Vref to settle
  ADCSRA |= _BV(ADSC); // Convert
  while (bit_is_set(ADCSRA, ADSC));
  result = ADCL;
  result |= ADCH << 8;
  result = 1125300L / result; // Back-calculate AVcc in mV

  return result;
}

void sleepTenMinutes()
{
  for (int i = 0; i < 75; i++) {
    LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF);
  }
}


void setup(void)
{
  if (serial) {
    Serial.begin(57600);
    Serial.println("RF24Network/NODE5_tx/");

  }
  pinMode(8, OUTPUT);
  SPI.begin();
  radio.begin();
  network.begin(/*channel*/ 93, /*node address*/ this_node);
  sensors.begin();
  device_found = sensors.getAddress(termo, 0);
  if (device_found) sensors.setResolution(termo, TEMPERATURE_PRECISION);
  if (serial) {
    Serial.print("Device found: ");
    Serial.println(device_found);
  }

}

void loop(void)
{

  // Pump the network regularly
  network.update();

  // If it's time to send a message, send it!
  //  unsigned long now = millis();
  //  if ( now - last_sent >= interval  ) {
  if (device_found) {
    sensors.requestTemperatures();
    tempC = sensors.getTempC(termo);
  } else {
    device_found = sensors.getAddress(termo, 0);
    if (device_found) sensors.setResolution(termo, TEMPERATURE_PRECISION);
    tempC = -123;
  }
  byte hum = 0;
  //   last_sent = now;


  if (serial)   Serial.print("Sending...");
  payload_t payload = { millis(), packets_sent++, this_type, hum, tempC, readVcc()};
  RF24NetworkHeader header(/*to node*/ other_node);
  bool ok = network.write(header, &payload, sizeof(payload));

  if (ok) {
    if (serial) Serial.println("ok.");
  } else {
    if (serial) Serial.println("failed.");
    digitalWrite(8, HIGH);   // sets the LED on
    delay(1000);                  // waits for a second
    digitalWrite(8, LOW);    // sets the LED off

  }

  radio.powerDown();
  sleepTenMinutes();
}

Der skal sættes en diode via. en modstand på pin 8. Den lyser 1 sek., når afsendelse fejler.


Og koden til DHT22'eren:

Kode:
#include <RF24Network.h>
#include <RF24.h>
#include <SPI.h>
#include "LowPower.h"
#include <dht.h>

dht DHT;

// nRF24L01(+) radio attached using Getting Started board
RF24 radio(9, 10);

// Network uses that radio
RF24Network network(radio);

// Address of our node MAX 6 Nodes
const uint16_t this_node = 2;


// Address of the other node
const uint16_t other_node = 0;


// 1: ds18b20
// 2: dht22

const byte this_type = 2;

// How many have we sent already
unsigned long packets_sent;

// Structure of our payload
struct payload_t
{
  unsigned long ms;
  unsigned long counter;
  byte device_type;
  float humidity;
  float temperature;
  long voltage;
};

boolean serial = true;

float humidity;
float temperature;


long readVcc() {
  long result;
  // Read 1.1V reference against AVcc
  ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
  delay(2); // Wait for Vref to settle
  ADCSRA |= _BV(ADSC); // Convert
  while (bit_is_set(ADCSRA, ADSC));
  result = ADCL;
  result |= ADCH << 8;
  result = 1125300L / result; // Back-calculate AVcc in mV

  return result;
}

void sleepFiveMinutes()
{
  for (int i = 0; i < 38; i++) {
    LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF);
  }
}


void setup(void)
{
  if (serial) {
    Serial.begin(57600);
    Serial.println("RF24Network/NODE2_tx/");
  }
  pinMode(8, OUTPUT);
  SPI.begin();
  radio.begin();
  network.begin(/*channel*/ 93, /*node address*/ this_node);
}

void loop(void)
{

  // Pump the network regularly
  network.update();

  uint32_t start = micros();
  int chk = DHT.read22(3);
  uint32_t stop = micros();

  switch (chk)
  {
    case DHTLIB_OK:
      if (serial) Serial.print("OK,\t");
      if (serial) {
        Serial.print(DHT.humidity, 2);
        Serial.print(",\t");
        Serial.println(DHT.temperature, 2);
      }
      humidity = DHT.humidity;
      temperature = DHT.temperature;
      break;
    case DHTLIB_ERROR_CHECKSUM:
      if (serial) Serial.print("Checksum error,\t");
      humidity = -123;
      temperature = -123;
      break;
    case DHTLIB_ERROR_TIMEOUT:
      if (serial) Serial.print("Time out error,\t");
      humidity = -123;
      temperature = -123;

      break;
    default:
      if (serial) Serial.print("Unknown error,\t");
      humidity = -123;
      temperature = -123;

      break;
  }

  if (serial)   Serial.print("Sending...");
  payload_t payload = { millis(), packets_sent++, this_type, humidity, temperature, readVcc()};
  RF24NetworkHeader header(/*to node*/ other_node);
  bool ok = network.write(header, &payload, sizeof(payload));

  if (ok) {
    if (serial) Serial.println("ok.");
  } else {
    if (serial) Serial.println("failed.");
    digitalWrite(8, HIGH);
    delay(1000);
    digitalWrite(8, LOW);

  }
  sleepFiveMinutes();
}

Der skal sættes en diode via. en modstand på pin 8. Den lyser 1 sek., når afsendelse fejler.


NRF24l01 modulerne kan kun "snakke" 6 stk. indbyrdes, så man bliver nødt til at lave en router, hvis man skal have flere en 5 sensorer på.

Jeg håber, at den kan bruges og inspirere til leg med Arduino.

P.S.
Jeg har snydt lidt, men det burde alt sammen virke (Dvs. at jeg ikke har testet pro'erne).
Jeg har nemlig kun 3 stk. hjemmelavet low power atmega328p (8 mhz internt) som kører på 2 stk. AA batterier.

4
Artikler / Fjernstyring af RF 433mhz stikkontakter
« Dato: Marts 28, 2015, 16:28:35 »

Hej igen,

I mit sommerhus havde jeg behov for, at kunne tænde for 3 el-radiatorer hjemmefra,
men jeg kunne kun finde 1000 Watts fjernbetjente stikkontakter og mine el-radiatorer var alle over 1500 Watt.
Jeg fandt så nogle 2300 Watts selvlærende stikkontaker hos JULA i Sverige (se billede).



Jeg har senere fundet ud af, at man kan købe dem i Danmark hos Komplett og Dustin under navnet PROOVE.

Jeg kunne ikke finde noget Arduino Library til at styre dem, så jeg måtte i gang med en hjemmelavet RF sniffer. Man kan finde mange eksempler på nettet på, hvordan en sniffer laves. Min var lavet med en RF433 modtager, et par modstande og et mini jack stik til lydindgangen på min PC. Jeg brugte Audacity til at sniffe en fjernbetjening (se billede).



Det lykkedes at afkode en fjernbetjening, dog uden at gennemskue protokollen, men det virkede.
Min oprindelige kode så således ud (er kun et udsnit fra min MEGA webserver):

Kode:
#define RF_DATA_PIN 30
#define SHORT_DELAY 250 
#define LONG_DELAY  (5*SHORT_DELAY)
#define START_DELAY  (10*SHORT_DELAY)
#define END_DELAY    (40*SHORT_DELAY)
#define TOTAL_DELAY (8*SHORT_DELAY)
#define SYNC_DELAY  (29*SHORT_DELAY)

void rf_send(char* sCodeWord) {

  for (int nRepeat=0; nRepeat<4; nRepeat++) {
  int i = 0;
  while (sCodeWord[i] != '\0') {
    switch(sCodeWord[i]) {
      case 'E':
        digitalWrite(RF_DATA_PIN, HIGH);
        delayMicroseconds(SHORT_DELAY);
        digitalWrite(RF_DATA_PIN, LOW);
        delayMicroseconds(END_DELAY);
        break;
      case 'S':
        digitalWrite(RF_DATA_PIN, HIGH);
        delayMicroseconds(SHORT_DELAY);
        digitalWrite(RF_DATA_PIN, LOW);
        delayMicroseconds(START_DELAY);
        break;
      case '1':
        digitalWrite(RF_DATA_PIN, HIGH);
        delayMicroseconds(SHORT_DELAY);
        digitalWrite(RF_DATA_PIN, LOW);
        delayMicroseconds(SHORT_DELAY);
        break;
        case '0':
          digitalWrite(RF_DATA_PIN, HIGH);
          delayMicroseconds(SHORT_DELAY);
          digitalWrite(RF_DATA_PIN, LOW);
          delayMicroseconds(LONG_DELAY);
        break;
      }
      i++;
    } 
    delayMicroseconds(SYNC_DELAY);
  }   
}

void socketSwicth(int id, int stat) {
  Serial.print("ID: ");
  Serial.println(id);
  Serial.print("Stat: ");
  Serial.println(stat);
   switch(id) {
     case 0:
       if (stat==1) {
         rf_send("S1001101001011010100110011001010101010101010101010110100101010101E");
       } else {
         rf_send("S1001101001011010100110011001010101010101010101010110101001010101E");
       }
       break;
     case 1:
       if (stat==1) {
         rf_send("S1001101001011010100110011001010101010101010101010110100101010110E");
       } else {
         rf_send("S1001101001011010100110011001010101010101010101010110101001010110E");
       }
       break;
     case 2:
       if (stat==1) {
         rf_send("S1001101001011010100110011001010101010101010101010110100101011001E");
       } else {
         rf_send("S1001101001011010100110011001010101010101010101010110101001011001E");
       }
       break;
/*     case 3:
       if (stat==1) {
         rf_send("S1001101001011010100110011001010101010101010101010110100101010110E");
       } else {
         rf_send("S1001101001011010100110011001010101010101010101010110101001010110E");
       }
       break; */
     case 9:
       if (stat==1) {
         rf_send("S1001101001011010100110011001010101010101010101010110010101010101E");
       } else {
         rf_send("S1001101001011010100110011001010101010101010101010110011001010101E");
       }
     break;
   }
}


Senere faldt jeg over et Svensk site, hvor protokollen var beskrevet og der var endda et eksempel på kode.

Ud fra protokolspecifikationen er det lykkedes mig, at lave et library til Arduino (kan downloades på https://github.com/mortensalomon/Socket_Switch).

Herunder kan du finde et eksempel på hvordan det virker.

Du skal bruge:

6 stk. 10K modstande
6 stk. push buttons
En RF 433 mhz sender
En håndfuld jumper kabler.

Jeg køber alt i Kina via. ebay.com

Det skal sættes sammen som på fritzing tegningen nedenfor:



Koden til at styre det hele:

Kode:
#include <Socketswitch.h>

Socketswitch mySwitch(12);

void setup() {
  // Set device base address (0x0 - 0xFFFFFF). Device is a group of 16 channels (16 RF Socket Switches)
  mySwitch.setDevice(0x34FCFF);
  pinMode(13, OUTPUT);
  digitalWrite(13, HIGH); // VCC til RF modulet
  pinMode(2, INPUT);
  pinMode(3, INPUT);
  pinMode(4, INPUT);
  pinMode(5, INPUT);
  pinMode(6, INPUT);
  pinMode(7, INPUT);
  Serial.begin(9600);
}

void loop() {
  // Device channel 0-15
  if (digitalRead(2) == HIGH) {
    mySwitch.channelOn(0);
    Serial.println("0 on");
  } else if (digitalRead(3) == HIGH) {
    mySwitch.channelOff(0);
    Serial.println("0 off");
  } else if (digitalRead(4) == HIGH) {
    Serial.println("1 on");
    mySwitch.channelOn(1);
  } else if (digitalRead(5) == HIGH) {
    Serial.println("1 off");
    mySwitch.channelOff(1);
  } else if (digitalRead(6) == HIGH) {
    mySwitch.groupOn();
    Serial.println("G on");
  } else if (digitalRead(7) == HIGH) {
    Serial.println("G off");
    mySwitch.groupOff();
  }
}

Eksempel på, hvad det kan bruges til:

I mit sommerhus har jeg en Arduino MEGA med et ethernet shield, hvor jeg har programmeret en webserver, så jeg kan tænde/slukke stikkontakterne hjemmefra.
   
På MEGAen sidder også et 2.4ghz modul som får temperatur/luftfugtighed (DS18B20 og DHT22) fra 4 Arduino mini pro'er (RF24Network).
Udover de 4 trådløse følere har jeg 7 følere på kabel (Se billeder).




Følerne er indsat i patch kabel samlinger (billede nedenfor) og er derfor nemme at tilpasse i længden med patch kabler af forskellig længde. DS18B20'erne bruger de samme 3 ledninger (+/- /data) fra start til slut via. 1-wire.



Fremtiden:

Når jeg får tid, vil jeg tilføje mulighed for, i Arduino Library'et, at afkode (via. en RF 433mhz modtager) signalet fra en fjernbetjening.

5
Artikler / Lad der blive lys
« Dato: Marts 23, 2015, 21:52:34 »

Jeg har et sommerhus 750km nord fra, hvor jeg bor. Der kan blive koldt om vinteren.
Når det er rigtig koldt kan der blive -40 grader. Det er derfor vigtigt, at der er strøm på huset, da det er opvarmet med el-radiatorer.
Selvom jeg tømmer vandet af rørene, ligger der stadig lidt tilbage, som kan fryse, hvilket får rørene til at sprænge. Det er sket et par gange.
Til og med er vandmåleren sprængt en gang. Jeg har selvfølgelig både isoleret rørene samt vandmåleren i kælderen og sat varmekabler på. Varmekabler kræver dog også strøm.

Jeg har en linux server og hjemmelavet temperaturovervågning/varmestyring i huset. Det sker dog, at jeg mister forbindelsen til huset.

I januar mistede jeg forbindelsen og jeg bad mine søde genboer, der bor overfor, at undersøge om der var strøm på huset.
Efter at de (manden i huset) havde konstateret at der var strøm på huset, spurgte de mig forståeligt nok om jeg ikke kunne sætte en lampe i vinduet, så de fra deres hus kan se om der er strøm på mit.
Genborene er ikke helt unge. Manden er 83 år og da jeg bad dem om, at se om der var strøm på huset, lå der godt og vel en meter sne hele vejen ind til huset, så det er vel et rimeligt krav, det med lyset i vinduet.

Jeg kunne selvfølgelig have sat en lampe med timer i vinduet, men det virkede lidt kedeligt, så derfor fik jeg følgende plan:

Vi skal bruge:

1  stk. Arduino med tilhørende USB kabel
1  stk. breadboard
1  stk. RGB led (Common Anode)
1  stk. lys følsom modstand (photoresistor)
1  stk. DS18B20
1  stk. 4k7 ohm modstand
1  stk. 10K ohm modstand
3  stk. 220 ohm modstand
1  stk. 0,96" 128x64 oled skærm
12 stk. jumper kabler

Derudover skal der bruges en PC med USB og Arduino IDE (http://arduino.cc/en/Main/Software) installeret.
Følgende libraries skal også installeres: https://github.com/milesburton/Arduino-Temperature-Control-Library og https://github.com/stanleyhuangyc/MultiLCD


Det hele samles således (har vedhæftet nogle billeder):

Power:
GND og +5v fra arduino'en forbindes til -/+ på breadboard'et

RGB Led:
Anode forbindes til pin 8 på arduino'en og på hver RGB ben forbindes en 220 ohm's modstand som forbindes til arduino'en (pin 9=rød,pin 10=grøn, pin 11=blå)



DS18B20:
GND forbindes til - og VCC til +. Sæt en 4k7  modstand mellem + og DQ. DQ forbindes til pin 13 på arduino'en



Photoresistor:
Det ene ben forbindes til +. Det andet ben forbindes til en 10K modstand og til arduino'en pin A0. Det andet ben af modstanden forbindes til -

OLED 64x128 display:
GND forbindes til - og VCC til +. SDA forbindes til SDA og SCL forbindes til SCL på arduino'en.




Og så til koden:

Kode:
#include <MicroLCD.h>
#include <Wire.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <Math.h>

#define ONE_WIRE_BUS 13
#define TEMPERATURE_PRECISION 12
#define LIGHT  A0
#define OnOff 8
#define YELLOW  0
#define RED  9
#define GREEN 10
#define BLUE 11
#define OFF 0
#define ON 1

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
LCD_SSD1306 lcd;
DeviceAddress termo;

void setup() {
  sensors.begin();
  lcd.begin();
  pinMode(OnOff, OUTPUT);
  pinMode(RED, OUTPUT);
  pinMode(GREEN, OUTPUT);
  pinMode(BLUE, OUTPUT);
}

void loop() {
  if (analogRead(LIGHT) < 350) {
    unsigned long timer = millis();
    int C = 0;
    float tempC = 0;
    while (millis() < timer + 30000) {
      tempC = getTemp();
      showIt("Temperature:", tempC);
      C = round(tempC);
      if (tempC > 7) setColor(GREEN);
      else if (tempC <= 0) setColor(RED);
      else setColor(BLUE);
      switchIt(ON);
      delay(500);
    }
    switchIt(OFF);
    delay(2000);
    switchIt(ON);
    if (C < 0) C = C * -1;
    blinkIt(C);
    switch (OFF);
    delay(2000);
  }
  else {
    lcd.clear();
    delay(60000);
  }
}

void switchIt(byte state) {
  if (state) digitalWrite(OnOff, ON);
  else digitalWrite(OnOff, OFF);
}

void blinkIt(byte count) {
  for (int i = 0; i < count; i++) {
    showIt("Count:", i + 1);
    switchIt(ON);
    delay(500);
    switchIt(OFF);
    delay(500);
  }
  if (count == YELLOW) {
    setColor(YELLOW);
    for (int i = 0; i < 10; i++) {
      switchIt(ON);
      delay(50);
      switchIt(OFF);
      delay(50);
    }
  }
}

void setColor(byte color) {
  analogWrite(RED, 255);
  analogWrite(GREEN, 255);
  analogWrite(BLUE, 255);
  switch (color) {
    case RED:
      analogWrite(RED, 0);
      break;
    case GREEN:
      analogWrite(GREEN, 0);
      break;
    case BLUE:
      analogWrite(BLUE, 0);
      break;
    case YELLOW:
      analogWrite(RED, 0);
      analogWrite(GREEN, 0);
      break;
  }
}

void showIt(String text, float toPrint) {
  int roundedNumber = toPrint;
  lcd.clear();
  lcd.setFontSize(FONT_SIZE_XLARGE);
  lcd.setCursor(0, 0);
  lcd.println(text);
  lcd.setCursor(0, 3);
  if (text.equals("Count:")) lcd.println(roundedNumber);
  else lcd.println(toPrint);
  lcd.setCursor(0, 6);
  lcd.print("LUX: ");
  lcd.println(analogRead(LIGHT));
}

float getTemp() {
  sensors.getAddress(termo, 0);
  sensors.setResolution(termo, TEMPERATURE_PRECISION);
  sensors.requestTemperatures();
  return sensors.getTempC(termo);
}


Og så blev der lys (altså, når det er mørkt nok).



Lidt forklaring til hvad koden gør:

RGB LED tændes i 30 sek. - slukker dernæst og blinker temperaturen, og tænder igen
RGB LED lyser/blinker grønt, når der er mere end 7 grader 
RGB LED lyser/blinker blåt mellem 7 og 1 grader
RGB LED lyser/blinker rødt under 0 grader
RGB LED lyser/blinker hurtigt gult ved 0 grader

Der vises temperatur, lys niveau samt antal blink, når der blinkes.


Spørgsmål er selvfølgelig velkommen.


Hilsen
Morten

6
Arduino & Lign. / Fjernstyring af stikkontakter
« Dato: Marts 20, 2015, 00:01:03 »
Hej

Hvis du/I skulle have interesse i at fjernstyre jula anslut og proove/nexa stikkontakter, har jeg lavet et library til dette. Jeg har ikke testet med nexa og proove, så feedback vil være velkomment. Library findes her: https://github.com/mortensalomon/Socket_Switch

Du skal bruge en Arduino og en 433mhz sender.

7
Arduino & Lign. / Sv: nrf24l01 + Arduino
« Dato: Juni 27, 2014, 22:59:30 »
Hej Danni,

Hvilken slags "snak" ønsker du?

Jeg har selv leget lidt. Her er hvad jeg har lavet:

1 stk. Mega med ethernet shield, en RF433mhz og en RF24ghz. Mega'en kører som webserver samt RF24Network (billeder af webserver vedhæftet). 433mhz bruges til at tænde/slukke 3 fjernbetjente kontakter (2300W fra Jula i Sverige). 2,4ghz på Mega'en modtager info fra 4 arduino mini'ere, 2 stk 5v med en dht22 (mangler at lodde en) og 2 stk 3.3v med en ds18b20, hvor temperatur/luftfugtighed præsenteres på webserveren (sendt via 2,4ghz).

Som sagt bruger jeg RF24Network, hvilket gør at man kan kommunikere meget nemt.

Planen er at de 2 mini'er 3.3v skal køre på 2stk AA batterier og være low-power (har læst at de skulle kunne køre et år). De "sover" i 5 min. og vågner for at sende temperatur til webserveren. Jeg tror dog, at jeg gør noget forkert, idet jeg synes at Voltage falder for hurtig. Mini'erne skulle kunne køre på ned til 2,4V

Hilsen
Morten

Hey Morten (Salomon)

Jeg fik lige 4 styk NRF24l01+ hjem igår
Køre RF24 LIB

Har du eventuelt et forslag til hvordan jeg via Arduino IDE på 2 maskiner laver kommunikation imellem dem? Sådan lidt en Wireless Radio Chat.

Mvh. Danni.


8
Arduino & Lign. / Sv: nrf24l01 + Arduino
« Dato: Juni 16, 2014, 10:35:59 »
Hej Danni,

Jeg har lavet vedhæftede billede. Håber, at det hjælper.

Mvh. Morten

9
Arduino & Lign. / Sv: nrf24l01 + Arduino
« Dato: Juni 10, 2014, 23:04:25 »
Hej,

Kunne selvfølgelig ikke vente med at teste mini pro......det virker.

Hilsen
Morten

10
Arduino & Lign. / Sv: nrf24l01 + Arduino
« Dato: Juni 10, 2014, 22:52:18 »
Hej,

Det ser endelig ud til at være lykkedes mig at få det til at virke med en UNO og en Nano.
Grunden til at det ikke virkede var at på Nano og sandsynligvis også Leonardo skal man bruge ICSP (MSIO,SCK,MOSI) istedet for pin 11, 12 og 13.

Nu skal jeg bare sende en float (fra DS18b20) og få det til at virke på mine 2 3.3V mini pro'er.

Hilsen
Morten

11
Arduino & Lign. / Sv: nrf24l01 + Arduino
« Dato: Juni 07, 2014, 19:22:53 »
Hej bws,

Ja, det har jeg prøvet - loddet direkte på +/-(GND) på undersiden, hvor komponenterne sidder. Jeg har prøvet flere forskellige kondensatorer 10uF/100uF mv. Jeg er ikke så stærk i elektronik, så jeg ved ikke om der er forskel på kondensatorer hvad angår 10/25/50 volt. Ved du om der er det?

Har lige fået et par arduino mini 3.3v (8Mhz) hjem og det virker heller ikke.

Jeg ved heller ikke om der er forskel på nRF24l01 og nRF24l01+. Det håber jeg ikke, da jeg kun har 4 stk. nRF24l01 og lige har bestilt 10 ekstra.

Hilsen Morten

12
Arduino & Lign. / Sv: nrf24l01 + Arduino
« Dato: Juni 04, 2014, 18:04:11 »
Hej bws,

Jeg har brugt informationerne fra denne side:

http://arduino-info.wikispaces.com/Nrf24L01-2.4GHz-HowTo

Hilsen
Morten

13
Arduino & Lign. / nrf24l01 + Arduino
« Dato: Juni 02, 2014, 21:06:06 »
Hej,

Er der nogle her der har erfaring med nrf24l01 2.4GHZ? Jeg vil gerne lave et par temperatur målere (DS18B20 på en Arduino mini 3.3v) der sender til min "hoved" arduino med net og web server, men jeg kan ikke få det til at virke.
Jeg har prøvet Arduino Uno, Leonardo og Nano som alle kan levere 3.3v med RF24 library, men får kun "failed to send".

Jeg har kun delvist fået det til at virke med Leonardo'en og kun når jeg rører ved ledningerne????


Er der nogle forslag?

Mvh Morten

14
Arduino & Lign. / Sv: Hjælp en nybegynder
« Dato: Juni 02, 2014, 20:54:44 »
Hej,

Jeg ville købe en 433MHZ transmitter og så styre kontakterne uden at bruge fjernbetjeningen (Det har jeg med succes gjort med Harald Nyborgs fjernbetjente kontakter og Arduino). Jeg har haft held med andre mærker, bla. seasonsPLUG fra jem&fix samt nogle svenske 2300W kontakter fra Jula.

En hurtig google søgning gav bla.: http://www.raspberrypi.org/forums/viewtopic.php?f=37&t=66946

En hurtig søgning på ebay viser at du kan få rf modulerne til ca. 8 kr. incl. levering fra Kina. Du skal dog regne med rn leveringstid på ca. 3 uger ved gratis levering.

http://www.ebay.co.uk/itm/KDQ2-NEW-1PCS-433MHZ-RF-TRANSMITTER-AND-RECEIVER-LINK-KIT-FOR-ARDUINO-SCA-1710-/360760000254?pt=UK_BOI_Electrical_Components_Supplies_ET&hash=item53fef8befe


Mvh. Morten

15
Hej,

Jeg har fundet ud af det. Det er umiddelbart kun muligt at have 4 kontakter ved brug af seasonsPLUG fra jem&fix.

Mvh.
Morten

Sider: [1] 2