python threads

Python je programski jezik opće namjene, interpretiran i visoke razine.
6 post(ov)a • Stranica: 1/1.

python threads

PostPostao/la focker3 » 23 lip 2015, 14:07

kao prvo, pozdrav svima :-H

radim za fax "meterološku stanicu" sa raspberry pi-em sa anemometrom (očitavanje brzine vjetra) i dht22 (temperatura i vlaga). glavni zadatak je koristiti dretve. anemometar koristi običan reed switch koji zatvara strujni krug prolazom magneta (funkcionira ko obično tipkalo) svaki krug te se mjeri kolko dugo je strujni krug bio zatvoren te se za to koriste GPIO.add_event_detect i GPIO.add_event_callback. dht22 je običan senzor za koji postoji knjižnica i samo se pozove i vrati trenutnu temp i vlagu. problem je u tome što GPIO.add_event_detect uvijek čeka na prolaz magneta i ne znam kako da dodam još jednu dretvu k tome koja će svako određeno vrijeme pozvati funkciju od dht22, osim još jedan GPIO.add_event_detect pa bi to funkcioniralo preko tipkala što nije baš poželjno. relativno sam nov što se tiče pythona a dretve su mi potpuno nove.

ako ima koja dobra duša koja zna, može i želi pomoć bio bi zahvalan do groba a možemo se dogovoriti i za drugi način zahvale (mislim na piće :D )

evo i kod koji imam za sad. podaci se šalju u bazu i emoncms. sve radi kako treba osim što se temperatura i vlaga ispisuju tek kada se izađe iz skripte sa control+c

python code
#!/usr/bin/python

import sys
import Adafruit_DHT
import time
import datetime
import httplib
import json
import MySQLdb
from time import sleep
import RPi.GPIO as GPIO

GPIO.setmode(GPIO.BCM)
GPIO.setup(27, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) #pin that the anemometer is connected to
GPIO.setup(22, GPIO.OUT) # pin that the LED is connected to

timer = time.time() # initialise the timer
fast_time = -1 # TODO: future use

domain = "localhost"
emoncmspath = "emoncms"
apikey = "-----------------------"


def db_conn(wind):
db = MySQLdb.connect("localhost","root","raspberry","anemo")
cursor = db.cursor()
sql = "INSERT INTO Brzina(brzina) VALUES(%s)" %(wind)
cursor.execute(sql)
db.commit()
db.close()
if (datetime.now().second%5 == 0):
conn = httplib.HTTPConnection(domain)
conn.request("GET", "/emoncms/input/post.json?nodeid=3&json={wind:"+wind+"}&apikey="+apikey)


def wind_ping(channel):
global timer
global fast_time
cur_time = (time.time() - timer) # time for half a revolution
wind_speed = 0.667 / cur_time # reworked from the datasheet
if wind_speed < 200: # add bounce detection here
if cur_time < fast_time:
fast_time = cur_time
#wind = "%10.4f" % wind_speed # convert the float number to a string
wind= str(round(wind_speed))
wind_speed = wind_speed * 2.236936 # apply the multiplier to calculate miles per hour
windmph_str = "%10.4f" % wind_speed
#windmph_str= str(round(wind_speed))
cur_str = "%10.4f" % cur_time
# will print the measurements to screen for each pulse detected
print "Wind Speed: " + wind + " m/s, " + windmph_str + " mph, time: " + cur_str
db_conn(wind)
timer = time.time() #reset the timer for the next revolution
GPIO.output(22, not GPIO.input(22)) # alternate the LED state

GPIO.add_event_detect(27,GPIO.FALLING, bouncetime=30) #threaded event, to detect the # voltage falling on anemometer (pin 18)
GPIO.add_event_callback(27,wind_ping) # tell the event to call procedure above

try:
while True: # loop to keep the program alive
sleep(5)

except KeyboardInterrupt:
GPIO.cleanup() # reset the GPIO pins when you press ctrl

humidity, temperature = Adafruit_DHT.read_retry(Adafruit_DHT.DHT22, 4)
if humidity is not None and temperature is not None:
print 'Temperature={0:0.1f}*C Humidity={1:0.1f}%'.format(temperature, humidity)
temp = str(round(temperature))
hum = str(round(humidity))
db = MySQLdb.connect("localhost","root","raspberry","dht")
cursor = db.cursor()
sql = "INSERT INTO Senzor(vrijeme, temperatura, vlaga) VALUES(NOW(), %s, %s)" %(temperature, humidity)
cursor.execute(sql)
db.commit()
db.close()
conn = httplib.HTTPConnection(domain)
conn.request("GET", "/"+emoncmspath+"/input/post.json?nodeid=3&json={temp:"+temp+",hum:"+hum+"}&apikey="+apikey)
else:
print 'Failed to get reading. Try again!'

Re: python threads

PostPostao/la gagiD » 24 lip 2015, 02:24

python3 code
try:
while True: # loop to keep the program alive
sleep(5)

except KeyboardInterrupt:
GPIO.cleanup() # reset the GPIO pins when you press ctrl


Kolko vidim, ovo je beskonacna petlja a Ctr+C pokrene KeyboardInterrupt event pa se nastavi dalje tj. ispisivanje na stdout i u bazu podataka.

