UART Creation Problem
-
I have two Wipy 3.0s. The following code works fine on one, but on the other uart1 does not get created. I am putting these boards into the one hardware setup. The only difference is the boards themselves. Is there a hardware failure that would cause this error?
The REPL error is at the end of this post.
from machine import UART # for serial communication from utime import sleep # For delaying in seconds, MicroPython version import time def sdi_setup(): # initialize UART port to communicate with SDI-12 translator board uart1 = UART(1, baudrate=9600, pins=('P9','P10')) # init with given UART port & baudrate (tx, rx) uart1.init(baudrate=9600, bits=8, parity=None, stop=1, pins=('P9','P10'), timeout_chars=10) # init with given parameters print(uart1) global sdi_12_address # setup SDI-12 addresses. Valid addresses are single character. sdi_12_address='' #user_sdi_12_address=input('Enter all SDI-12 sensor addresses, such as 1234:') user_sdi_12_address = '01' user_sdi_12_address=user_sdi_12_address.strip() # Remove any \r from an input file typed in windows for an_address in user_sdi_12_address: if ((an_address>='0') and (an_address<='9')) or ((an_address>='A') and (an_address<='Z')) or ((an_address>='a') and (an_address<='z')): print("Using address:",an_address); sdi_12_address=sdi_12_address+an_address else: print('Invalid address:',an_address) def sensor_info(): global sdi_12_address sensor_dict = {} # init dictionary to hold sensor info for an_address in sdi_12_address: # print(an_address+'I!') uart1.write(an_address+'I!') sleep(1) #give time for sensor to respond sdi_12_line=uart1.readline().decode().strip() sensor_txt = 'Sensor address & info,' + an_address + ',' + sdi_12_line + '\n' print(sensor_txt) sensor_info=sdi_12_line.split(',') # create list of values sensor_dict[an_address] = sensor_info # store in dict, sensor address is the key print(sensor_dict) return sensor_dict def sensor_measurement(): measurement_dict = {} # initialize dictionary to hold measurement values for j in sdi_12_address: str_j = str(j) uart1.write(str_j + 'M!') sleep(1) # keep at or above 1 second to ensure all respones from sensor are captured meas_delay = uart1.readall().decode().strip() # read sensor response, time until ready meas_delay = meas_delay[len(str_j):] try: meas_delay = float(meas_delay[:3]) except: meas_delay = 3 print ('Delay exception') sleep(meas_delay) # sleep until measurement is ready uart1.write(str_j + 'D0!') # tell sensor to send data sleep(.5) # dealy to allow data to be sent to UART sensor_values = uart1.readall().decode().strip().replace('+',',') # read data now = time.localtime() time_stamp = "%04d/%02d/%02d,%02d:%02d:%02d" % (now[0], now[1], now[2], now[3], now[4], now[5]) sensor_values=sensor_values.split(',') # create list of values sensor_values.pop(0) # remove sensor address from list sensor_values = [float(i) for i in sensor_values] # clean data, convert to floats sensor_values.insert(0,time_stamp) # add timestamp as first value of list measurement_dict[j] = sensor_values # store in dict, sensor address is the key print(measurement_dict) return measurement_dict if __name__ == "__main__": sdi_setup() sensor_info() sensor_measurement()configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:1
load:0x3fff8028,len:8
load:0x3fff8030,len:1728
load:0x4009fa00,len:0
load:0x4009fa00,len:14584
entry 0x400a059c
WLAN connected ip 192.168.1.52 gateway 192.168.1.1
SD card mounted
None
SD card found
2018-07-22T01:17:48+00:00
/sd/20180722.csv
UART(1, baudrate=9600, bits=8, parity=None, stop=1)
Using address: 0
Using address: 1
Traceback (most recent call last):
File "main.py", line 5, in <module>
File "/sd/sd_main.py", line 85, in <module>
File "/sd/measure.py", line 32, in sensor_info
NameError: name 'uart1' is not defined
Pycom MicroPython 1.18.0 [v1.8.6-849-046b350] on 2018-06-01; WiPy with ESP32
Type "help()" for more information. -
@jmpratt The error tells that uart1 is not defined in sensor_info(), which is obvious, because it is not in scope. You may have to declare uart1 global in sdi_setup(), sensor_info() and sensor_measurement, like you did with sdi_12_address.
You may consider to put that all into a class, or hand over uart1 and sdi_12_address between the functions by return values and functions arguments. That make information passing more clear.
-
@robert-hh Thanks. I'll rewrite that part of the code.
However, why would this code work on one WiPy and not the other? That makes me thing there is another, hardware specific issue.
-
@jmpratt I cannot believe that you have the same code on both WiPy's. Please reload the code to both devices, reset them and try.
Hello! It looks like you're interested in this conversation, but you don't have an account yet.
Getting fed up of having to scroll through the same posts each visit? When you register for an account, you'll always come back to exactly where you were before, and choose to be notified of new replies (either via email, or push notification). You'll also be able to save bookmarks and upvote posts to show your appreciation to other community members.
With your input, this post could be even better 💗
Register Login