Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 4, 2019 16:46:41

shiyri
Зарегистрирован: 2019-07-09
Сообщения: 72
Репутация: +  0  -
Профиль   Отправить e-mail  

raspberry pi + arduino

Насколько я понял, надо это все запустить в качестве демона, и передавать данные переодически на открытие реле через gpio…..
Как это все сообразить?
Погуглил можно огранизовать связь между демоном и скриптом.
Смотрю на код глаза разбегаются, и сама передача переменных совсем не очевидна…..

Офлайн

#2 Авг. 7, 2019 18:56:18

shiyri
Зарегистрирован: 2019-07-09
Сообщения: 72
Репутация: +  0  -
Профиль   Отправить e-mail  

raspberry pi + arduino

Подскажите ПОЖАЛУЙСТА! Хочу это сделать автозапуском, как скрипт сделать бесконечным?

 #!/usr/bin/env python
# -*- coding: utf-8 -*-
import serial
import time
import RPi.GPIO as GPIO
import requests
import sys
import socket
GPIO.setmode(GPIO.BOARD)
GPIO.setup(33,GPIO.OUT)
GPIO.setup(35,GPIO.OUT)
GPIO.setup(37,GPIO.OUT)
GPIO.output(33,GPIO.HIGH)
GPIO.output(35,GPIO.HIGH)
GPIO.output(37,GPIO.HIGH)
ser = serial.Serial('/dev/ttyUSB1',9600)
ch = ser.readline()
mag = int(ch.encode('hex'),16)/100000-30
sock = socket.socket()
sock.bind(('', 9090))
sock.listen(1)
conn, addr = sock.accept()
print 'connected:', addr
while True:
        data = conn.recv(1024)
        if not data:
            break
        conn.send(data.upper())
        opcl, prop = data.split(" ", 2)
        print(opcl)
        print(prop)
        z = int(opcl)+1
        print(z)
        print(data.upper())
        if int(opcl) < 8:
            if (mag == 6):
                ex = 4
            elif (mag == 4):
                ex = 3
            else:
                ex = 6    
            var = 0
            while var < 30:
                GPIO.output(33,GPIO.LOW)
                GPIO.output(35,GPIO.LOW)
                ch = ser.readline()
                mag = int(ch.encode('HEX'),16)/100000-30
                print(mag)
                if (ex == mag):
                    GPIO.output(33,GPIO.HIGH)
                    GPIO.output(35,GPIO.HIGH)                    
                    link = "http://localhost/vd.php?pr="+prop
                    f = requests.get(link)
                    print(f.text)
                    break;
                    exit()
                var = var + 1
            else:
                GPIO.output(33,GPIO.HIGH)
                GPIO.output(35,GPIO.HIGH)
                GPIO.output(37,GPIO.HIGH)                
        else:
            if (mag < 4):
                ex = 4
            elif (mag > 5):
                ex = 3
            else:
                ex = 6    
            var = 0
            while var < 30:
                GPIO.output(33,GPIO.LOW)
                GPIO.output(37,GPIO.LOW)
                ch = ser.readline()
                mag = int(ch.encode('HEX'),16)/100000-30
                print(mag)
                if (ex == mag):
                    GPIO.output(33,GPIO.HIGH)
                    GPIO.output(37,GPIO.HIGH)                    
                    link2 = "http://localhost/vihod.php?pr="+prop
                    f2 = requests.get(link2)
                    print(f2.text)
                    break;
                    exit()
                var = var + 1
            else:
                GPIO.output(33,GPIO.HIGH)
                GPIO.output(35,GPIO.HIGH)
                GPIO.output(37,GPIO.HIGH)                
conn.close()

Офлайн

#3 Авг. 7, 2019 18:58:54

shiyri
Зарегистрирован: 2019-07-09
Сообщения: 72
Репутация: +  0  -
Профиль   Отправить e-mail  

raspberry pi + arduino

Конструкция WHILE i < n не помогает.

Офлайн

#4 Авг. 8, 2019 09:16:52

shiyri
Зарегистрирован: 2019-07-09
Сообщения: 72
Репутация: +  0  -
Профиль   Отправить e-mail  

raspberry pi + arduino

Я так понимаю надо чем то заменить break в этом месте:

 while True:
        data = conn.recv(1024)
        if not data:
            break

Офлайн

#5 Авг. 9, 2019 15:42:47

shiyri
Зарегистрирован: 2019-07-09
Сообщения: 72
Репутация: +  0  -
Профиль   Отправить e-mail  

raspberry pi + arduino

Разбираюсь с глобальными переменными, но в loop_a гллобальная переменная не поподает.

 #!/usr/bin/env python