Pretpostavljam da zelis uraditi ispisivanja periodicno. Evo banalan primjer kako da se ispise text 4 puta u sekundi:
python3 code
#!/usr/bin/env python
#-*- coding:utf-8 -*-

import threading;

def someFun():
threading.Timer(0.25, someFun).start()
print("some text")

someFun()


btw. dobrodosao :)

Re: python threads

PostPostao/la focker3 » 26 lip 2015, 13:19

hvala na odgovoru i dobrodošlici :D riješio sam problem sa dretvom unutar funkcije, a funkcija se onda poziva unutar glavnog dijela programa

dodana linija koda:

threading.Timer(5, dht).start()

Re: python threads

PostPostao/la peristil » 16 ožu 2016, 17:51

Dobar dan.

Rjesavam za fax neke zadatke u Pythonu i do sada nisam imala problema a sad sam malo zapela i ne znam kako rjesiti ove zadatke. Nisam se do sada susretala s Pythonom niti sam ikada radila u tom programu pa ako ima netko kome bi mogla poslati zadatke pa da mi malo pomogne. Bila bi zahvalna.
Je li postoji mogucnost na ovom forumu poslat privatnu poruku nekom clanu?

Re: python threads

PostPostao/la nemesis » 16 ožu 2016, 21:09

peristil je napisao/la:Dobar dan.

Rjesavam za fax neke zadatke u Pythonu i do sada nisam imala problema a sad sam malo zapela i ne znam kako rjesiti ove zadatke. Nisam se do sada susretala s Pythonom niti sam ikada radila u tom programu pa ako ima netko kome bi mogla poslati zadatke pa da mi malo pomogne. Bila bi zahvalna.
Je li postoji mogucnost na ovom forumu poslat privatnu poruku nekom clanu?


pa postavi zadatke ovdje na forum kako bi odgovorili drugi korisnici i takodjer oni koji imaju slican problem da ne postavljaju pitanja ako vec mogu naci odgovor, ovaj forum bi izgubio citav smisao kada bi se zadaci slali samo na PP, samo ti postavi, javice se neko ko ce odogovoriti

Re: python threads

PostPostao/la peristil » 17 ožu 2016, 12:02

Ivan, Marko i Ante vole igrati pikado. Najdraža igra im je “180” gdje je cilj što prije doći do nule. Igra se tako da svatko od njih ima tri strelice i kada ih istroše igra sljedeći igrač. Moguće je pogoditi brojeve od 1 do 20 s tim da postoje i mjesta gdje se bodovi množe duplo i tri puta, ali naravno što se broj bodova više množi to je polje manje i teže ga je pogoditi. Naravno tu su još dva polja u sredini - stroga sredina što nosi 50 bodova i vanjska sredina što nosi 25 bodova.

Broj ukupnih bodova svakog igrača se smanjuje s brojem bodova koje pogodi ali ako broj bodova ode ispod nule (npr. broj preostalih bodova igrača je 15 a on pogodi 20) onda je to nevažeća runda i igra sljedeći igrač.
Igrači vole gađati, ako mogu, što teže mete tako da im prioriteti meta idu redom:
● stroga sredina (innerbullseye)
● vanjska sredina (outerbullseye)
● puta tri (triple)
● puta dva (double)
● broj

Igra se zadnja runda i svaki igrač je pogodio barem 20 bodova.
Napiši program koji bi jednom igraču na osnovu njegovih preostalih bodova pokazao koje mete treba gađati poredanih po težini.

ULAZNI PODACI
U prvom retku nalazi se prirodan broj N (0 ≤ N ≤ 160), broj preostalih bodova u zadnjoj rundi.

IZLAZNI PODACI
U tri retka treba ispisati mete poredane po težini koje igrač treba gađati .


NAPOMENA : innerbullseye – iBE, outerbullseye – oBE, triple - t#, double – d#.

Ja sam to ovako rjesila:
bodovi = int (input ('Unesi preostali broj bodova u zadnjoj rundi: '))

def ispis_rjesenja(broj):
if(broj == 50):
return'iBE'
elif(broj == 25):
return'oBE'
elif (broj == 0):
return'0'
elif (broj % 3 == 0) :
return't%d' %(broj/3)
elif (broj % 2 == 0) :
return'd%d' %(broj/2)
else :
return str(broj)


def pikado(bodovi, lista):
for k in lista:
bodovi -= k
for j in lista:
bodovi -= j
if(bodovi in lista):
print(print_rjesenje(k))
print(print_rjesenje(j))
print(print_rjesenje(bodovi))
return
bodovi += j
bodovi += k
return

lista = []
lista.append(50)
lista.append(25)

for i in range(20, 0, -1):
lista.append(i*3)
for i in range(20, 0, -1):
if(i*2 not in lista):
lista.append(i*2)
for i in range(20, 0, -1):
if(i not in lista):
lista.append(i)
lista.append(0)


n = input()
pikado(n, lista)


ali mi ne radi kako treba


6 post(ov)a • Stranica: 1/1.

Na mreži

Trenutno korisnika/ca: / i 1 gost.