aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakob Stendahl <jakob@Jakobs-MacBook-Pro.local>2016-09-21 14:35:01 +0200
committerJakob Stendahl <jakob@Jakobs-MacBook-Pro.local>2016-09-21 14:35:01 +0200
commitf722493973f362b7a714f9a3b3058386ac1c5dcf (patch)
tree945de49ef997c9240c7997975ed8191e8bd573c5
parent1b9289759f68535a8a7d8525897f3be60767c479 (diff)
downloadi2c-Neopixel-f722493973f362b7a714f9a3b3058386ac1c5dcf.tar.gz
i2c-Neopixel-f722493973f362b7a714f9a3b3058386ac1c5dcf.zip
Update
-rw-r--r--Arduino/i2cNeopixelSlave.ino95
-rw-r--r--Arduino/i2cPixelSlave.ino276
2 files changed, 276 insertions, 95 deletions
diff --git a/Arduino/i2cNeopixelSlave.ino b/Arduino/i2cNeopixelSlave.ino
deleted file mode 100644
index dd9f7e0..0000000
--- a/Arduino/i2cNeopixelSlave.ino
+++ /dev/null
@@ -1,95 +0,0 @@
-#include <Wire.h>
-#include <Adafruit_NeoPixel.h>
-
-
-#define PIN 3
-#define SLAVE_ADDRESS 0x04
-
-// Parameter 1 = number of pixels in strip
-// Parameter 2 = pin number (most are valid)
-// Parameter 3 = pixel type flags, add together as needed:
-// NEO_KHZ800 800 KHz bitstream (most NeoPixel products w/WS2812 LEDs)
-// NEO_KHZ400 400 KHz (classic 'v1' (not v2) FLORA pixels, WS2811 drivers)
-// NEO_GRB Pixels are wired for GRB bitstream (most NeoPixel products)
-// NEO_RGB Pixels are wired for RGB bitstream (v1 FLORA pixels, not v2)
-Adafruit_NeoPixel strip = Adafruit_NeoPixel(10, PIN, NEO_GRB + NEO_KHZ800);
-
-int number = 0;
-int state = 0;
-
-void setup() {
-
- pinMode(13, OUTPUT);
- Serial.begin(9600);
-
- Wire.begin(SLAVE_ADDRESS);
-
- Wire.onReceive(receiveData);
- Wire.onRequest(sendData);
-
- strip.begin();
- strip.show(); // Initialize all pixels to 'off'
-
- Serial.println("Ready!");
-
-}
-
-void loop() {
- delay(100);
-}
-
-void receiveData(int byteCount) {
- int bytes[byteCount];
- int i = 0;
-
- while (Wire.available()) {
- number = Wire.read();
- bytes[i] = number;
-
- Serial.println(number);
- i++;
- }
-
- switch (bytes[0]) {
-
- case 0x01:
- Serial.println("Life is discovered");
- number = 1;
- break;
-
- case 0x02:
- /*long byteN = bytes[1];
- int byteState = bytes[2];
- int byteGreen = bytes[3];
- int byteRed = bytes[4];
- int byteBlue = bytes[5];*/
- Serial.println("0x02");
-
- strip.setPixelColor(bytes[2], bytes[3], bytes[4], bytes[5]);
- Serial.println(bytes[1]);
- Serial.println(bytes[2]);
- Serial.println(bytes[3]);
- Serial.println(bytes[4]);
- break;
-
- case 0x03:
- strip.show();
- break;
-
- default:
- Serial.println("Nothing New");
- break;
-
- }
-
-}
-
-void sendData() {
- Wire.write(number);
-}
-
-void sendString(int Data) {
- Wire.write(Data);
-}
-
-
diff --git a/Arduino/i2cPixelSlave.ino b/Arduino/i2cPixelSlave.ino
new file mode 100644
index 0000000..9ff5e58
--- /dev/null
+++ b/Arduino/i2cPixelSlave.ino
@@ -0,0 +1,276 @@
+#include <Wire.h>
+#include <Adafruit_NeoPixel.h>
+
+#define PIN 6
+#define PIXELS 10
+#define SLAVE_ADDRESS 0x04
+
+// Parameter 1 = number of pixels in strip
+// Parameter 2 = pin number (most are valid)
+// Parameter 3 = pixel type flags, add together as needed:
+// NEO_KHZ800 800 KHz bitstream (most NeoPixel products w/WS2812 LEDs)
+// NEO_KHZ400 400 KHz (classic 'v1' (not v2) FLORA pixels, WS2811 drivers)
+// NEO_GRB Pixels are wired for GRB bitstream (most NeoPixel products)
+// NEO_RGB Pixels are wired for RGB bitstream (v1 FLORA pixels, not v2)
+Adafruit_NeoPixel strip = Adafruit_NeoPixel(PIXELS, PIN, NEO_GRB + NEO_KHZ800);
+
+// i2c Config
+int number = 0;
+int state = 0;
+
+// PIR Config
+long calibrationTime = 60000; // How long the sensors need to calibrate
+long unsigned int lowIn;
+long unsigned int pause = 5000; // How long time before we assume no motion
+
+ // Sensor 1
+int pir1 = 7; // choose the input pin (for First sensor)
+int pir1State = LOW; // we start, assuming no motion detected
+int val1 = 0; // variable for reading the pin status
+boolean lockLow1 = true;
+boolean takeLowTime1;
+
+ // Sensor 2
+int pir2 = 8; // choose the input pin (for Second sensor)
+int pir2State = LOW; // we start, assuming no motion detected
+int val2 = 0; // variable for reading the pin status
+boolean lockLow2 = true;
+boolean takeLowTime2;
+
+void setup() {
+
+ // Set pins
+ pinMode(13, OUTPUT);
+ pinMode(pir1, INPUT);
+ pinMode(pir2, INPUT);
+
+ // Open Serial port (not really neccesary)
+ Serial.begin(9600);
+
+ // Initiate Neopixels
+ strip.begin();
+ strip.show(); // Initialize all pixels to 'off'
+
+ // Set all pixels to white
+ for (int i = 0; i <= PIXELS; i++) {
+ strip.setPixelColor(i, 255, 255, 255);
+ }
+ strip.show();
+
+ //give the sensor some time to calibrate. Animate with neopixels
+ Serial.print("calibrating sensor ");
+
+ long delayTime = calibrationTime/PIXELS;
+
+ for(int i = 0; i < PIXELS; i++){
+ strip.setPixelColor(PIXELS-i, 0, 0, 0);
+ strip.show();
+
+ Serial.print(".");
+ delay(delayTime);
+ }
+
+ strip.setPixelColor(0, 0, 0, 0);
+ strip.show();
+
+ Serial.println(" done");
+ Serial.println("SENSOR ACTIVE");
+ delay(50);
+
+ // Open i2c connection
+ Wire.begin(SLAVE_ADDRESS);
+
+ Wire.onReceive(receiveData);
+ Wire.onRequest(sendData);
+
+ // Done booting!
+ Serial.println("Ready!");
+
+ // Flash once Red
+ flashColor(204, 0, 0, 1100);
+
+}
+
+void loop() {
+
+ // Sensor 1 //
+ if(digitalRead(pir1) == HIGH){
+ digitalWrite(13, HIGH); //the led visualizes the sensors output pin state
+ number = 2;
+ sendData();
+ if(lockLow1){
+ //makes sure we wait for a transition to LOW before any further output is made:
+ lockLow1 = false;
+ Serial.println("---");
+ Serial.print("motion detected at ");
+ Serial.print(millis()/1000);
+ Serial.println(" sec");
+ delay(50);
+ }
+ takeLowTime1 = true;
+ }
+
+ if(digitalRead(pir1) == LOW){
+ digitalWrite(13, LOW); //the led visualizes the sensors output pin state
+ number = 0;
+ if(takeLowTime1){
+ lowIn = millis(); //save the time of the transition from high to LOW
+ takeLowTime1 = false; //make sure this is only done at the start of a LOW phase
+ }
+ //if the sensor is low for more than the given pause,
+ //we assume that no more motion is going to happen
+ if(!lockLow1 && millis() - lowIn > pause){
+ //makes sure this block of code is only executed again after
+ //a new motion sequence has been detected
+ lockLow1 = true;
+ Serial.print("motion ended at "); //output
+ Serial.print((millis() - pause)/1000);
+ Serial.println(" sec");
+ delay(50);
+ }
+ }
+ // ./Sensor 1 //
+
+
+
+ // Sensor 2 //
+ if(digitalRead(pir2) == HIGH){
+ digitalWrite(13, HIGH); //the led visualizes the sensors output pin state
+ number = 3;
+ sendData();
+ if(lockLow2){
+ //makes sure we wait for a transition to LOW before any further output is made:
+ lockLow2 = false;
+ Serial.println("---");
+ Serial.print("motion detected at ");
+ Serial.print(millis()/1000);
+ Serial.println(" sec");
+ delay(50);
+ }
+ takeLowTime2 = true;
+ }
+
+ if(digitalRead(pir2) == LOW){
+ digitalWrite(13, LOW); //the led visualizes the sensors output pin state
+ number = 0;
+ if(takeLowTime2){
+ lowIn = millis(); //save the time of the transition from high to LOW
+ takeLowTime2 = false; //make sure this is only done at the start of a LOW phase
+ }
+ //if the sensor is low for more than the given pause,
+ //we assume that no more motion is going to happen
+ if(!lockLow2 && millis() - lowIn > pause){
+ //makes sure this block of code is only executed again after
+ //a new motion sequence has been detected
+ lockLow2 = true;
+ Serial.print("motion ended at "); //output
+ Serial.print((millis() - pause)/1000);
+ Serial.println(" sec");
+ delay(50);
+ }
+ }
+ // ./Sensor 2 //
+}
+
+void receiveData(int byteCount) {
+ digitalWrite(13, HIGH);
+ int bytes[byteCount];
+ int i = 0;
+
+ while (Wire.available()) {
+ number = Wire.read();
+ bytes[i] = number;
+
+ Serial.println(number);
+ i++;
+ }
+
+ switch (bytes[0]) {
+
+ case 0x01:
+ Serial.println("Life is discovered");
+ number = 1;
+ flashColor(0, 204, 0, 1100);
+ break;
+
+ case 0x02:
+ strip.setPixelColor(bytes[2], bytes[3], bytes[4], bytes[5]);
+ break;
+
+ case 0x03:
+ strip.show();
+ break;
+
+ case 0x04:
+ flashColor(bytes[2], bytes[3], bytes[4], bytes[5]);
+ break;
+
+ default:
+ Serial.println("Nothing New");
+ break;
+
+ }
+
+ digitalWrite(13, LOW);
+}
+
+void sendData() {
+ Wire.write(number);
+}
+
+void sendString(int Data) {
+ Wire.write(Data);
+}
+
+void testCoid() {
+ flashColor(0, 204, 0, 1100);
+}
+
+int flashColor(byte Red, byte Green, byte Blue, int n) {
+
+ byte Rstart=0;
+ byte Gstart=0;
+ byte Bstart=0;
+ byte Rend=Red;
+ byte Gend=Green;
+ byte Bend=Blue;
+
+ for(long i = 0; i < n; i++) // larger values of 'n' will give a smoother/slower transition.
+ {
+ byte Rnew = Rstart + (Rend - Rstart) * i / n;
+ byte Gnew = Gstart + (Gend - Gstart) * i / n;
+ byte Bnew = Bstart + (Bend - Bstart) * i / n;
+ // set pixel color here
+ for(int j=0; j < PIXELS; j++) {
+ strip.setPixelColor(j, strip.Color(Rnew, Gnew, Bnew));
+ }
+ strip.show();
+ }
+
+ Rstart=Red;
+ Gstart=Green;
+ Bstart=Blue;
+ Rend=0;
+ Gend=0;
+ Bend=0;
+
+ for(long i = 0; i < n; i++) // larger values of 'n' will give a smoother/slower transition.
+ {
+ byte Rnew = Rstart + (Rend - Rstart) * i / n;
+ byte Gnew = Gstart + (Gend - Gstart) * i / n;
+ byte Bnew = Bstart + (Bend - Bstart) * i / n;
+ // set pixel color here
+ for(int j=0; j < PIXELS; j++) {
+ strip.setPixelColor(j, strip.Color(Rnew, Gnew, Bnew));
+ }
+ strip.show();
+ }
+
+ for(int i = 0; i < PIXELS; i++) {
+ strip.setPixelColor(i, 0, 0, 0);
+ }
+ strip.show();
+
+ return 0x01;
+}
+