Build a Smart Lamp Using an Analog Discovery Pro ADP3450 – Part 2

This is the second installment of a series of four blog posts explaining how to design a smart RGB-lamp. If you are interested, you can find Part 1 here. By running an app on your smartphone, you can set the brightness and the color of the LED, or turn it off. The core of the system is an Analog Discovery Pro ADP3450, working in Linux Mode. It receives the settings from the smartphone’s app through a Pmod BLE, as well as the intensity of the ambient light, which is measured by a Pmod ALS light sensor.

In the previous post, we developed the hardware abstraction layer (HAL) functions for the Waveforms SDK. Now we design the software modules for the Pmods. We will do this similarly as before, but this time the code we create will two Pmods we use for our project and not ADP3450.

The Pmod BLE uses an UART for communication, and as we want to avoid an interruption of the PWM connected to the LED, we are going to implement it in two ways: the first one uses the UART instrument of Waveforms for sending and receiving data, the other one employs the logic analyzer and the pattern generator.

SPI is used to receive data from the Pmod ALS, and we use the Protocol Analyzer in WaveForms for that. As we will also need some I/O functionality, the Static I/O instrument is helpful.

Of course, you could write all the functions yourself, but it might be easier to download the module for the Pmod BLE from here and the one for the Pmod ALS from here. These Python scripts contain all the routines for our project, like open(), read(), or close() routines. It is worth noting that not all the functionality in these programs were tested, so there might be errors. Use them on your own responsibility.

Making Sure the Pmods Work

Before we can test the functionality of our Pmod, we need to connect them to the digital lines of the ADP3450. First connect the Pmod ALS. Have a look at the test-code to the right: it lists pin assignments. Link the CS-pin of the Pmod to the digital line 8 of the ADP 3450, the SDO pin to line 9, and the SCK pin to line 10. Moreover, connect VCC to VIO and the ground lines.

Finally, copy the code to a file in your working directory. Run the script and point a flashlight to the sensor on the Pmod. The intensity level should change.

To test the Pmod ALS, the ambient light intensity is read and displayed continuously. 

# import modules

import Pmod_ALS as als

import WF_SDK as wf # import WaveForms instruments

from time import sleep

 

# define pins

als.pins.cs = 8

als.pins.sdo = 9

als.pins.sck = 10

 

try:

# initialize the interface

device_data = wf.device.open()

# check for connection errors

wf.device.check_error(device_data)

als.open()

 

while True:

# display measurements

light = als.read_percent(rx_mode=”static”, reopen=True)

print(“static: ” + str(light) + “%”)

light = als.read_percent(rx_mode=”spi”, reopen=True)

print(“spi: ” + str(light) + “%”)

sleep(0.5)

 

except KeyboardInterrupt:

pass

finally:

# close the device

als.close(reset=True)

wf.device.close(device_data)

Repeat the same exercise for the Pmod BLE. Again, the test script lists the connections. Copy the file to your hard drive as well and run it. To test the Pmod BLE, all messages received on Bluetooth are displayed, the string “ok” is sent as a response. 

# import modules

import Pmod_BLE as ble

import WF_SDK as wf # import WaveForms instruments

 

# define pins

ble.pins.tx = 4

ble.pins.rx = 3

ble.pins.rst = 5

ble.pins.status = 6

 

# turn on messages

ble.settings.DEBUG = True

 

try:

# initialize the interface

device_data = wf.device.open()

# check for connection errors

wf.device.check_error(device_data)

ble.open()

ble.reset(rx_mode=”uart”, tx_mode=”uart”, reopen=True)

ble.reboot()

 

while True:

# check connection status

if ble.get_status():

# receive data

data, sys_msg, error = ble.read(blocking=True, rx_mode=”logic”, reopen=False)

# display data and system messages

if data != “”:

print(“data: ” + data)  # display it

ble.write_data(“ok”, tx_mode=”pattern”, reopen=False# and send response

elif sys_msg != “”:

print(“system: ” + sys_msg)

elif error != “”:

print(“error: ” + error)    # display the error

 

except KeyboardInterrupt:

pass

finally:

# close the device

ble.close(reset=True)

wf.device.close(device_data)

In addition, download the BLE Scanner application to your phone and start it. Turn on Bluetooth, if it is not already running, as well as the location. The app should display the Pmod BLE after some time. Connect to it and jot down the long code (MAC address) below the device’s name. You will need it later.

Open the Custom Service dialog and hit the “N“ (notify) icon and some system messages should show in the terminal of the test script. The “Got it“ string should appear on the custom characteristic screen of the app. Now tap “W“ and type in your text. Write down the value for the UUID and the characteristic. As before, you will need them later.

This concludes the second installment of this blog-post series. In the next edition, we will create the controlling Android app and the LED and charger circuits.

Be the 1st to vote.

Leave a Reply

Your email address will not be published.