ewanpth
Posts: 7
Joined: Tue Oct 20, 2015 3:41 pm

PIGPIOD script only works under certain conditions

Tue Jan 19, 2016 3:56 pm

Hi all,

I've written a simple python GUI which uses data from a micrometer based on a script Joan wrote in this thread using PIGPIOD:
viewtopic.php?p=830514#p830514

If I boot up my Pi and run my script, it doesn't work as it should. It is supposed to display a value which is read from the micrometer but instead it displays a blank value.

BUT if I run Joan's original script, close it, and run my script, it works perfectly.

I really can't work out what's going on here, any ideas?

Joans original reader script:

Code: Select all

import time
import pigpio

CLOCK=21
DATA=20

g_level=0
g_reading=0
g_bits=0

def show(bits, value):

   inch = value & (1<<23)
   minus = value & (1<<20)

   value = value & 0xfffff

   if inch:
      reading = value / 2000.0
      units = "in"
   else:
      reading = value / 100.0
      units = "mm"

   if minus:
      sign = "-"
   else:
      sign = ""

   print("{} {:.3f} {}".format(sign, reading, units))

def cbf(g, l, t):
   global g_level, g_reading, g_bits
   if g == DATA:
      if l == 0:
         g_level = 1
      else:
         g_level = 0
   elif g == CLOCK:
      if l == pigpio.TIMEOUT:
         if g_bits > 10:
            show(g_bits, g_reading)
            g_reading=0
            g_bits=0
      elif l == 0:
          g_reading = g_reading | (g_level<<g_bits)
          g_bits += 1

pi = pigpio.pi()

pi.set_mode(CLOCK, pigpio.INPUT)
pi.set_mode(DATA, pigpio.INPUT)

cb1 = pi.callback(DATA, pigpio.EITHER_EDGE, cbf)
cb2 = pi.callback(CLOCK, pigpio.EITHER_EDGE, cbf)
pi.set_watchdog(CLOCK, 20) # 20 ms reading timeout

time.sleep(120)

cb2.cancel()
cb1.cancel()
pi.stop()
My GUI script:

Code: Select all

import datetime
import csv
from tkinter import *
from tkinter import messagebox
import time
import pigpio
import os

os.system("sudo pigpiod")


root = Tk()

winx = 480
winy = 320 


CLOCK=21
DATA=20

g_level=0
g_reading=0
g_bits=0

pi = pigpio.pi()


pi.set_mode(CLOCK, pigpio.INPUT) #sets clock as input
pi.set_mode(DATA, pigpio.INPUT) #sets data as input


virtual_reading = StringVar()

def go():
   global cb1
   global cb2
   cb1 = pi.callback(DATA, pigpio.EITHER_EDGE, cbf)
   cb2 = pi.callback(CLOCK, pigpio.EITHER_EDGE, cbf)


def show(bits, value):

   inch = value & (1<<23)
   minus = value & (1<<20)

   value = value & 0xfffff

   if inch:
      reading = value / 2000.0
      units = "in"
   else:
      reading = value / 100.0
      units = "mm"

   if minus:
      sign = "-"
   else:
      sign = ""
   virtual_reading.set("{} {:.3f} {}".format(sign, reading, units))
   print(virtual_reading.get())


def measure(event=None):
    todays_date = datetime.date.today()  
    try:
        get_tool_no = int(tool_no_entry.get())
        if get_tool_no <= 0:
            messagebox.showerror("Try Again","Please Enter A Number")
        else:
            with open("thickness records.csv", "a") as thicknessdb: 
                thicknessdbWriter = csv.writer(thicknessdb, dialect='excel', lineterminator='\r')
                thicknessdbWriter.writerow([get_tool_no] + [todays_date] + [virtual_reading.get()])
            thicknessdb.close()
    except:
           messagebox.showerror("Try Again","Please Enter A Number")
    tool_no_entry.delete(0, END)


def cbf(g, l, t):
   global g_level, g_reading, g_bits
   if g == DATA:
      if l == 0:
         g_level = 1
      else:
         g_level = 0
   elif g == CLOCK:
      if l == pigpio.TIMEOUT:
         if g_bits > 10:
            show(g_bits, g_reading)
            g_reading=0
            g_bits=0
      elif l == 0:
          g_reading = g_reading | (g_level<<g_bits)
          g_bits += 1
   
 
go()


record_button = Button(root,width = 30,
                               height = 8,
                               text='Measure',
                               fg='black',
                               bg="light grey", command = measure)

tool_no_entry = Entry(root)

reading_display = Label(root, font=("Helvetica", 22), textvariable = virtual_reading)

reading_display.place(x = 50, y =80)


root.resizable(width=FALSE, height=FALSE) 
root.geometry('%dx%d' % (winx,winy)) 
root.title("Micrometer Reader V1.0")


record_button.place(x = 340, y = 100, anchor = CENTER)


tool_no_entry.place(x = 120, y = 250, anchor=CENTER)
tool_no_entry.focus_set()


root.bind("<Return>", measure)
  

root.mainloop()

cb2.cancel()
cb1.cancel()
pi.stop()

ewanpth
Posts: 7
Joined: Tue Oct 20, 2015 3:41 pm

Re: PIGPIOD script only works under certain conditions

Mon Jan 25, 2016 2:34 pm

Bump.

I've tried a few different things but still haven't been able to fix this.

Return to “Interfacing (DSI, CSI, I2C, etc.)”