Show Posts
Pages: 1 2 [3] 4 5 ... 7
31  Using Arduino / Programming Questions / Re: Ladyada's multi-button checker - how to? on: February 05, 2013, 09:15:05 am
This is the code i have on my Nano 328 where the buttons are connected:
Code:
#include <SPI.h>
#include <Ethernet.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <PubSubClient.h>

/**************************************************************
*                         Connections                         *
**************************************************************/
#define ONE_WIRE_BUS 5 // oneWire pin is D5

#define DEBOUNCE 10  // button debouncer, how many ms to debounce, 5+ ms is usually plenty
// here is where we define the buttons that we'll use. button "1" is the first, button "6" is the 6th, etc
byte buttons[] = {14, 15, 16, 17, 18, 19}; // the analog 0-5 pins are also known as 14-19
// This handy macro lets us determine how big the array up above is, by checking the size
#define NUMBUTTONS sizeof(buttons)
// we will track if a button is just pressed, just released, or 'currently pressed'
volatile byte pressed[NUMBUTTONS], justpressed[NUMBUTTONS], justreleased[NUMBUTTONS];

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

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

/**************************************************************
*                      Ethernet Settings                      *
**************************************************************/
// Ethernet Card Mac Address
byte mac[] = {0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF};
// IPv4 address
byte ip[] = {192, 168, 0, 132};
// Subnet mask
byte subnet[] = {255, 255, 255, 0};
// Default gateway
byte gateway[] = {192, 168, 0, 1};
// MQTT Server
byte server[] = { 192, 168, 0, 1 };
// Preferred DNS sever
// byte dns[] = {192, 168, 0, 1};

void callback(char* topic, byte* payload, unsigned int length) {
  // handle message arrived
}
// Fire up our PubSub client
EthernetClient ethClient;
PubSubClient client(server, 1883, callback, ethClient);

/**************************************************************
*                           Setup                             *
**************************************************************/
void setup()
{
  byte i;
  byte dsAddress[8];
  // Open serial communications and wait for port to open:
  Serial.begin(9600);
    while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }

  Serial.println( "Searching for DS18B20..." );
  oneWire.reset_search(); // Start the search with the first device
  if( !oneWire.search(dsAddress) )
  {
    Serial.println( "none found. Using default MAC address." );
  } else {
    Serial.println( "success. Setting MAC address:" );
    Serial.print( " DS18B20 ROM  =" );
    for( i = 0; i < 8; i++)
    {
      Serial.write(' ');
      Serial.print( dsAddress[i], HEX );
    }
    Serial.println();
   
    // Offset array to skip DS18B20 family code, and skip mac[0]
    mac[1] = dsAddress[3];
    mac[2] = dsAddress[4];
    mac[3] = dsAddress[5];
    mac[4] = dsAddress[6];
    mac[5] = dsAddress[7];
  }

  Serial.print( " Ethernet MAC =" );
  for( i = 0; i < 6; i++ )
  {
    Serial.write( ' ' );
    Serial.print( mac[i], HEX );
  }
  Serial.println();

  Ethernet.begin(mac, ip, subnet, gateway);
  Serial.print(" IPv4 address: ");
  Serial.println(Ethernet.localIP());

  // Start up the Dallas Temperature library
  sensors.begin(); // IC Default 9 bit. If you have troubles consider upping it 12. Ups the delay giving the IC more time to process the temperature measurement
   
  // Connect to MQTT Broker, give it Bath-O-Matic as the name
  if (client.connect("Bath-O-Matic")) {
    // Publish a message to the status topic
    client.publish("status","Bath-O-Matic is now online");
  }

  // Make input & enable pull-up resistors on switch pins
  for (i=0; i< NUMBUTTONS; i++) {
    pinMode(buttons[i], INPUT);
    digitalWrite(buttons[i], HIGH);
  }
 
  // Run timer2 interrupt every 15 ms
  TCCR2A = 0;
  TCCR2B = 1<<CS22 | 1<<CS21 | 1<<CS20;

  //Timer2 Overflow Interrupt Enable
  TIMSK2 |= 1<<TOIE2;
}


SIGNAL(TIMER2_OVF_vect) {
  check_switches();
}

