James Cameron
Published © GPL3+

Raspberry Pi LED Christmas Tree

A Raspberry Pi LED Christmas Tree based on a kit from The Pi Hut. Additional software for web controls.

IntermediateFull instructions provided5 hours5,160
Raspberry Pi LED Christmas Tree

Things used in this project

Hardware components

Raspberry Pi Zero
Raspberry Pi Zero
×1
3D Xmas Tree for Raspberry Pi
×1

Software apps and online services

Google Sheets
Google Sheets

Hand tools and fabrication machines

Soldering iron (generic)
Soldering iron (generic)

Story

Read more

Code

My full HTML code

HTML
Use as HTML document in Apps script.
<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
    <style> 
    body {
    background-image: url("BACKGROUNDIMAGEURL (Mine is hosted in Google Drive)");
    text-align: center;
    }
    </style>
    
  </head>
  <body>
    <h1>Control Christmas Tree</h1>
    <div id="allbuttons">
    <div id="numbers">
    <button onclick="writejs(1)"><img src="Image URL" width="100px"/></button><br><br>

    <!--<button onclick="writejs(2)">1</button>-->
    <button onclick="writejs(3)">1</button>
    <button onclick="writejs(4)">2</button>
    <button onclick="writejs(5)">3</button>
    <button onclick="writejs(6)">4</button><br><br>
    
    <button onclick="writejs(7)">5</button>
    <button onclick="writejs(8)">6</button>
    <button onclick="writejs(9)">7</button>
    <button onclick="writejs(10)">8</button>
    <button onclick="writejs(11)">9</button><br><br>
    
    <button onclick="writejs(12)">10</button>
    <button onclick="writejs(13)">11</button>
    <button onclick="writejs(14)">12</button>
    <button onclick="writejs(15)">13</button>
    <button onclick="writejs(16)">14</button><br><br>
    
    <button onclick="writejs(17)">15</button>
    <button onclick="writejs(18)">16</button>
    <button onclick="writejs(19)">17</button>
    <button onclick="writejs(20)">18</button>
    <button onclick="writejs(21)">19</button><br><br>
    
    <button onclick="writejs(22)">20</button>
    <button onclick="writejs(23)">21</button>
    <button onclick="writejs(24)">22</button>
    <button onclick="writejs(25)">23</button>
    <button onclick="writejs(26)">24</button><br><br>
    </div>
    
    <br><br><br><br>
    <div id="MasterButtons">
    <button onclick="writejs(100)">All Off</button>
    <button onclick="writejs(101)">All On</button>
    <button onclick="writejs(102)">Toggle All</button> <br><br><br>
    </div>
    
    <div id="ModeButtons">
    <button onclick="writejs(200)">Web Control</button>
    <button onclick="writejs(201)">Random</button>
    <button onclick="writejs(202)">Flashing</button>
    <button onclick="writejs(203)">Top to Bottom</button>
    </div>
    </div>

    
    <script>
    function writejs(num) {
       google.script.run
       .withSuccessHandler(function(response) {
       console.log(response);
       })
       .withFailureHandler(function(err){
       console.log(err);
       })
       .write(num);
    }
    </script>
  </body>
</html>

My Apps Script Code

JavaScript
Use as a .gs file in webapp
function doGet(e) {
  page = e.parameters.a[0]
  if (page==1) {
    return HtmlService.createHtmlOutputFromFile("interface");
  }
  else if (page==2) {
    val = SpreadsheetApp.openById("SHEETID").getSheets()[0].getRange("C28").getValue();
    mode=SpreadsheetApp.openById("SHEETID").getSheets()[0].getRange("C29").getValue();;
    return HtmlService.createHtmlOutput("<p>"+"StartM"+mode+"EndM"+"StartVal"+val+"EndVal"+"</p>");
  }
  else {
    return HtmlService.createHtmlOutput("<h1>PAGE?</h1>");
  }
}

function mode(m) {
  sheet = SpreadsheetApp.openById("SHEETID").getSheets()[0];
  if (sheet.getRange("C29").getValue()>1) {
    sheet.getRange("C29").setValue(m);
  }
}

function write(num) {
  sheet = SpreadsheetApp.openById("SHEETID").getSheets()[0];
  if (num==100) {
    sheet.getRange("A1:A26").setValue(0);
    return "Off"
  
  } else if (num==101) {
    sheet.getRange("A1:A26").setValue(1);
    return "Off"
  
  } else if (num==102) {
    for (var x=1;x<27;x++) {
      val = sheet.getRange("A"+x).getValue();
      newval = val+1;
      if (newval > 1) {newval = 0;}
      sheet.getRange("A"+x).setValue(newval);
     }
  } else if (num==200) {
    mode(2);
  } else if (num==201) {
    mode(3);
  } else if (num==202) {
    mode(4);
  } else if (num==203) {
    mode(5);
  } else {

    val = sheet.getRange("A"+num).getValue();
  
    newval = val+1;
    if (newval > 1) {newval = 0;}
  
    sheet.getRange("A"+num).setValue(newval);
    return newval;
  }
}

Python Code

Python
My full python code
import urllib.request
from re import findall
from gpiozero import LEDBoard
from random import randint
from time import sleep

def get():
        page = str(urllib.request.urlopen("URLFORSITE").read())
        mode = int(findall("StartM(.*?)EndM",page)[0])
        result = str(bin(int(str(findall("StartVal(.*?)EndVal",page)[0]))))[2:]
        resultlist = list(result)
        resultlist.reverse()
        return [mode,''.join(resultlist)]
        #return ''.join(resultlist)

tree = LEDBoard(*range(2,28),pwm=False)

def randomonoff():
        for led in tree:
                s = randint(0,1)
                if (s==1):
                        led.on()
                else:
                        led.off()
def allflash():
        tree.on()
        sleep(1)
        tree.off()
        sleep(1)

def upanddown():
        tree.off()
        order = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,0]
        for item in order:
                tree[item].on()
                sleep(0.1)
        order.reverse()
        sleep(0.5)
        for item in order:
                tree[item].off()
                sleep(0.1)

while True:
        try:
                text = get()
                vals=text[1]
                if (text[0]==0):
                        tree.off()
                        exit()
                elif (text[0]==1):
                        tree.off()
                elif (text[0]==2):
                        print(vals)
                        x = 0
                        for led in tree:
                                curr = str(vals[x][0])
                                if (curr=="1"):
                                        led.on()
                                else:
                                        led.off()
                                x = x+1
                elif (text[0]==3):
                        randomonoff()
                elif (text[0]==4):
                        allflash()
                elif (text[0]==5):
                        upanddown()
        except:
                if (text[0]==0):
                        exit()
                print("Error")

Credits

James Cameron

James Cameron

3 projects • 7 followers

Comments