Hi,

I have Davis VP2 station with RPi3 and weewx ver. 3.9.2 for about year. 
Everything is running flawlessly. Because station is in remote location, 
everything is powered with industrial PSU with battery backup. I have idea 
to add weewx service for voltage monitoring purposes.

For DAC ADS1115 chip is working. Breakout boards widely available in the 
market. For reading data I use testADS1115.py script from DataLogger 
SwitchDoc Labs.

#!/usr/bin/python

#SwitchDoc Labs May 2016
#
# reads all four channels from the Grove4Ch16BitADC Board in single ended 
mode
# also reads raw values
#


import time, signal, sys

from MADS1x15 import ADS1x15

def signal_handler(signal, frame):
        print 'You pressed Ctrl+C!'
        sys.exit(0)
signal.signal(signal.SIGINT, signal_handler)
#print 'Press Ctrl+C to exit'

ADS1115 = 0x01  # 16-bit ADC

# Select the gain
gain = 6144  # +/- 6.144V
#gain = 4096  # +/- 4.096V
# gain = 2048  # +/- 2.048V
# gain = 1024  # +/- 1.024V
# gain = 512   # +/- 0.512V
# gain = 256   # +/- 0.256V

# Select the sample rate
# sps = 8    # 8 samples per second
# sps = 16   # 16 samples per second
# sps = 32   # 32 samples per second
# sps = 64   # 64 samples per second
# sps = 128  # 128 samples per second
sps = 250  # 250 samples per second
# sps = 475  # 475 samples per second
# sps = 860  # 860 samples per second

# Initialise the ADC using the default mode (use default I2C address)
adc = ADS1x15(ic=ADS1115)
while (1):

        # Read channels  in single-ended mode using the settings above

        print"--------------------"
        voltsCh0 = adc.readADCSingleEnded(0, gain, sps) / 1000
        rawCh0 = adc.readRAW_ADCSingleEnded(0, gain, sps)
        print "Channel 0 =%.6fV raw=%d raw=0x%4X" % (voltsCh0, rawCh0, 
rawCh0)

        voltsCh1 = adc.readADCSingleEnded(1, gain, sps) / 1000
        rawCh1 = adc.readRAW_ADCSingleEnded(1, gain, sps)

    # O2 Sensor
        sensorVoltage = voltsCh1 *(5.0/6.144)
    AMP  = 121
    K_O2  = 7.43
        sensorVoltage = sensorVoltage/AMP*10000.0
        Value_O2 = sensorVoltage/K_O2 - 1.05
    print "Channel 1 =%.6fV raw=0x%4X O2 Percent=%6.2f" % (voltsCh1, rawCh1, 
Value_O2)

        voltsCh2 = adc.readADCSingleEnded(2, gain, sps) / 1000
        rawCh2 = adc.readRAW_ADCSingleEnded(2, gain, sps)
        print "Channel 2 =%.6fV raw=0x%4X" % (voltsCh2, rawCh2)

        voltsCh3 = adc.readADCSingleEnded(3, gain, sps) / 1000
        rawCh3 = adc.readRAW_ADCSingleEnded(3, gain, sps)
        print "Channel 3 =%.6fV raw=0x%4X" % (voltsCh3, rawCh3)
        print"--------------------"

        time.sleep(0.5)


and output is like this:

--------------------
Channel 0 =0.000000V
Channel 1 =0.000000V
Channel 2 =0.000000V
Channel 3 =0.000000V
--------------------



Is possible to write voltage readings from all four channels to separate 
sqlite database and then graph acquired data ?
Looks like AS3935 lightning sensor weewx service is good example.
I modified as3935.py to create proper database for all voltage channels, 
but how to read voltage data and write them to sqlite?

from MADS1x15 import ADS1x15
import time
import syslog
import weewx
import weewx.manager
from datetime import datetime
from weewx.wxengine import StdService
from weeutil.weeutil import to_bool

VERSION = "0.1"

if weewx.__version__ < "3.2":
    raise weewx.UnsupportedFeature("weewx 3 is required, found %s" %
                                   weewx.__version__)


schema = [('dateTime', 'INTEGER NOT NULL PRIMARY KEY'),
          ('usUnits', 'INTEGER NOT NULL'),
          ('ch0_voltage', 'REAL'),
          ('ch1_voltage', 'REAL'),
          ('ch2_voltage', 'REAL'),
          ('ch3_voltage', 'REAL'),]

def get_default_binding_dict():
    return {'database': 'voltage_sqlite',
            'manager': 'weewx.manager.Manager',
            'table_name': 'archive',
            'schema': 'user.ads1115.schema'}

def logmsg(level, msg):
    syslog.syslog(level, 'ads1115: %s' % msg)

def logdbg(msg):
    logmsg(syslog.LOG_DEBUG, msg)

def loginf(msg):
    logmsg(syslog.LOG_INFO, msg)

def logerr(msg):
    logmsg(syslog.LOG_ERR, msg)

class ADS1115(StdService):
    def __init__(self, engine, config_dict):
        super(ADS1115, self).__init__(engine, config_dict)
        loginf("service version is %s" % VERSION)
        svc_dict = config_dict.get('ADS1115', {})
        self.data_binding = svc_dict.get('data_binding', None)
        loginf("data_binding=%s" % self.data_binding)
        pkt_binding = svc_dict.get('binding', 'archive')
        loginf("binding=%s" % pkt_binding)

        self.data = []

        # if a binding was specified, then use it to save voltage readings 
to database
        if self.data_binding is not None:
            # configure the voltage database
            dbm_dict = weewx.manager.get_manager_dict(
                config_dict['DataBindings'], config_dict['Databases'],
                self.data_binding, default_binding_dict=
get_default_binding_dict())
            with weewx.manager.open_manager(dbm_dict, initialize=True) as 
dbm:
                # ensure schema on disk matches schema in memory
                dbcol = dbm.connection.columnsOf(dbm.table_name)
                memcol = [x[0] for x in dbm_dict['schema']]
                if dbcol != memcol:
                    raise Exception('ads1115: schema mismatch: %s != %s' %
                                    (dbcol, memcol))



Thanks

Andrej

-- 
You received this message because you are subscribed to the Google Groups 
"weewx-user" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to weewx-user+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/weewx-user/c37f6302-c692-415c-b6c5-97c040e2c680%40googlegroups.com.

Reply via email to