void check_switches()
{
  static byte previousstate[NUMBUTTONS];
  static byte currentstate[NUMBUTTONS];
  static long lasttime;
  byte index;

  if (millis() < lasttime) {
     // we wrapped around, lets just try again
     lasttime = millis();
  }
 
  if ((lasttime + DEBOUNCE) > millis()) {
    // not enough time has passed to debounce
    return;
  }
  // ok we have waited DEBOUNCE milliseconds, lets reset the timer
  lasttime = millis();
 
  for (index = 0; index < NUMBUTTONS; index++) {
     
    currentstate[index] = digitalRead(buttons[index]);   // read the button
   
    /*     
    Serial.print(index, DEC);
    Serial.print(": cstate=");
    Serial.print(currentstate[index], DEC);
    Serial.print(", pstate=");
    Serial.print(previousstate[index], DEC);
    Serial.print(", press=");
    */
   
    if (currentstate[index] == previousstate[index]) {
      if ((pressed[index] == LOW) && (currentstate[index] == LOW)) {
          // just pressed
          justpressed[index] = 1;
      }
      else if ((pressed[index] == HIGH) && (currentstate[index] == HIGH)) {
          // just released
          justreleased[index] = 1;
      }
      pressed[index] = !currentstate[index];  // remember, digital HIGH means NOT pressed
    }
    //Serial.println(pressed[index], DEC);
    previousstate[index] = currentstate[index];   // keep a running tally of the buttons
  }
}

void loop() {
 
  for (byte i = 0; i < NUMBUTTONS; i++) {

    if (justreleased[0]) {
      justreleased[0] = 0;
      client.publish("foo/shower","1"); // Turn off Shower Light
    }

  }
}
At the moment the DS18B20's are just to set unique MAC addresses.
On my Windows 2012 Server i have Mosquitto running.
I think the code on the Mega is ok cause i can turn the light on and off many times with PHP
without problems:
Code:
<?php
require("phpMQTT.php");
$mqtt = new phpMQTT();
/* broker(broker address, broker port, client id); */
$mqtt->broker("192.168.0.1"1883"PHP MQTT Client");
$mqtt->connect();
/* publish( topic, message, qos); */
$mqtt->publish("foo/shower","0",0);
$mqtt->close();
?>
32  Using Arduino / Programming Questions / Re: Ladyada's multi-button checker - how to? on: February 05, 2013, 09:14:44 am
Hm, I'm unsure how where i have to replace the "i" with the button number.
Code:
if (justreleased[i]) {
      justreleased[i] = 0;
      // remember, check_switches() will CLEAR the 'just pressed' flag
    }
It works a view times and then it stops working.
And how do i make it that the light goes on when i press and send my code just one time?

But here is the whole thing:
I want to switch the light from one Arduino on another Arduino via MQTT over my windows server.
This is the code that i have on my Mega 2560 where the light is connected:
Code:
#include <SPI.h>
#include <Ethernet.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <PubSubClient.h>

/**************************************************************
*                         Connections                         *
**************************************************************/
#define ONE_WIRE_BUS 5 // oneWire pin is D5
#define showerPin 6    // Shower Light is D6

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

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

/**************************************************************
*                      Ethernet Settings                      *
**************************************************************/
// Ethernet Card Mac Address
byte mac[] = {0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF};
// IPv4 address
byte ip[] = {192, 168, 0, 131};
// Subnet mask
byte subnet[] = {255, 255, 255, 0};
// Default gateway
byte gateway[] = {192, 168, 0, 1};
// MQTT Server
byte server[] = { 192, 168, 0, 1 };
// Preferred DNS sever
// byte dns[] = {192, 168, 0, 1};

/**************************************************************
*                           MQTT                              *
**************************************************************/
EthernetClient ethClient;
PubSubClient client(server, 1883, callback, ethClient);

void callback(char* topic, byte* payload, unsigned int length)
{
  Serial.print("New message from broker on topic:");
  Serial.println(topic);

  Serial.print("Payload:");
  Serial.write(payload, length);
  
  if (strcmp(topic,"foo/shower")==0) {
    if (payload[0] == '0') {
      digitalWrite(showerPin, LOW); // Turn off Shower Light
    } else if (payload[0] == '1') {
      digitalWrite(showerPin, HIGH); // Turn on Shower Light
   }
  }
}

