Force Sensor Resistor (FSR)

hi , I need help with my project which is collecting data pressure applied on FSR sensor. Im using Raspberry pi 3 B+ and pi cobbler which connected to MCP3008 for converting the FSR analog signal to digital .
after complete SSH my Pi, the dashboard are only show basic widget. I try to add sensor but cannot find FSR. The analog sensor for pressure are only available for Flexi sensor. The sensor cannot be pick same goes to MCP3008 which i cannot add.

can you help me solve this?

if you have the python code to read the data from the sensor, then you can send that data to cayenne using https://github.com/myDevicesIoT/Cayenne-MQTT-Python

i try my best to solve this problem but i can’t. It shows
Traceback (most recent call last):
File “/home/pi/Documents/mqtt test9.py”, line 1, in
import cayenne.client
ModuleNotFoundError: No module named ‘cayenne’

did you install the library:

git clone https://github.com/myDevicesIoT/Cayenne-MQTT-Python
cd Cayenne-MQTT-Python
python setup.py install

it show error : can’t create or remove files in install directory

here the copy of the scripted;
pi@raspberrypi:~ git clone https://github.com/myDevicesIoT/Cayenne-MQTT-Python Cloning into 'Cayenne-MQTT-Python'... remote: Enumerating objects: 166, done. remote: Total 166 (delta 0), reused 0 (delta 0), pack-reused 166 Receiving objects: 100% (166/166), 32.80 KiB | 17.00 KiB/s, done. Resolving deltas: 100% (77/77), done. pi@raspberrypi:~ cd Cayenne-MQTT-Python
pi@raspberrypi:~/Cayenne-MQTT-Python $ python setup.py install
running install
error: can’t create or remove files in install directory

The following error occurred while trying to add or remove files in the
installation directory:

[Errno 13] Permission denied: '/usr/local/lib/python2.7/dist-packages/test-easy-install-18447.write-test'

The installation directory you specified (via --install-dir, --prefix, or
the distutils default setting) was:

/usr/local/lib/python2.7/dist-packages/

Perhaps your account does not have write access to this directory? If the
installation directory is a system-owned directory, you may need to sign in
as the administrator or “root” account. If you do not have administrative
access to this machine, you may wish to choose a different installation
directory, preferably one that is listed in your PYTHONPATH environment
variable.

For information on other options, you may wish to consult the
documentation at:

https://setuptools.readthedocs.io/en/latest/easy_install.html

Please make the appropriate changes for your system and try again.

use sudo

do you mean by typing sudo and paste the coding like this ?

pi@raspberrypi:~ sudo git clone https://github.com/myDevicesIoT/Cayenne-MQTT-Python fatal: destination path 'Cayenne-MQTT-Python' already exists and is not an empty directory. pi@raspberrypi:~ cd Cayenne-MQTT-Python
pi@raspberrypi:~/Cayenne-MQTT-Python $ python setup.py install

the result still same.
sorry im still begineer …

sudo python setup.py install

im trying running coding example in the link ,https://github.com/myDevicesIoT/Cayenne-MQTT-Python

on Thony Python IDE programming
here my coding …

import cayenne.client
import time

Cayenne authentication info. This should be obtained from the Cayenne Dashboard.

MQTT_USERNAME = “a07bde20-634f-11ea-84bb-8f71124cfdfb”
MQTT_PASSWORD = “60271e4e4c25fb838c8d33d808293fafda7a2a43”
MQTT_CLIENT_ID = “8b609240-6473-11ea-b301-fd142d6c1e6c”

The callback for when a message is received from Cayenne.

def on_message(message):
print("message received: " + str(message))

If there is an error processing the message return an error string, otherwise return nothing.

client = cayenne.client.CayenneMQTTClient()
client.on_message = on_message
client.begin(MQTT_USERNAME, MQTT_PASSWORD, MQTT_CLIENT_ID)

For a secure connection use port 8883 when calling client.begin:

client.begin(MQTT_USERNAME, MQTT_PASSWORD, MQTT_CLIENT_ID, port=8883)

i=0
timestamp = 0

while True:
client.loop()

if (time.time() > timestamp + 10):
client.celsiusWrite(1, i)
client.luxWrite(2, i*10)
client.hectoPascalWrite(3, i+800)
timestamp = time.time()
i = i+1

this still show error;
Python 3.7.3 (/usr/bin/python3)

%Run ‘mqtt test10.py’
Traceback (most recent call last):
File “/home/pi/Documents/mqtt test10.py”, line 1, in
import cayenne.client
ModuleNotFoundError: No module named ‘cayenne’

Use sudo python3 setup.py install because you are using python 3.7

yeay it already done added the devices. Thankyou boss. Have a nice day !

1 Like

Hi, i got problem to combine the example mqtt coding with my data sensor coding(raw python) . how to combine the two coding ?

