4180 Smart Fish Tank Project

Dependencies:   Motordriver NeoStrip mbed-rtos mbed

Fork of 4180SmartFishTank by Jason lukose

Files at this revision

API Documentation at this revision

Comitter:
4180Team
Date:
Thu Dec 14 04:56:17 2017 +0000
Parent:
11:0309bef74ba8
Commit message:
Final 4180 Project

Changed in this revision

Motordriver.lib Show annotated file Show diff for this revision Revisions of this file
NeoStrip.lib Show annotated file Show diff for this revision Revisions of this file
gt.h Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Motordriver.lib	Thu Dec 14 04:56:17 2017 +0000
@@ -0,0 +1,1 @@
+http://os.mbed.com/users/littlexc/code/Motordriver/#3110b9209d3c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/NeoStrip.lib	Thu Dec 14 04:56:17 2017 +0000
@@ -0,0 +1,1 @@
+https://os.mbed.com/users/4180Team/code/NeoStrip/#bcd2cc14bd34
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gt.h	Thu Dec 14 04:56:17 2017 +0000
@@ -0,0 +1,12 @@
+/**** gt.h ****/
+
+const int gt_img[] = {
+	0x122446, 0xffff00, 0xffff00, 0xffff00, 0xffff00, 0x122446, 0x122446, 0x122446, 
+	0xffff00, 0xffff00, 0x122446, 0x122446, 0x122446, 0x122446, 0x122446, 0x122446, 
+	0xffff00, 0x122446, 0x122446, 0x122446, 0x122446, 0x122446, 0x122446, 0x122446, 
+	0xffff00, 0x122446, 0x122446, 0xffff00, 0xffff00, 0xffff00, 0xffff00, 0xffff00, 
+	0xffff00, 0xffff00, 0x122446, 0x122446, 0xffff00, 0x122446, 0xffff00, 0x122446, 
+	0x122446, 0xffff00, 0xffff00, 0xffff00, 0xffff00, 0x122446, 0xffff00, 0x122446, 
+	0x122446, 0x122446, 0x122446, 0x122446, 0x122446, 0x122446, 0xffff00, 0x122446, 
+	0x122446, 0x122446, 0x122446, 0x122446, 0x122446, 0x122446, 0xffff00, 0x122446};
+
--- a/main.cpp	Wed Feb 15 14:04:02 2017 -0600
+++ b/main.cpp	Thu Dec 14 04:56:17 2017 +0000
@@ -1,22 +1,222 @@
 #include "mbed.h"
 #include "rtos.h"
