Skip to content
  • MySensors
  • OpenHardware.io
  • Categories
  • Recent
  • Tags
  • Popular
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Brand Logo
  1. Home
  2. My Project
  3. Video How To - Phoney TV

Video How To - Phoney TV

Scheduled Pinned Locked Moved My Project
22 Posts 10 Posters 13.3k Views 9 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • BulldogLowellB Offline
    BulldogLowellB Offline
    BulldogLowell
    Contest Winner
    wrote on last edited by
    #21

    I had to update my firmware for MySensors version 2.0.0, I thought I would post it in case anyone comes across this post...

    /*
     * PhoneyTV v3.2.0
     *
     * This Sketch illuminates 6 sets of LED's in a random fashion as to mimic the
     * light eminating from a television.  It is intended to make an empty home,
     * or an empty section of a home, appear to be occupied by someone watching
     * TV.  As an alternative to a real television left on, this uses less than 1%
     * of the electrical energy.
     *
     * With the use of the MySensors plugin and gateway, PhoneyTV is intended to
     * be used with a controller (e.g. Vera or Raspberry PI).
     *
     * Sketch does not use any delays to create the random blinking as a way to
     * assure that communication back to the gateway is as unaffected as possible.
     *
     * You can adjust the length of the blink interval and its "twitchyness" by
     * modifying the random number generators, if you prefer more/less 'motion' in
     * in your unit.  The lines are highlighted in the code, play around to create the
     * random effect you like.
     *
     * Sketch takes advantage of available PWM on pins 3, 5 & 6 using the white/blue LEDs
     * to allow fluctuations in the intensity of the light, enhancing the PhoneyTV's
     * realistic light effects.
     *
     * Created 12-APR-2014
     * Free for distrubution
     * Credit should be given to MySensors.org for their base code for relay control
     * and for the radio configuration.  Thanks Guys.
     *
     * 29-May-2014
     * Version 2:  Simplified the code, removing all redundant relay setup from original
     * code.  Added an on/off momentary pushputton option to be set up on pin 2.  Inproved
     * the dark dips for longer duration (can be configured) at intervals.
     *
     * 6-Jun-2015
     * Version 3.1
     * Updated for MySensors V1.4.1
     * Contributed by Jim (BulldogLowell@gmail.com) Inspired by Josh >> Deltanu1142@gmail.com
     *
     * Version 3.2.0 updated for MySensors 2.0.0 by Jim (BulldogLowell@gmail.com)
     * How to video: https://youtu.be/p37qnl8Kjfc
     */
    // Enable debug prints to serial monitor
    #define MY_DEBUG 
    
    // Enable and select radio type attached
    #define MY_RADIO_NRF24
    //#define MY_RADIO_RFM69
    
    // Enable repeater functionality for this node
    //#define MY_REPEATER_FEATURE
    
    #include <SPI.h>
    #include <MySensors.h>
    #include <Bounce2.h>
    
    #define RADIO_RESET_DELAY_TIME 20
    
    #define DEBUG_ON
    
    #ifdef DEBUG_ON
    #define DEBUG_PRINT(x)   Serial.print(x)
    #define DEBUG_PRINTLN(x) Serial.println(x)
    #define SERIAL_START(x)  Serial.begin(x)
    #else
    #define DEBUG_PRINT(x)
    #define DEBUG_PRINTLN(x)
    #define SERIAL_START(x)
    #endif
    
    const byte buttonPin = 2;
    const byte ledPin3 =  3;      // White using PWM
    const byte ledPin4 =  4;      // Red
    const byte ledPin5 =  5;      // Blue using PWM
    const byte ledPin6 =  6;      // Blue using PWM
    const byte ledPin7 =  7;      // Green
    const byte ledPin8 =  8;      // White (No PWM)
    
    Bounce debouncer = Bounce();
    byte oldValue = 0;
    boolean state = false;
    boolean oldState = false;
    int dipInterval = 10;
    unsigned int darkTime = 250;
    unsigned long currentDipTime;
    unsigned long dipStartTime;
    unsigned long currentMillis;
    byte ledState = LOW;
    unsigned long previousMillis = 0UL;
    byte led = 5;
    unsigned long interval = 2000UL;
    unsigned int twitch = 50;
    int dipCount = 0;
    int analogLevel = 100;
    boolean timeToDip = false;
    boolean gotAck=false;
    MyMessage msg(1,V_LIGHT);
    
    void before() 
    { 
      state = loadState(1)? 1 : 0;
    }
    
    
    void setup()
    {
      SERIAL_START(115200);
      pinMode(ledPin3, OUTPUT);
      pinMode(ledPin4, OUTPUT);
      pinMode(ledPin5, OUTPUT);
      pinMode(ledPin6, OUTPUT);
      pinMode(ledPin7, OUTPUT);
      pinMode(ledPin8, OUTPUT);
      pinMode(buttonPin, INPUT_PULLUP);
      //
      debouncer.attach(buttonPin);
      debouncer.interval(50);
      //
      DEBUG_PRINTLN(F("Sensor Presentation Complete"));
    }
    
    void presentation()  
    {   
      // Send the sketch version information to the gateway and Controller
      sendSketchInfo("PhoneyTV", "1.5");
      present(1, S_LIGHT);
    }
    
    void loop()
    {
      debouncer.update();
      byte value = debouncer.read();
      if (value != oldValue && value == 0)
      {
      state = !state;
      send(msg.set(state ? 1 : 0));
    //  while(!gotAck)
    //  {
    //    gw.send(msg.set(state), true);
    //    gw.wait(RADIO_RESET_DELAY_TIME);
    //  }
    //  gotAck = false;
      DEBUG_PRINT(F("State Changed to:"));
      DEBUG_PRINTLN(state? F("PhoneyTV ON") : F("PhoneyTV OFF"));
      }
      oldValue = value;
      if (state)
      {
      if (timeToDip == false)
      {
        currentMillis = millis();
        if (currentMillis - previousMillis > interval)
        {
        previousMillis = currentMillis;
        interval = random(750, 4001); //Adjusts the interval for more/less frequent random light changes
        twitch = random(40, 100); // Twitch provides motion effect but can be a bit much if too high
        dipCount++;
        }
        if (currentMillis - previousMillis < twitch)
        {
        led = random(3, 9);
        analogLevel = random(50, 255); // set the range of the 3 pwm leds
        ledState = !ledState;
        switch (led) //for the three PWM pins
        {
          case 3:
          pwmWrite();
          break;
          case 5:
          pwmWrite();
          break;
          case 6:
          pwmWrite();
          break;
          default:
          digitalWrite(led, ledState);
        }
        if (dipCount > dipInterval)
        {
          timeToDip = true;
          dipCount = 0;
          dipStartTime = millis();
          darkTime = random(50, 150);
          dipInterval = random(5, 250); // cycles of flicker
        }
        }
      }
      else
      {
        DEBUG_PRINTLN(F("Dip Time"));
        currentDipTime = millis();
        if (currentDipTime - dipStartTime < darkTime)
        {
        for (int i = 3; i < 9; i++)
        {
          digitalWrite(i, LOW);
        }
        }
        else
        {
        timeToDip = false;
        }
      }
      }
      else
      {
      if (state != oldState)
      {
        for (int i = 3; i < 9; i++)
        {
        digitalWrite(i, LOW);
        }
      }
      }
      oldState = state;
    }
    
    void receive(const MyMessage &message) {
      // We only expect one type of message from controller. But we better check anyway.
      if (message.type==V_LIGHT) {
         // Change relay state
         state = message.getBool()? 1 : 0;
         // Store state in eeprom
         saveState(message.sensor, message.getBool());
         // Write some debug info
         Serial.print("Incoming change for sensor:");
         Serial.print(message.sensor);
         Serial.print(", New status: ");
         Serial.println(message.getBool());
       } 
    }
    
    void pwmWrite()
    {
      if (ledState == HIGH) 
      {
      analogWrite(led, analogLevel);
      }
      else 
      {
      digitalWrite(led, LOW);
      }
    }
    
    1 Reply Last reply
    1
    • tombstoneT Offline
      tombstoneT Offline
      tombstone
      wrote on last edited by
      #22

      another nice video :+1:

      1 Reply Last reply
      0
      Reply
      • Reply as topic
      Log in to reply
      • Oldest to Newest
      • Newest to Oldest
      • Most Votes


      19

      Online

      11.7k

      Users

      11.2k

      Topics

      113.1k

      Posts


      Copyright 2025 TBD   |   Forum Guidelines   |   Privacy Policy   |   Terms of Service
      • Login

      • Don't have an account? Register

      • Login or register to search.
      • First post
        Last post
      0
      • MySensors
      • OpenHardware.io
      • Categories
      • Recent
      • Tags
      • Popular