#!/usr/bin/env python

import time
import os
import RPi.GPIO as GPIO

GPIO.setmode(GPIO.BCM)
DEBUG = 1

read SPI data from MCP3008 chip, 8 possible adc’s (0 thru 7)

def readadc(adcnum, clockpin, mosipin, misopin, cspin):
if ((adcnum > 7) or (adcnum < 0)):
return -1
GPIO.output(cspin, True)

    GPIO.output(clockpin, False)  # start clock low
    GPIO.output(cspin, False)     # bring CS low

    commandout = adcnum
    commandout |= 0x18  # start bit + single-ended bit
    commandout <<= 3    # we only need to send 5 bits here
    for i in range(5):
            if (commandout & 0x80):
                    GPIO.output(mosipin, True)
            else:
                    GPIO.output(mosipin, False)
            commandout <<= 1
            GPIO.output(clockpin, True)
            GPIO.output(clockpin, False)

    adcout = 0
    # read in one empty bit, one null bit and 10 ADC bits
    for i in range(12):
            GPIO.output(clockpin, True)
            GPIO.output(clockpin, False)
            adcout <<= 1
            if (GPIO.input(misopin)):
                    adcout |= 0x1

    GPIO.output(cspin, True)
    
    adcout >>= 1       # first bit is 'null' so drop it
    return adcout

change these as desired - they’re the pins connected from the

SPI port on the ADC to the Cobbler

SPICLK = 18
SPIMISO = 23
SPIMOSI = 24
SPICS = 25

set up the SPI interface pins

GPIO.setup(SPIMOSI, GPIO.OUT)
GPIO.setup(SPIMISO, GPIO.IN)
GPIO.setup(SPICLK, GPIO.OUT)
GPIO.setup(SPICS, GPIO.OUT)

10k trim pot connected to adc #0

potentiometer_adc = 0;

last_read = 0 # this keeps track of the last potentiometer value
tolerance = 5 # to keep from being jittery we’ll only change
# volume when the pot has moved more than 5 ‘counts’

while True:
# we’ll assume that the pot didn’t move
trim_pot_changed = False

    # read the analog pin
    trim_pot = readadc(potentiometer_adc, SPICLK, SPIMOSI, SPIMISO, SPICS)
    # how much has it changed since the last read?
    pot_adjust = abs(trim_pot - last_read)

    if DEBUG:
            print ("trim_pot:", trim_pot)
            print ("pot_adjust:", pot_adjust)
            print ("last_read", last_read)

    if ( pot_adjust > tolerance ):
           trim_pot_changed = True

    if DEBUG:
            print ("trim_pot_changed", trim_pot_changed)

    if ( trim_pot_changed ):
            set_volume = trim_pot / 10.24           # convert 10bit adc0 (0-1024) trim pot read into 0-100 volume level
            set_volume = round(set_volume)          # round out decimal value
            set_volume = int(set_volume)            # cast volume as integer

            print ('Volume = {volume}%' .format(volume = set_volume))
            set_vol_cmd = 'sudo amixer cset numid=1 -- {volume}% > /dev/null' .format(volume = set_volume)
            os.system(set_vol_cmd)  # set volume

            if DEBUG:
                    print ("set_volume", set_volume)
                    print ("tri_pot_changed", set_volume)

            # save the potentiometer reading for the next loop
            last_read = trim_pot

    # hang out and do nothing for a half second
    time.sleep(0.5)

and the example mqtt

import cayenne.client
import time

Cayenne authentication info. This should be obtained from the Cayenne Dashboard.

MQTT_USERNAME = “a07bde20-634f-11ea-84bb-8f71124cfdfb”
MQTT_PASSWORD = “60271e4e4c25fb838c8d33d808293fafda7a2a43”
MQTT_CLIENT_ID = “8b609240-6473-11ea-b301-fd142d6c1e6c”

The callback for when a message is received from Cayenne.

def on_message(message):
print("message received: " + str(message))

If there is an error processing the message return an error string, otherwise return nothing.

client = cayenne.client.CayenneMQTTClient()
client.on_message = on_message
client.begin(MQTT_USERNAME, MQTT_PASSWORD, MQTT_CLIENT_ID)

For a secure connection use port 8883 when calling client.begin:

client.begin(MQTT_USERNAME, MQTT_PASSWORD, MQTT_CLIENT_ID, port=8883)

i=0
timestamp = 0

while True:
client.loop()

if (time.time() > timestamp + 10):
client.celsiusWrite(1, i)
client.luxWrite(2, i*10)
client.hectoPascalWrite(3, i+800)
timestamp = time.time()
i = i+1

can you atleast give it a try combining and share the code after that if not working.

update on my coding, i already combine two of them but the data/channel are now showing on dashoard. The device is connected. the result only showing on python.