/**************************************************************
*                           Setup                             *
**************************************************************/
void setup()
{
  byte i;
  byte dsAddress[8];
  // Open serial communications and wait for port to open:
  Serial.begin(9600);
    while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }

  Serial.println( "Searching for DS18B20..." );
  oneWire.reset_search(); // Start the search with the first device
  if( !oneWire.search(dsAddress) )
  {
    Serial.println( "none found. Using default MAC address." );
  } else {
    Serial.println( "success. Setting MAC address:" );
    Serial.print( " DS18B20 ROM  =" );
    for( i = 0; i < 8; i++)
    {
      Serial.write(' ');
      Serial.print( dsAddress[i], HEX );
    }
    Serial.println();
    
    // Offset array to skip DS18B20 family code, and skip mac[0]
    mac[1] = dsAddress[3];
    mac[2] = dsAddress[4];
    mac[3] = dsAddress[5];
    mac[4] = dsAddress[6];
    mac[5] = dsAddress[7];
  }

  Serial.print( " Ethernet MAC =" );
  for( i = 0; i < 6; i++ )
  {
    Serial.write( ' ' );
    Serial.print( mac[i], HEX );
  }
  Serial.println();

  Ethernet.begin(mac, ip, subnet, gateway);
  Serial.print(" IPv4 address: ");
  Serial.println(Ethernet.localIP());

  // Start up the Dallas Temperature library
  sensors.begin(); // IC Default 9 bit. If you have troubles consider upping it 12. Ups the delay giving the IC more time to process the temperature measurement

  // Connect to MQTT Broker, give it Switch-O-Matic as the name
  if (client.connect("Switch-O-Matic")) {
    // Publish a message to the status topic
    client.publish("status","Switch-O-Matic is now online");
    // Listen for messages on the control topic
    client.subscribe("foo/#");
  }

  pinMode(showerPin, OUTPUT);
  digitalWrite(showerPin, LOW);
  
}
 
void loop()
{
  client.loop();
}
33  Using Arduino / Installation & Troubleshooting / Re: Sketch working on Mega 2560 R3 but not on R1/2 on: January 11, 2013, 07:02:34 pm
Not exactly the reverse situation - cause mine are both Mega2560 smiley-razz
34  Using Arduino / Installation & Troubleshooting / Re: Sketch working on Mega 2560 R3 but not on R1/2 on: January 11, 2013, 12:20:18 am
No Uno.
As i wrote both are Megas - just different revisions.

What looks alien maybe is that i use a DS18B20 to generate a unique MAC address
on all my Ethernet Arduinos.
This way you always have unique MAC address's without taking care of them.
35  Using Arduino / Programming Questions / Re: Ladyada's multi-button checker - how to? on: January 10, 2013, 09:28:34 pm
so in
Code:
if (justreleased[i])
i have to replace the "i" with the button number.
This works.

But my code gets send to many times.
As long as i press the button if i use "pressed".
So how to make sure it gets send just one time?

Quote
The switches don't trigger the interrupt. The clock does.
So this interrupt has nothing to do with the Arduino hardware interrupts that i have only on
some pins like 2 and 3?
36  Using Arduino / Installation & Troubleshooting / Re: Sketch working on Mega 2560 R3 but not on R1/2 on: January 10, 2013, 07:01:26 pm
Nobody has a idea why it works on one and not the other smiley-confuse ?
37  Using Arduino / Programming Questions / Ladyada's multi-button checker - how to? on: January 07, 2013, 03:48:51 am
Hi,

i found the Ladyada's multi-button checker: http://www.adafruit.com/blog/2009/10/20/example-code-for-multi-button-checker-with-debouncing/
First thing i don't get is how i can trigger something with the code (for example turn on an LED).
And the second thing i don't understand is that interrupts are used on all the pins in the second example.
38  Using Arduino / Installation & Troubleshooting / Sketch working on Mega 2560 R3 but not on R1/2 on: January 06, 2013, 05:09:31 pm
Hi,

my Sketch is working on the Mega 2560 R3 but not on an older one.
I don't know if its an R1 or R2 cause there is no print on the PCB.
I also switched the ethernet shield to make sure its not the shield.

The MQTT Server does not receive the "hello world" from the older Mega 2560.

Code:
#include <SPI.h>
#include <Ethernet.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <PubSubClient.h>

/**************************************************************
*                         Connections                         *
**************************************************************/
#define ONE_WIRE_BUS 5 // oneWire pin is D5

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

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

/**************************************************************
*                      Ethernet Settings                      *
**************************************************************/
// Ethernet Card Mac Address
byte mac[] = {0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF};
// IPv4 address
byte ip[] = {192, 168, 0, 132};
// Subnet mask
byte subnet[] = {255, 255, 255, 0};
// Default gateway
byte gateway[] = {192, 168, 0, 1};
// MQTT Server
byte server[] = { 192, 168, 0, 1 };
// Preferred DNS sever
// byte dns[] = {192, 168, 0, 1};

/**************************************************************
*                           MQTT                              *
**************************************************************/
void callback(char* topic, byte* payload, unsigned int length)
{

}

// Fire up PubSub client
PubSubClient client(server, 1883, callback);

