Låter klokt
Borre men vet inte hur jag ska importera en sån lista till loggprogrammet. När du säger det så vet jag faktiskt inte ens hur/om jag importera från en databas till programmet.
Den frågan får ställas i
lizerboy
tråd.
Här kommer i alla fall allt jag har om projektet. Det mesta ser ut som skit, men jag kan inte bättre än så.
Hittar ni några direkta fel så skulle jag uppskatta om ni tar upp det i tråden så vi alla kan ta lärdom.
BoM:en ligger schematic-filen och om jag inte minns fel så handlade jag samtliga komponenter hos electrokit.
Något jag skulle vilja förbättra är att routa om kortet så jag slipper jumpern, samt hitta andra avkopplingskondingar (dom jag köpte är lite för stora och tar i RPi:n).
Det behövs inte heller en 8-kanalig ADC, valde det pga ett par extra bitar och electrokit hade såna hemma i DIP-kapsel.
Säg till om jag missat något!
Ja just det. Bidogat i zippen är också ett footprint till de 3,5mm-jack jag använt.
Trodde aldrig det kunde bli så bra genom att bara sitta och mäta med skjutmått men jacken bokstavligt klickade i kortet (inkl. de två små små styrningarna under). Det är electrokit artnr
41012983.
Fasloggern.zip
Kod: Markera allt
import spidev
from time import sleep
import os
import math
import struct
import socket
import sys
# Open SPI bus
spi = spidev.SpiDev()
spi.open(0,0)
# Init channels
phaseL1 = 0
phaseL2 = 1
phaseL3 = 2
sleepTime = 1
Vref = 2.5
#Open TCP socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_address = ('192.168.1.8', 5004)
sock.connect(server_address)
print("Connected with: %s on %s" % server_address)
def getReading(channel):
# Extract raw data from ADC
rawData = spi.xfer([(4 + ((8 + channel) >> 2)), ((8 + channel) << 6) & 192, 0])
# Process the raw data into bits
processedData = ((rawData[1]&15) << 8) + rawData[2]
return processedData
def sendSample(sampL1, sampL2, sampL3):
display_stringL1 = ("%.2f" % sampL1)
display_stringL2 = ("%.2f" % sampL2)
display_stringL3 = ("%.2f" % sampL3)
bytesL1 = display_stringL1.encode('ascii')
bytesL2 = display_stringL2.encode('ascii')
bytesL3 = display_stringL3.encode('ascii')
separator = ":"
bytes = bytesL1
sock.send(bytes)
bytes = str.encode(separator)
sock.send(bytes)
bytes = bytesL2
sock.send(bytes)
bytes = str.encode(separator)
sock.send(bytes)
bytes = bytesL3
sock.send(bytes)
newline_string = "\n"
bytes = str.encode(newline_string)
sock.send(bytes)
print("Sent %s to server" % display_stringL1)
def doSampling(phase):
table_of_samples = []
zeroCrossing = 0
rms_voltage = 0
#Take 1024 adc samples and add these to table. Also summarize the for calc of
#the zero crossing level
for i in range(1023):
data = getReading(phase)
zeroCrossing = (zeroCrossing + data)
table_of_samples.append(data)
sleep(0.0005)
#Calculate the zero crossing level
zeroCrossing = (zeroCrossing/1024)
#Remove zero crossing value from each sample to remove DC-bias in circuit
for i in range(1023):
table_of_samples[i] = (table_of_samples[i]-zeroCrossing)
#Muiltiply each sample to the power of 2.
for i in range(1023):
table_of_samples[i] = (table_of_samples[i] **2)
#Finally, summarize all computed samples and calculate RMS value
for i in range(1023):
rms_voltage += table_of_samples[i]
rms_voltage = (rms_voltage/1024)
rms_voltage = math.sqrt(rms_voltage)
rms_voltage = (rms_voltage * (Vref/4096))
#Convert measured voltage into RMS current based on V/A from clamp
rms_current = (rms_voltage * 30)
return rms_current
while True:
rms_current_L1 = doSampling(phaseL1)
rms_current_L2 = doSampling(phaseL2)
rms_current_L3 = doSampling(phaseL3)
sendSample(rms_current_L1, rms_current_L2, rms_current_L3)
#sleep(sleepTime)
sock.close()
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.