how can i made the data connected to the dashboard ?

here my coding

import cayenne.client
import time
import os
import RPi.GPIO as GPIO

# Cayenne authentication info. This should be obtained from the Cayenne Dashboard.
MQTT_USERNAME  = "a07bde20-634f-11ea-84bb-8f71124cfdfb"
MQTT_PASSWORD  = "60271e4e4c25fb838c8d33d808293fafda7a2a43"
MQTT_CLIENT_ID = "88d9b890-6b7f-11ea-b301-fd142d6c1e6c"
GPIO.setmode(GPIO.BCM)
DEBUG = 1

# The callback for when a message is received from Cayenne.
def on_message(message):
  print("message received: " + str(message))
  # If there is an error processing the message return an error string, otherwise return nothing.

def readadc(adcnum, clockpin, mosipin, misopin, cspin):
        if ((adcnum > 7) or (adcnum < 0)):
                return -1
        GPIO.output(cspin, True)

        GPIO.output(clockpin, False)  # start clock low
        GPIO.output(cspin, False)     # bring CS low

        commandout = adcnum
        commandout |= 0x18  # start bit + single-ended bit
        commandout <<= 3    # we only need to send 5 bits here
        for i in range(5):
                if (commandout & 0x80):
                        GPIO.output(mosipin, True)
                else:
                        GPIO.output(mosipin, False)
                commandout <<= 1
                GPIO.output(clockpin, True)
                GPIO.output(clockpin, False)

        adcout = 0
        # read in one empty bit, one null bit and 10 ADC bits
        for i in range(12):
                GPIO.output(clockpin, True)
                GPIO.output(clockpin, False)
                adcout <<= 1
                if (GPIO.input(misopin)):
                        adcout |= 0x1

        GPIO.output(cspin, True)
        
        adcout >>= 1       # first bit is 'null' so drop it
        return adcout

client = cayenne.client.CayenneMQTTClient()
client.on_message = on_message
client.begin(MQTT_USERNAME, MQTT_PASSWORD, MQTT_CLIENT_ID)
# For a secure connection use port 8883 when calling client.begin:
# client.begin(MQTT_USERNAME, MQTT_PASSWORD, MQTT_CLIENT_ID, port=8883)

i=0
timestamp = 0

SPICLK = 18
SPIMISO = 23
SPIMOSI = 24
SPICS = 25

# set up the SPI interface pins
GPIO.setup(SPIMOSI, GPIO.OUT)
GPIO.setup(SPIMISO, GPIO.IN)
GPIO.setup(SPICLK, GPIO.OUT)
GPIO.setup(SPICS, GPIO.OUT)

# 10k trim pot connected to adc #0
potentiometer_adc = 0;

last_read = 0       # this keeps track of the last potentiometer value
tolerance = 5       # to keep from being jittery we'll only change
                    # volume when the pot has moved more than 5 'counts'


while True:
    client.loop()

    trim_pot_changed = False

    # read the analog pin
    trim_pot = readadc(potentiometer_adc, SPICLK, SPIMOSI, SPIMISO, SPICS)
    # how much has it changed since the last read?
    pot_adjust = abs(trim_pot - last_read)
        
        
    if (time.time() > timestamp + 10):
        client.celsiusWrite(1, i)
        client.luxWrite(2, i*10)
        client.hectoPascalWrite(3, i+800)
        timestamp = time.time()
        i = i+1

    if DEBUG:
                print ("trim_pot:", trim_pot)
                print ("pot_adjust:", pot_adjust)
                print ("last_read", last_read)

    if ( pot_adjust > tolerance ):
               trim_pot_changed = True

    if DEBUG:
                print ("trim_pot_changed", trim_pot_changed)

    if ( trim_pot_changed ):
                set_volume = trim_pot / 10.24           # convert 10bit adc0 (0-1024) trim pot read into 0-100 volume level
                set_volume = round(set_volume)          # round out decimal value
                set_volume = int(set_volume)            # cast volume as integer

                print ('Volume = {volume}%' .format(volume = set_volume))
                set_vol_cmd = 'sudo amixer cset numid=1 -- {volume}% > /dev/null' .format(volume = set_volume)
                os.system(set_vol_cmd)  # set volume

                if DEBUG:
                        print ("set_volume", set_volume)
                        print ("tri_pot_changed", set_volume)

                # save the potentiometer reading for the next loop
    last_read = trim_pot

        # hang out and do nothing for a half second
    time.sleep(0.5)

this code sends data to cayenne. But there it has not been edited to send the sensor data. have you just copy and paste the two codes? You need to edit some bit. the sensor data variable needs to be passed to cayenne using client.virtualWrite(1, data) where 1 is the channel and data is the variable in which sensor data is stored.