# -*- coding: utf-8 -*-
from socket import *
import RPi.GPIO as GPIO
import time
import requests
import serial
from multiprocessing import Process
#данные сервера
host = 'localhost'
port = 9999
addr = (host,port)
ser = serial.Serial('/dev/ttyUSB1',9600)
ch = ser.readline()
mag = int(ch.encode('hex'),16)/100000-30
#socket - функция создания сокета 
#первый параметр socket_family может быть AF_INET или AF_UNIX
#второй параметр socket_type может быть SOCK_STREAM(для TCP) или SOCK_DGRAM(для UDP)
tcp_socket = socket(AF_INET, SOCK_STREAM)
#bind - связывает адрес и порт с сокетом
tcp_socket.bind(addr)
#listen - запускает прием TCP
tcp_socket.listen(2)
def loop_a():
#Бесконечный цикл работы программы
    while True:
        GPIO.setmode(GPIO.BOARD)
        GPIO.setup(33,GPIO.OUT)
        GPIO.setup(35,GPIO.OUT)
        GPIO.setup(37,GPIO.OUT)
        GPIO.output(33,GPIO.HIGH)
        GPIO.output(35,GPIO.HIGH)
        GPIO.output(37,GPIO.HIGH)
    
    #accept - принимает запрос и устанавливает соединение, (по умолчанию работает в блокирующем режиме)
    #устанавливает новый сокет соединения в переменную conn и адрес клиента в переменную addr
        conn, addr = tcp_socket.accept()    
    #recv - получает сообщение TCP
        data = conn.recv(1024)
    #если ничего не прислали, завершим программу
        if not data:
            conn.close()
            break
        else:
            print(data)
            conn.send(data.upper())
            opcl, prop = data.split(" ", 2)
            print(opcl)
            print(prop)            
            if int(opcl) < 8:
                if (mag == 6):
                    ex = 4
                elif (mag == 4):
                    ex = 3
                else:
                    ex = 6 
                var = 0
                if int(opcl) < 8:
                    while var < 50:
                        print(ex)
                        print(mag)
                        GPIO.output(33,GPIO.LOW)
                        GPIO.output(35,GPIO.LOW)                
                        time.sleep(0.1)
                        if (ex == mag):
                            GPIO.output(33,GPIO.HIGH)
                            GPIO.output(35,GPIO.HIGH)
                            GPIO.cleanup() 
                            link = "http://localhost/vd_mg.php?pr="+prop
                            f = requests.get(link)
                            print(f.text)
                            break;     
                        var = var + 1                        
                    else:
                        GPIO.output(33,GPIO.HIGH)
                        GPIO.output(35,GPIO.HIGH)
                        GPIO.output(37,GPIO.HIGH)
                        GPIO.cleanup() 
            else:
                if (mag < 4):
                    ex = 4
                elif (mag > 5):
                    ex = 3
                else:
                    ex = 6  
                var = 0
                while var < 50:
                    print(ex)
                    print(mag)
                    GPIO.output(33,GPIO.LOW)
                    GPIO.output(37,GPIO.LOW)
                    time.sleep(0.1)
                    if (ex == mag):
                        GPIO.output(33,GPIO.HIGH)
                        GPIO.output(37,GPIO.HIGH) 
                        GPIO.cleanup() 
                        link = "http://localhost/vd_mg.php?pr="+prop
                        f = requests.get(link)
                        print(f.text)
                        break;     
                    var = var + 1
                else:
                    GPIO.output(33,GPIO.HIGH)
                    GPIO.output(35,GPIO.HIGH)
                    GPIO.output(37,GPIO.HIGH)
                    GPIO.cleanup()  
            conn.close()
def loop_b():
    while True:
        global mag
        ch = ser.readline()        
        mag = int(ch.encode('HEX'),16)/100000-30        
                
if __name__ == '__main__':
    Process(target=loop_a).start()
    Process(target=loop_b).start()

Офлайн

#6 Авг. 10, 2019 10:34:37

shiyri
Зарегистрирован: 2019-07-09
Сообщения: 72
Репутация: +  0  -
Профиль   Отправить e-mail  

raspberry pi + arduino

Хелп ПОЖАЛСТА, как это работает, в смысле почему на выходе еденицы?

 from multiprocessing import Process
import time
var = 1
def loop_a():
    while 1:
        global var
        var = var +1
        time.sleep(1)
def loop_b():
    while 1:
        print(var)
        time.sleep(1)
if __name__ == '__main__':
    Process(target=loop_a).start()
    Process(target=loop_b).start()

Офлайн

#7 Авг. 10, 2019 21:18:11

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

raspberry pi + arduino

это разные процессы, передаются только аргументы функции.

Использовать мультипроцессинг без веского на то основания крайне не рекомендую.

В вашем случае не требуется даже многотредовость. Используйте асинхронность.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version