- 
-DigitalOut led1(LED1);
-DigitalOut led2(LED2);
-Thread thread;
- 
-void led2_thread() {
+#include <stdint.h>
+#include "NeoStrip.h"
+#include "gt.h"
+#include <iomanip> // setprecision
+#include <sstream> // stringstream
+#include "motordriver.h"
+#define N 64
+#define PATTERNS 3
+
+RawSerial  pi(USBTX, USBRX);
+
+NeoStrip strip(p18, N);
+DigitalIn b1(p20); // brightness up
+DigitalIn b2(p19); // brightness down
+DigitalIn b3(p21); // next pattern
+
+Thread t1;
+Thread t2;
+Mutex ulcd_mutex;
+Motor A(p24, p23, p22, 1); // pwm, fwd, rev, can brake
+PwmOut led1(LED1); //indicates when mbed is ready
+PwmOut led2(LED2);
+PwmOut led4(LED4);
+AnalogIn photocell(p16);
+float volatile x = 0; //global variable to change motor speed
+bool test = false;
+int hueToRGB(float h);
+void pattern0();
+void pattern1();
+void pattern2();
+// array of function pointers to the various patterns
+void (*patterns[])(void) = {&pattern0, &pattern1, &pattern2};
+
+//
+void motor() {
+    while(true) {
+        led1 = 1;
+        if (test) {
+            x = .30;
+            A.speed(x);
+            Thread::wait(1200);
+            test = false;
+            A.speed(0);
+        }
+    }
+}
+double volatile bright = 0.05; 
+bool test2 = false;  
+float value = 0;
+void ambient() {
+    led2 = 1;
     while (true) {
-        led2 = !led2;
-        Thread::wait(1000);
+        if (test2) {
+            value = photocell;
+            if (value < .10) value = .10;
+            if (value > .3) value = .30;
+            bright = abs(value - .10 - .20);
+            if (bright > .25) bright = .25;
+            strip.setBrightness(bright);
+        }
+    } 
+}
+int pattern = 0;
+void dev_recv()
+{
+    char temp = 0;
+    while(pi.readable()) {
+        temp = pi.getc();
+        pi.putc(temp);
+        if (temp=='1') {
+            bright = .15;
+            strip.setBrightness(bright);
+        }
+        if (temp=='0' && bright > 0){
+            bright = 0;
+            strip.setBrightness(bright);
+        }
+        if (temp=='=') test = true; // run motor
+        if (temp=='a') test2 = true; // ambient mode on
+        if (temp=='m') test2 = false; // manual mode on
+        if (temp=='+') {
+            bright = bright + .083;
+            if (bright > .25) bright = .25;
+            strip.setBrightness(bright);    
+        }
+        if (temp=='-') {
+            bright = bright - .083;
+            if (bright < 0) bright = 0;
+            strip.setBrightness(bright);    
+        }
+        if (temp=='p') pattern = (pattern + 1) % 3;
     }
 }
- 
 int main() {
-    thread.start(led2_thread);
+    pi.baud(9600);
+    pi.attach(&dev_recv, Serial::RxIrq);
+    b1.mode(PullUp);
+    b2.mode(PullUp);
+    b3.mode(PullUp);
+    bool b3o = b3;      // old copy of button 3 to poll for changes
+    bright = .05;
+    strip.setBrightness(bright);    // set default brightness
+    t1.start(ambient);
+    t2.start(motor);
     
-    while (true) {
-        led1 = !led1;
-        Thread::wait(500);
+    while (1) {
+         //button 1 increases brightness
+        if (b1 && bright < .25)
+        {
+            bright += 0.005;
+            if (bright > .25)
+                bright = .25;
+            strip.setBrightness(bright);
+        }
+
+        // button 2 decreases brightness
+        if (b2 && bright > 0)
+        {
+            bright -= 0.005;
+            if (bright < 0)
+                bright = 0;
+            strip.setBrightness(bright);
+        }
+        
+        // button 3 changes the pattern, only do stuff when its state has changed
+        if (b3 != b3o)
+        {
+            if (b3 && ++pattern == PATTERNS)
+                pattern = 0;
+            b3o = b3;
+        }
+        // run the pattern update function which sets the strip's pixels
+        patterns[pattern]();
+        strip.write();
+        wait_ms(10);
     }
 }
+
+//// pattern0 displays a static image
+void pattern0()
+{
+    strip.setPixels(0, N, gt_img);
+}
+
+// display a shifting rainbow, all colors have maximum
+// saturation and value, with evenly spaced hue
+void pattern1()
+{
+    static float dh = 360.0 / N;
+    static float x = 0;
+    for (int i = 0; i < N; i++)
+        strip.setPixel(i, hueToRGB((dh * i) - x));
+    x += 1;
+    if (x > 360)
+        x = 0;
+}
+// display a shifting gradient between red and blue
+void pattern2()
+{
+    // offset for each pixel to allow the pattern to move
+    static float x = 0;
+    float r, b, y;
+    for (int i = 0; i < N; i++)
+    {
+        // y is a scaled position between 0 (red) and 1.0 (blue)
+        y = 1.0 * i / (N - 1) + x;
+        if (y > 1)
+            y -= 1;
+        // if on the left half, red is decreasing and blue is increasng
+        if (y < 0.5)
+        {
+            b = 2 * y;
+            r = 1 - b;
+        }
+        // else red is increasing and blue is decreasing
+        else
+        {
+            r = 2 * (y - 0.5);
+            b = 1 - r;
+        }
+        // scale to integers and set the pixel
+        strip.setPixel(i, (uint8_t)(r * 255), 0, (uint8_t)(b * 200));
+    }
+    x += 0.003;
+    if (x > 1)
+        x = 0;
+}
+
+// Converts HSV to RGB with the given hue, assuming
+// maximum saturation and value
+int hueToRGB(float h)
+{
+    // lots of floating point magic from the internet and scratching my head
+    float r, g, b;
+    if (h > 360)
+        h -= 360;
+    if (h < 0)
+        h += 360;
+    int i = (int)(h / 60.0);
+    float f = (h / 60.0) - i;
+    float q = 1 - f;
+    switch (i % 6)
+    {
+        case 0: r = 1; g = f; b = 0; break;
+        case 1: r = q; g = 1; b = 0; break;
+        case 2: r = 0; g = 1; b = f; break;
+        case 3: r = 0; g = q; b = 1; break;
+        case 4: r = f; g = 0; b = 1; break;
+        case 5: r = 1; g = 0; b = q; break;
+        default: r = 0; g = 0; b = 0; break;
+    }
+    // scale to integers and return the packed value
+    uint8_t R = (uint8_t)(r * 255);
+    uint8_t G = (uint8_t)(g * 255);
+    uint8_t B = (uint8_t)(b * 255);
+    return (R << 16) | (G << 8) | B;
+}
+// test code, this demonstrates working motor drivers. 
+// full reverse to full stop, dynamicaly brake and switch off.
+