SPCoast
Railroading on the Southern Pacific Coast

DangerShield

From SPCoast

Jump to: navigation, search

Image:DangerShield.jpg

// Danger Board v1.0 Demo Script
// By: Zach Hoeken (hoeken@gmail.com)
// As modified by John.Plocher (@gamil)
// More info: make.nycresistor.com/ds-1.0

//our setup stuff
#include "_init.h"

void setup()
{
  ds_init();

  //light sensor is decent for random stuff.
  randomSeed(analogRead(LIGHT_SENSOR_PIN));
}

int slider1_value = 0;
int slider2_value = 0;
int slider3_value = 0;
int old_slider1_value = 0;
int old_slider2_value = 0;
int old_slider3_value = 0;
int slider_map = 0;

byte seg_value = 0;

int light_value = 0;
int knock_value = 0;

int raw_temp = 0;
int celsius = 0;
int fahrenheit = 0;

boolean button1_state = false;
boolean button2_state = false;
boolean button3_state = false;

int wait = 0;

byte char_data[] = {
  B00111111, //0
  B00000110, //1
  B01011011, //2
  B01001111, //3
  B01100110, //4
  B01101101, //5
  B01111100, //6
  B00000111, //7
  B01111111, //8
  B01100111, //9
  B01110111, //A
  B01111100, //b
  B01011000, //c
  B01011110, //d
  B01111001, //E
  B01110001, //F
};
// B00000001, // top -
// B00000010, // top right |
// B00000100, // bottom right |
// B00001000, // bottom -
// B00010000, // bottom left |
// B00100000, // top left |
// B01000000, // middle -
// B10000000, // dot


int mapSlider2digit(int value) {
    slider_map = map(value, 0, 1023, 0, 15);
    slider_map = constrain(slider_map, 0, 15);
    slider_map = 15 - slider_map;
}

byte gamma_correct(byte pwm, double gamma)
{
  return (byte)(240.0 * pow(pwm/255.0, gamma)) + 15;
}

int doSlider(int sv, int oldsv, int pin) {
  if (abs(sv - oldsv) > 10) {
    int segment = char_data[mapSlider2digit(sv)];
    digitalWrite(pin, 0); delay(10);
    analogWrite(pin, gamma_correct(map(sv,0,1023,10,255), 3.0));
    return segment;
  }
  return 0;
}

void loop()
{
  //read our digital values
  button1_state = digitalRead(BUTTON1_PIN);
  button2_state = digitalRead(BUTTON2_PIN);
  button3_state = digitalRead(BUTTON3_PIN);

  //read all our analog values
  slider1_value = analogRead(SLIDER1_PIN);
  slider2_value = analogRead(SLIDER2_PIN);
  slider3_value = analogRead(SLIDER3_PIN);
  light_value   = analogRead(LIGHT_SENSOR_PIN);
  knock_value   = analogRead(KNOCK_SENSOR_PIN);
  raw_temp      = analogRead(TEMP_SENSOR_PIN);
  
  // randomly set the blue led on with slider2 brightness slider1% of the time
  if (random(0, 101) <= map(slider1_value,0,1023,0,100) || button1_state)
       analogWrite(LED2_PIN, gamma_correct(map(slider2_value,0,1023,10,255), 3.0));
  else digitalWrite(LED2_PIN, 0);

  // and the white LED governed by slider3
  if (random(0, 101) <= map(slider3_value,0,1023,0,100) || button3_state)
       analogWrite(LED1_PIN, gamma_correct(map(slider2_value,0,1023,10,255), 3.0));
  else digitalWrite(LED1_PIN, 0);

  if (seg_value = doSlider(slider1_value,old_slider1_value, SLIDER1_LED_PIN)) {
    old_slider1_value = slider1_value;
    wait = -10;
  } else if (seg_value = doSlider(slider2_value,old_slider2_value, SLIDER2_LED_PIN)) {
    old_slider2_value = slider2_value;
    wait = -10;
  } else if (seg_value = doSlider(slider3_value,old_slider3_value, SLIDER3_LED_PIN)) {
    seg_value = char_data[mapSlider2digit(slider3_value)];
    digitalWrite(SLIDER3_LED_PIN, 0); delay(10);
    analogWrite(SLIDER3_LED_PIN, gamma_correct(map(slider3_value,0,1023,10,255), 3.0));
    old_slider3_value = slider3_value;
    wait = -10;
  } else if (wait > 30) {
    wait = -1;
  } else if (wait > 21) {
    seg_value = B10000000;
  } else if (wait > 11) {  //show the temp in F on the 7-segment
    seg_value = char_data[fahrenheit % 10];
    seg_value |= B10000000;
  } else if (wait > 10) {
    seg_value = B10000000;
  } else if (wait > 0) {
    seg_value = char_data[fahrenheit / 10];
    seg_value |= B10000000;
  } else if (wait == 0) {
    //convert temp to real temps
    celsius = (5.0 * raw_temp * 100.0) / 1024.0;
    fahrenheit = (celsius * 1.8) + 32;
  }
  if (button2_state) {
    digitalWrite(BUZZER_PIN, HIGH);
    delayMicroseconds(1915);
    digitalWrite(BUZZER_PIN, LOW);
  }

  digitalWrite(LATCH_PIN, LOW);
  shiftOut(DATA_PIN, CLOCK_PIN, MSBFIRST, seg_value);
  digitalWrite(LATCH_PIN, HIGH);

  delay(75);
  wait++;
}