Raspberry pi virtual pin read with python

Hey everyone I have a raspberry pi running the latest version of blynk and I cannot find how to read the value of a virtual pin and make it the value of a variable in a python script. I am new to all of this so any help is useful thanks.

There is not a lot of information on the Blynk Python Library in this forum… but what there is can be found on the GitHub page and will show you the basics… look at the 03_virtual_write.py example and how it pulls the Slider Widget value into the variable value (or whatever you wish to name it).

Don’t forget to do some Googling about various python commands and formatting options.

thank you for your help and reply those resources were very useful.

i got my program running now using blynk but now once the while loop containing “colorwipe” “theater chase” and “rainbow” run a few times the terminal says “blynk server is offline, connection close” but it really isn’t.
any thoughts?

#!/usr/bin/env python3
# NeoPixel library strandtest example
# Author: Tony DiCola (tony@tonydicola.com)
#
# Direct port of the Arduino NeoPixel library strandtest example.  Showcases
# various animations on a strip of NeoPixels.
import BlynkLib
import time
from neopixel import *
import argparse

# LED strip configuration:
LED_COUNT      = 74      # Number of LED pixels.
LED_PIN        = 18      # GPIO pin connected to the pixels (18 uses PWM!).
#LED_PIN       = 10      # GPIO pin connected to the pixels (10 uses SPI /dev/spidev0.0).
LED_FREQ_HZ    = 800000  # LED signal frequency in hertz (usually 800khz)
LED_DMA        = 10      # DMA channel to use for generating signal (try 10)
LED_BRIGHTNESS = 255     # Set to 0 for darkest and 255 for brightest
LED_INVERT     = False   # True to invert the signal (when using NPN transistor level shift)
LED_CHANNEL    = 0       # set to '1' for GPIOs 13, 19, 41, 45 or 53



# Define functions which animate LEDs in various ways.
def colorWipe(strip, color, wait_ms=50):
    """Wipe color across display a pixel at a time."""
    for i in range(strip.numPixels()):
        strip.setPixelColor(i, color)
        strip.show()
        time.sleep(wait_ms/1000.0)

def theaterChase(strip, color, wait_ms=50, iterations=10):
    """Movie theater light style chaser animation."""
    for j in range(iterations):
        for q in range(3):
            for i in range(0, strip.numPixels(), 3):
                strip.setPixelColor(i+q, color)
            strip.show()
            time.sleep(wait_ms/1000.0)
            for i in range(0, strip.numPixels(), 3):
                strip.setPixelColor(i+q, 0)

def wheel(pos):
    """Generate rainbow colors across 0-255 positions."""
    if pos < 85:
        return Color(pos * 3, 255 - pos * 3, 0)
    elif pos < 170:
        pos -= 85
        return Color(255 - pos * 3, 0, pos * 3)
    else:
        pos -= 170
        return Color(0, pos * 3, 255 - pos * 3)

def rainbow(strip, wait_ms=20, iterations=1):
    """Draw rainbow that fades across all pixels at once."""
    for j in range(256*iterations):
        for i in range(strip.numPixels()):
            strip.setPixelColor(i, wheel((i+j) & 255))
        strip.show()
        time.sleep(wait_ms/1000.0)

def rainbowCycle(strip, wait_ms=20, iterations=5):
    """Draw rainbow that uniformly distributes itself across all pixels."""
    for j in range(256*iterations):
        for i in range(strip.numPixels()):
            strip.setPixelColor(i, wheel((int(i * 256 / strip.numPixels()) + j) & 255))
        strip.show()
        time.sleep(wait_ms/1000.0)

def theaterChaseRainbow(strip, wait_ms=50):
    """Rainbow movie theater light style chaser animation."""
    for j in range(256):
        for q in range(3):
            for i in range(0, strip.numPixels(), 3):
                strip.setPixelColor(i+q, wheel((i+j) % 255))
            strip.show()
            time.sleep(wait_ms/1000.0)
            for i in range(0, strip.numPixels(), 3):
                strip.setPixelColor(i+q, 0)


BLYNK_AUTH = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'

blynk = BlynkLib.Blynk(BLYNK_AUTH)


# Main program logic follows:
if __name__ == '__main__':
    # Process arguments
    parser = argparse.ArgumentParser()
    parser.add_argument('-c', '--clear', action='store_true', help='clear the display on exit')
    args = parser.parse_args()

    # Create NeoPixel object with appropriate configuration.
    strip = Adafruit_NeoPixel(LED_COUNT, LED_PIN, LED_FREQ_HZ, LED_DMA, LED_INVERT, LED_BRIGHTNESS, LED_CHANNEL)
    # Intialize the library (must be called once before other functions).
    strip.begin()

    print ('Press Ctrl-C to quit.')
    if not args.clear:
        print('Use "-c" argument to clear LEDs on exit')

    try:
        while True: 
            @blynk.VIRTUAL_WRITE(3)
            def v3_write_handler(value):
                print("bananas")
                              
                while int(value) == 1:
                    print ('Color wipe animations.')
                    colorWipe(strip, Color(255, 0, 0))  # Red wipe
                    colorWipe(strip, Color(0, 255, 0))  # Blue wipe
                    colorWipe(strip, Color(0, 0, 255))  # Green wipe
                    blynk.sync_virtual(3)
                    break
                while int(value) == 2:
                    print ('Theater chase animations.')
                    theaterChase(strip, Color(127, 127, 127))  # White theater chase
                    theaterChase(strip, Color(127,   0,   0))  # Red theater chase
                    theaterChase(strip, Color(  0,   0, 127))  # Blue theater chase
                    break
                while int(value) == 3:
                    print ('Rainbow animations.')
                    rainbow(strip)
                    rainbowCycle(strip)
                    theaterChaseRainbow(strip)
                    break
            blynk.run()
 
    except KeyboardInterrupt:
        if args.clear:
            colorWipe(strip, Color(0,0,0), 10)

Blynk requires a relatively constant link to the server else it will give heartbeat errors then disconnect.

So any coding methods that block background operations from the Blynk library will cause issues.

Many NeoPixel loops in C++ are considered blocking… AKA no other processing is done until their internal loop conditions are met. This is a bad thing in Blynk.

Now, I understand Python and RPi should be able to handle multiple threading and such much better than C++ in ESP and Arduino, but I am not all that proficient in python to tell you exactly the issue in your case, or solution… :blush: but I would seriously suggest you Google threading options in python for your NeoPixel routines.

See here for an example on how to run Blynk multi-threaded with Python: