Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - Zum C-Control-I-Forum - Zum C-Control-II-Forum

Re: Verbindung zu Raspberry Kategorie: Pro-Bot128 (von Daneie - 15.02.2017 9:10)
Als Antwort auf Verbindung zu Raspberry von Matthias - 14.02.2017 23:32
Ich nutze:
C-Control Pro Mega128, C-Control Pro AVR32, eigenes Board
> Hallo,
>
> ich habe vor kurzem meine Probot ausgepackt und ein wenig damit herumgespielt.
> Mir kam schnell der Gedanke, dass es interessant wäre den Probot mit ein bisschen
> Computervision oder Sprachverarbeitung etwas intelligenter zu machen.
> Nett wäre es, wenn der Probot beispielsweise auf Gesten oder Worte reagieren könnte.
> Dazu würde ich gerne meinen Raspberry mit dem Probot kommunizieren lassen.  
> Die Frage ist, wie verbinde ich die beiden miteinander, damit der Raspberry dem Probot Befehle
> scicken kann und auch umgekehrt. Ich würde ungerne das USB-Kabel benutzen.
>
> Ich hoffe ihr könnt mir da helfen :-)
>
> Viele Grüße
> Matthias

Hallo Mathias,
ich habe eine AVR32 über die RS232 mit dem Raspberry verbunden und übertrage Messwerte.
Der Raspbeery dient als Webserver.
Die Methode ist recht zuverlässig und ist auch meistens ausreichend schnell.



Sub RS_RasPi()
Dim sz As Integer
Dim vGes As Byte
Dim vszStr(2) As Char
Dim vRSTeilText(80) As Char
vGes = False
Serial_Init_IRQ(UART,buffer,80,300,SR_8BIT Or SR_1STOP Or SR_NO_PAR,SR_BD19200)
RS232OKTime = DieMinuten()                                  'vorbereitend die Zeit der letzten Meldung vom Raspberry speichern
Do While True
   Str_Printf(vZeitText,"%02d:%02d:%02d %02d.%02d.20%02d %d",Clock_GetVal(2),Clock_GetVal(1),Clock_GetVal(0),Clock_GetVal(3),
Clock_GetVal(4),Clock_GetVal(5),DCF_weekday)
   If vGes = False Then  'erst wieder senden wenn eine Antwort vom Raspberry da ist
      vRS_Buf = ""
      Str_Printf(vRSTeilText,"%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d", vTZWohnz, vTWWohnz, vTRWohnz, vTZGang, vTBGang, vTRGang,
vTZBad, vTBBad, vTRBad, vTZWC, vTBWC, vTRWC)
      Str_Copy(vRS_Buf,vRSTeilText,STR_APPEND)
      Str_Printf(vRSTeilText,";%d;%d;%d;%d;%d;%u;%u;%u;%u;%u;%u", vTKessel, vTVorlUnten, vTVorlOben, vTAussen, vTWWBoiler,
vTimePST1, vTimePST2, vTimePST3, vTimePST4, vTimePST5, vTimePST6)
      Str_Copy(vRS_Buf,vRSTeilText,STR_APPEND)
      Str_Printf(vRSTeilText,";%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%s;xxx", vMischerPos, vVentilstufeWo, vVentilstufeGa,
vVentilstufeBa, vVentilstufeWC, vSollTWo, vSollTGa, vSollTBa, vSollTWC, vTempAlarm, vStoerung, vHKWo, vHKBa,
vPumpenstufe, vZeitText)
      Str_Copy(vRS_Buf,vRSTeilText,STR_APPEND)
      Serial_WriteText(UART,vRS_Buf)                        'sendet den Inhalt von vRS_Buf über RS232
      vGes = True
      'Msg_WriteText(vRS_Buf)
      'Msg_WriteChar(13)
   End If
   sz = Serial_IRQ_Info(UART,RS232_FIFO_RECV)               'zählt die Zeichen im Empfangspuffer
   vRSTeilText = ""                                         'Sting löschen
   If sz > 25 Then                                          'sind mehr als 25 Zeichen im Empfangspuffer
      Thread_Delay(10)
      Do While True
         sz=Serial_ReadExt(UART)                            'liest ein Zeichen vom Empfangspuffer
         If sz=0x100 Then                                   'prüft ob der Empfangspuffers leer ist
            sz = Str_Comp("Nachricht von Raspberry Pi",vRSTeilText) 'empfangenen Text mit SollText vergleichen
            If sz = 0 Then                                  'bei 0 war der Vergleich OK
               RS232OKTime = DieMinuten()                   'Zeit der letzten Meldung vom Raspberry speichern
               vStoeQuitt = False                           'Quittierung der Kommunikationsstörung löschen
               'Msg_WriteText("  Empfang OKr" )
            End If
            Exit
         End If
         vszStr(0) = sz : vszStr(1) = 0
         Str_Copy(vRSTeilText,vszStr,STR_APPEND)
         'Msg_WriteChar(sz)
      End While
      'Msg_WriteChar(13)
      vGes = False
   End If
   If vStoeQuitt = False Then                               'wurde eine Kommunikationsstörung noch nicht quittiert
      If DieMinuten() > RS232OKTime + 10 Then               'TimeOut nach 10 Min
         vStoerung = 80
         vStoerTextLCD1 = "RS 232 fehler"                   'Störtext für LCD Zeile 1
         vStoerTextLCD2 = "zum Raspberry"                   'Störtext für LCD Zeile 2
         vTextSD = "Kommunikation zum Raspberry gestört St.Nr.80" 'Störtext für Protokolldatei
         Protokoll(0)                                       'Störung in Protokolldatei speichern
      End If
   End If
   Thread_Delay(1000)                                       '10s Pause
End While
End Sub



Python-Code:
#!/usr/bin/python3
# datacolector.py

import time
from time import sleep
import sqlite3
import serial
import os

os.system("sudo systemctl stop serial-getty@ttyAMA0.service;")
os.system("sudo systemctl disable serial-getty@ttyAMA0.service;")

# ser2 ist die Verbindung zur Bewässerungssteuerung
ser2 = serial.Serial("/dev/ttyAMA0", timeout=0.5)
ser2.baudrate = 19200
ser2.bytesize=serial.EIGHTBITS
ser2.parity=serial.PARITY_NONE
ser2.stopbits=serial.STOPBITS_ONE
# ser ist die Verbingung über USB-RS232 zur Heizungssteuerung
ser = serial.Serial('/dev/ttyUSB0', timeout=0.5)
ser.baudrate = 19200
ser.bytesize=serial.EIGHTBITS
ser.parity=serial.PARITY_NONE
ser.stopbits=serial.STOPBITS_ONE
sleep(0.2)
ap=ser2.read(3000)
p=ser.read(3000)
sleep(0.2)
ser.write(b"Nachricht von Raspberry Pi") #zur Heizungsteuerung
ser2.write(b"Nachricht von Raspberry Pi") #zur Bodenheizung
sleep(0.2)  

connection = sqlite3.connect("/home/pi/Haussteuerung/MessDaten.db")
cursor = connection.cursor()
sql_command = """
CREATE TABLE IF NOT EXISTS MessDaten (
id INTEGER PRIMARY KEY,
Zeit INTRGER,
Ausst REAL,
WoZt REAL,
GaZt REAL,
BaZt REAL,
WCZt REAL,
Kesst REAL,
Boilt REAL,
Regen INTEGER,
Wind INTEGER,
Schnee INTEGER,
Sonne INTEGER,
BewZeit INTEGER,
BewZeitUD INTEGER);"""
cursor.execute(sql_command)
connection.commit()
connection.close()
vMinOld = 0
vDL = True
dl = 0    #Durchlaufzähler
ap = ''
p = ''
BodenHWerte = ''
vRegen = 0
vBewZeitRegenab = ""
vBewZeitRegenun = ""
BodenHformat = '''{0:s};{1:s};{2:s};{3:s};{4:s};{5:s};{6:s};{7:s};{8:s};{9:s};{10:s};{11:s};{12:s};{13:s};{14:s};{15:s};
{16:s};{17:s};{18:s};{19:s};{20:s};{21:s};{22:s};{23:s};{24:s};{25:s};{26:s};{27:s};{28:s};{29:s};{30:s};{31:s};{32:s};
{33:s};{34:s};{35:s};{36:s}'''
while True:
    if ap[-3:]==b'xxx' and ap[:3]==b'xxx':  # wenn das Schlusszeichen (xxx) des Datenstrings vorhanden ist
        dlb=0
        try:
            aBew = ap.split(b';')
            if len(aBew)==62:           #nur wenn die Länge stimmt
                #print(ap)
                aRegenM = aBew[1:25]
                vR = int(aBew[1])         #Regenmenge der letzten Stunde
                vRegen = str(vR)
                aTempSt = aBew[26:50]
                vRegenAktiev = int(aBew[50])
                vVentilEin = int(aBew[51])
                vVStatus = int(aBew[52])
                vR = int(aBew[53])
                vBewZeitRegenab = str(vR)
                vR = int(aBew[54])
                vBewZeitRegenun = str(vR)
                vDS18B20Temp = int(aBew[55])
                vRegenTakte = int(aBew[56])
                vFehler = int(aBew[57])
                vXOR = 0
                vPSum = 0
                for x in aRegenM:
                    vXOR = vXOR^int(x)
                    vPSum = vPSum + int(x)
                for x in aTempSt:
                    vXOR = vXOR^int(x)
                    vPSum = vPSum + int(x)
                x= 50
                while x < 58:
                    vXOR = vXOR^int(aBew[x])
                    vPSum = vPSum + int(aBew[x])
                    x += 1
                if vXOR==int(aBew[58]) and aBew[0]==b'xxx' and vPSum==int(aBew[59]):
                    fx=open("/mnt/RAMDisk/Bewaess_Werte.wet", "w")
                    fx.write(str(ap))                       # stellt die Werte der Bewässerung
                    fx.close()                              # für die Webseite zu verfügung
                    vTimeDate = time.localtime()
                    if vMinOld!=vTimeDate[4]:               # mehrere Durchläufe in der Minute 0 verhindern
                        vDL = True
                    if vTimeDate[4]==3 and vDL==True:       # 1x pro Stunde
                        vMinOld = vTimeDate[4]
                        vDL = False
                        f=open("/mnt/RAMDisk/BodenH_Werte.wet", "r")
                        #f=open("A:/EigeneSonstigeDateien/Raspberry Pi/WWW/BodenH_Werte.wet", "r")
                        vstrf=f.read()
                        f.close()
                        aBodenHWerte = vstrf.split(';')
                        tAus = aBodenHWerte[0]
                        tWoZ = aBodenHWerte[1]
                        tGaZ = aBodenHWerte[6]
                        tBaZ = aBodenHWerte[11]
                        tWCZ = aBodenHWerte[16]
                        tKess = aBodenHWerte[22]
                        tBoil = aBodenHWerte[28]
                        vZeit = "%s%2.2i%2.2i%2.2i" % (vTimeDate[0], int(vTimeDate[1]), int(vTimeDate[2]), int(vTimeDate[3]))
                        #print(vZeit)
                        connection = sqlite3.connect("/home/pi/Haussteuerung/MessDaten.db")
                        cursor = connection.cursor()  
                        sql = "INSERT INTO MessDaten(Zeit, Ausst, WoZt, GaZt, BaZt, WCZt, Kesst, Boilt, Regen, BewZeit,
BewZeitUD) VALUES("
                              +str(vZeit)+","+str(tAus)+","+str(tWoZ)+","+str(tGaZ)+","+str(tBaZ)+","+str(tWCZ)+","
                              +str(tKess)+","+str(tBoil)+","+str(vRegen)+","+str(vBewZeitRegenab)+","+str(vBewZeitRegenun)+")"
                        #print(sql)
                        cursor.execute(sql)
                        connection.commit()
                        connection.close()
        except:
            sleep(1)
    sleep(0.3)
    ap=ser2.read(300)   #lesen von Bewässerungssteuerung
    sleep(0.2)
   
    #**************ab hier Komunikation mit Heizungssteuerung *************************************************************
   
   
    if p[-3:] == b'xxx':                 # prüft ob der WerteString komplett ist
        try:
            CCWerte = p.split(b';')          # Wertestring von der C_Control der Bodenheizungsteuerung splitten    
            if len(CCWerte)==39:             # stimmt die Anzahl der Werte  
                #print(p)
                if CCWerte[0].isdigit:
                    tWoZ = int(CCWerte[0])/10    # Zimmertemperaturen
                if CCWerte[3].isdigit:
                    tGaZ = int(CCWerte[3])/10
                if CCWerte[6].isdigit:
                    tBaZ = int(CCWerte[6])/10
                if CCWerte[9].isdigit:
                    tWCZ = int(CCWerte[9])/10
                if CCWerte[1].isdigit:
                    tWoW = int(CCWerte[1])/10   # Wand/Bodentemperaturen
                if CCWerte[4].isdigit:
                    tGaB = int(CCWerte[4])/10
                if CCWerte[7].isdigit:
                    tBaB = int(CCWerte[7])/10
                if CCWerte[10].isdigit:
                    tWCB = int(CCWerte[10])/10
                if CCWerte[2].isdigit:
                    tWoR = int(CCWerte[2])/10   # Rücklauftemperaturen
                if CCWerte[5].isdigit:
                    tGaR = int(CCWerte[5])/10
                if CCWerte[8].isdigit:
                    tBaR = int(CCWerte[8])/10
                if CCWerte[11].isdigit:
                    tWCR = int(CCWerte[11])/10
                if CCWerte[28].isdigit:
                    tWoS = int(CCWerte[28])/10    # Solltemperaturen
                if CCWerte[29].isdigit:
                    tGaS = int(CCWerte[29])/10
                if CCWerte[30].isdigit:
                    tBaS = int(CCWerte[30])/10
                if CCWerte[31].isdigit:
                    tWCS = int(CCWerte[31])/10
                if CCWerte[24].isdigit:
                    vWo = int(CCWerte[24])    # Ventilstufe
                if CCWerte[25].isdigit:
                    vGa = int(CCWerte[25])
                if CCWerte[26].isdigit:
                    vBa = int(CCWerte[26])
                if CCWerte[27].isdigit:
                    vWC = int(CCWerte[27])
                if CCWerte[15].isdigit:
                    tAus = float(CCWerte[15])/10  # Aussentemperaur
                if CCWerte[12].isdigit:
                    tKess = int(CCWerte[12])/10   # Kesseltemperatur
                if CCWerte[13].isdigit:
                    tVorU = int(CCWerte[13])/10   # Vorlauftemperaur unten
                if CCWerte[14].isdigit:
                    tVorO = int(CCWerte[14])/10   # Vorlauftemperatur oben
                if CCWerte[16].isdigit:
                    tBoil = int(CCWerte[16])/10   # Boilertemperatur
                if CCWerte[36].isdigit:
                    Pumpenstufe = int(CCWerte[36])
                if CCWerte[37][:2].isdigit:
                    CCStd = int(CCWerte[37][:2])
                if CCWerte[37][3:5].isdigit:
                    CCMin = int(CCWerte[37][3:5])
                if CCWerte[37][6:8].isdigit:
                    CCSek = int(CCWerte[37][6:8])
                if CCWerte[37][9:11].isdigit:
                    CCTag = int(CCWerte[37][9:11])
                if CCWerte[37][12:14].isdigit:
                    CCMon = int(CCWerte[37][12:14])
                if CCWerte[37][15:19].isdigit:
                    CCJah = int(CCWerte[37][15:19])
                if CCWerte[37][20:21].isdigit:
                    CCWt = int(CCWerte[37][20:21])
                try:
                    MischerPos = int(CCWerte[23])
                except:
                    MischerPos = '0'
                if CCWerte[34].isdigit:
                    HKWo = int(CCWerte[34])
                strHKWo = 'Aus'
                if HKWo == 1:
                    strHKWo = 'Ein'
                if CCWerte[35].isdigit:
                    HKBa = int(CCWerte[35])
                strHKBa = 'Aus'
                if HKBa == 1:
                    strHKBa = 'Ein'
                if CCWerte[33].isdigit:
                    StoerNr = int(CCWerte[33])
                if CCWerte[32].isdigit:
                    Temperturalarm = int(CCWerte[32])
                if CCWerte[17].isdigit:
                    sB1 = round(int(CCWerte[17])/60,1)     # aus Minuten Stunden mit Komma machen
                if CCWerte[18].isdigit:
                    sB2 = round(int(CCWerte[18])/60,1)
                if CCWerte[19].isdigit:
                    sB3 = round(int(CCWerte[19])/60,1)
                if CCWerte[20].isdigit:
                    sB4 = round(int(CCWerte[20])/60,1)
                if CCWerte[21].isdigit:
                    sB5 = round(int(CCWerte[21])/60,1)
                if CCWerte[22].isdigit:
                    sB6 = round(int(CCWerte[22])/60,1)
                if CCWerte[37].isdigit:
                    DateTime = CCWerte[37]
                BodenHWerte = BodenHformat.format (str(tAus),
                                                   str(tWoZ), str(tWoS), str(tWoW), str(tWoR), str(vWo),
                                                   str(tGaZ), str(tGaS), str(tGaB), str(tGaR), str(vGa),
                                                   str(tBaZ), str(tBaS), str(tBaB), str(tBaR), str(vBa),
                                                   str(tWCZ), str(tWCS), str(tWCB), str(tWCR), str(vWC),
                                                   str(Pumpenstufe), str(tKess), str(sB1), str(tVorU), str(sB2),
                                                   str(tVorO), str(sB3), str(tBoil), str(sB4), str(MischerPos),
                                                   str(sB5), str(StoerNr), str(sB6), strHKWo, strHKBa, str(CCWerte[37])
                                                   )
                f=open("/mnt/RAMDisk/BodenH_Werte.wet", "w")
                f.write(BodenHWerte)             # für PHP zur Verfügung stellen
                f.close()
        except:
            sleep(1)
    p = ser.read(600)                    # RS232 lesen von Heizungssteuerung
    sleep(0.3)                           # 0,3s Pause
    dl = dl + 1
    if dl > 10:
        dl = 0
        ser.write(b"Nachricht von Raspberry Pi")
        ser2.write(b"Nachricht von Raspberry Pi")
        #print("Nachricht")
        sleep(0.2)



    Antwort schreiben


Antworten:

Re: Verbindung zu Raspberry (von Matthias - 15.02.2017 22:11)
    Re: Verbindung zu Raspberry (von Tobias - 16.02.2017 8:04)