/**************************************************************
*                           Setup                             *
**************************************************************/
void setup()
{
  byte i;
  byte dsAddress[8];
  // Open serial communications and wait for port to open:
  Serial.begin(9600);
    while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }

  Serial.println( "Searching for DS18B20..." );
  oneWire.reset_search(); // Start the search with the first device
  if( !oneWire.search(dsAddress) )
  {
    Serial.println( "none found. Using default MAC address." );
  } else {
    Serial.println( "success. Setting MAC address:" );
    Serial.print( " DS18B20 ROM  =" );
    for( i = 0; i < 8; i++)
    {
      Serial.write(' ');
      Serial.print( dsAddress[i], HEX );
    }
    Serial.println();
   
    // Offset array to skip DS18B20 family code, and skip mac[0]
    mac[1] = dsAddress[3];
    mac[2] = dsAddress[4];
    mac[3] = dsAddress[5];
    mac[4] = dsAddress[6];
    mac[5] = dsAddress[7];
  }

  Serial.print( " Ethernet MAC =" );
  for( i = 0; i < 6; i++ )
  {
    Serial.write( ' ' );
    Serial.print( mac[i], HEX );
  }
  Serial.println();

  Ethernet.begin(mac, ip, subnet, gateway);
  Serial.print(" IPv4 address: ");
  Serial.println(Ethernet.localIP());

  // Start up the Dallas Temperature library
  sensors.begin(); // IC Default 9 bit. If you have troubles consider upping it 12. Ups the delay giving the IC more time to process the temperature measurement

   if (client.connect("arduinoClient", "testuser", "testpass")) {
    client.publish("outTopic","hello world");
    client.subscribe("inTopic");
  }
   
}
 
void loop()
{
  client.loop();
}
39  Using Arduino / LEDs and Multiplexing / Re: Buttons, interrupts and de-bouncing on: January 01, 2013, 05:33:36 am
Ok, more confused smiley-roll
I found this from Ladyada and she writes:
"To change the pins or number of buttons, just put them in the array called “buttons” and the rest of the code will automatically adjust."
http://www.adafruit.com/blog/2009/10/20/example-code-for-multi-button-checker-with-debouncing/
The second sketch uses interrupts. But she is using analog inputs and how can i just ad buttons if i can't just
use every input pin as interrupt??

This sketch also says: "which pin to use for reading the sensor? can use any pin!"
https://raw.github.com/adafruit/Adafruit-Flow-Meter/master/Adafruit_FlowMeter.pde
40  Using Arduino / LEDs and Multiplexing / Re: Buttons, interrupts and de-bouncing on: December 24, 2012, 05:38:18 am
I mean the person who writes the program...
So we need shirts now for the cool people with the print on them: I am a interrupter!
 smiley-lol
41  Using Arduino / Sensors / Re: Reading central heating system thermistor's? on: December 23, 2012, 07:15:59 pm
I just want to let you know that i already have some parts but not all and
that i also need to figure out some other stuff.
I will build it - not that you think your efforts on teaching me this was to no avail
42  Using Arduino / LEDs and Multiplexing / Re: Buttons, interrupts and de-bouncing on: December 23, 2012, 07:11:02 pm
Go where you feel the fun is (tm) smiley-grin
I better don't comment that *lol
43  Using Arduino / LEDs and Multiplexing / Re: Buttons, interrupts and de-bouncing on: December 23, 2012, 06:04:17 pm
Cool? Hm, i think nobody ever will ask: "hey how does this button work? do you use interrupts?"
If i build a egg timer for my 60 years old Mother. She never ever will look at the code or ask.
An Arduino for a egg timer *looool
But who knows. When Skynet comes alive and all machines communicate, maybe the egg timer is
in charge for the timing of the Terminator sorties smiley-grin

I just want to figure out whats the right way to do it. If you need to check the inputs
in the loops then the Atmega uses energy you maybe need for other stuff.
I always think that stuff needs to be build that it uses the least energy.
The other thing i read at Jeremy's (Blum) blog is:
Quote
Interrupts allow you run a program, while still being able to react to asynchronous input from the outside world.
So you can do stuff at the same time.
44  Using Arduino / LEDs and Multiplexing / Re: Buttons, interrupts and de-bouncing on: December 23, 2012, 03:12:36 pm
I will read i later. But just from overflying it i thought its just for the ATmega328p.

So does it make sense to always use interrupts for switching state instead of using
just digital IN and look at it all the time in a loop?
Please correct me if my logical thinking is not right smiley-neutral
45  Using Arduino / LEDs and Multiplexing / Re: Buttons, interrupts and de-bouncing on: December 23, 2012, 01:50:11 pm
You can buy a MEGA
I have two Mega but they also have just 6 interrupt pins.
Quote from: dhenry
It is useless only in the hands of useless programmers.
Sound like a sentences from somebody who was born and did
know programming and never had to start and learn.
Pages: 1 2 [3] 4 5 ... 7