Raspberry + BMP280 Projekt

#include <Wire.h>
#include <Adafruit_BMP085.h>   // BMP085/BMP180 library

#define SLAVE_ADDRESS 0x04     // I2C slave cím (Raspberry oldalon i2cdetect -y 1)
#define SIMULATE_SENSOR 0      // 1 = teszt random adatok, 0 = valódi szenzor

Adafruit_BMP085 bmp;           // BMP180 objektum (I2C)

// Globális változók
volatile float lastTemp = 0.0;
volatile float lastPressure = 0.0;   // hPa-ban
char dataBuffer[32];                 // "25.50,1013.25" formátumhoz

void setup() {
  Serial.begin(9600);
  
  // I2C slave indítása
  Wire.begin(SLAVE_ADDRESS);
  Wire.onRequest(sendData);         // Raspberry kérésére fut le
  
  // BMP180 inicializálás
  if (!bmp.begin()) {
    Serial.println("BMP180 NEM található!");
    Serial.println("Ellenőrizd:");
    Serial.println(" - Bekötés: SDA → A4, SCL → A5");
    Serial.println(" - Táp: 3.3–5V");
    Serial.println(" - I2C cím: 0x77 (i2cdetect -y 1)");
    // Itt folytathatod, de nem lesz valódi mérés
  } else {
    Serial.println("BMP180 sikeresen inicializálva (0x77)");
  }

  randomSeed(analogRead(0));
  Serial.println("I2C BMP180 slave elindult...");
  
  if (SIMULATE_SENSOR == 1) {
    Serial.println("FIGYELEM: SIMULATE_SENSOR aktív – random adatok mennek!");
  }
}

void loop() {
  if (SIMULATE_SENSOR == 1) {
    // Teszt/random mód
    lastTemp = random(1800, 3201) / 100.0;          // 18.00 .. 32.00 °C
    lastPressure = random(9800, 10350) / 10.0;      // 980.0 .. 1035.0 hPa
    
    Serial.print("Szimulált: ");
    Serial.print(lastTemp, 2);
    Serial.print(" °C   ");
    Serial.print(lastPressure, 2);
    Serial.println(" hPa");
  }
  else {
    // Valódi olvasás
    float t = bmp.readTemperature();
    float p = bmp.readPressure() / 100.0;   // Pa → hPa
    
    // Ellenőrzés: ésszerű értékek?
    if (t > -40 && t < 85 && p > 300 && p < 1200) {
      lastTemp = t;
      lastPressure = p;
      
      Serial.print("BMP180: ");
      Serial.print(lastTemp, 2);
      Serial.print(" °C   ");
      Serial.print(lastPressure, 2);
      Serial.println(" hPa");
    }
    else {
      // Hibás érték → fallback random
      lastTemp = random(1800, 3201) / 100.0;
      lastPressure = random(9800, 10350) / 10.0;
      
      Serial.println("Hiba: BMP180 olvasási hiba! → Fallback random:");
      Serial.print("Temp: ");
      Serial.print(lastTemp, 2);
      Serial.print(" °C   Nyomás: ");
      Serial.print(lastPressure, 2);
      Serial.println(" hPa");
    }
  }
  
  delay(2000);   // BMP180 is kb. 2 mp-enként ajánlott frissíteni
}

// Raspberry Pi adat kérésekor fut
void sendData() {
  if (lastTemp == 0.0 && lastPressure == 0.0) {
    Wire.write("0.00,0.00");
    return;
  }

  char tStr[8];
  char pStr[8];
  dtostrf(lastTemp,    5, 2, tStr);     // pl. " 25.50"
  dtostrf(lastPressure, 7, 2, pStr);    // pl. "1013.25"

  memset(dataBuffer, 0, sizeof(dataBuffer));
  sprintf(dataBuffer, "%s,%s", tStr, pStr);

  Wire.write(dataBuffer);
}
import requests
import smbus
import time

# Konfiguráció
API_KEY = "123456789"                  # ← cseréld ki a sajátodra
SLAVE_ADDRESS = 0x04                   # Ugyanaz, mint az Arduino sketch-ben
API_URL_BASE = "http://192.168.0.181/sensor/insert_data_apikey.php"

bus = smbus.SMBus(1)                   # I2C bus 1 a legtöbb újabb Raspberry Pi-n

def send_data_to_api(temperature, pressure):
    # Figyelem: a szerver oldalon most pressure-t várunk humidity helyett!
    url = (
        f"{API_URL_BASE}?api_key={API_KEY}"
        f"&temperature={temperature:.2f}"
        f"&pressure={pressure:.2f}"          # ← ha a szerveren más mezőnév kell, itt cseréld
    )
    
    print(f"Küldési URL: {url}")
    
    try:
        response = requests.get(url, timeout=5)
        if response.status_code == 200:
            print(f"Sikeres API küldés! Válasz: {response.text.strip()}")
        else:
            print(f"API hiba - státuszkód: {response.status_code} | válasz: {response.text.strip()}")
    except Exception as e:
        print(f"Hálózati / requests hiba: {e}")


print("BMP180 adatgyűjtés indítása (I2C slave-ről olvasás)...")
print("Várható formátum az Arduinótól: pl. '24.50,1013.25' (temp,pressure hPa)\n")

while True:
    try:
        # 20 bájtot olvasunk (biztonság kedvéért, a string rövidebb lesz)
        data = bus.read_i2c_block_data(SLAVE_ADDRESS, 0, 20)
        
        # Csak nyomtatható karaktereket tartunk meg (32–126), nullák/255-ösök kiszűrése
        line = "".join(chr(byte) for byte in data if 32 <= byte <= 126).strip()
        
        print(f"Nyers fogadott string: '{line}'  (hossz: {len(line)})")
        
        if "," in line and len(line) > 6:   # minimális ésszerű hossz ellenőrzés
            parts = line.split(",", 1)      # max 1 split, biztonság kedvéért
            
            if len(parts) == 2:
                try:
                    temperature = float(parts[0].strip())
                    pressure    = float(parts[1].strip())
                    
                    print(f"Feldolgozva → Hőmérséklet: {temperature:5.2f} °C    "
                          f"Légnyomás: {pressure:7.2f} hPa")
                    
                    # Küldés az API-nak
                    send_data_to_api(temperature, pressure)
                    
                except ValueError as ve:
                    print(f"Konverziós hiba (nem szám?): {ve} → adat: '{line}'")
            else:
                print("Hiba: nem pontosan két részre bontható az adat")
        else:
            print("Érvénytelen / üres adat – nincs vessző vagy túl rövid string")
            
    except IOError as ioe:
        # Gyakori I2C hiba: Arduino nem válaszol, slave nincs jelen, stb.
        print(f"I2C kommunikációs hiba: {ioe}  → ellenőrizd az Arduino-t / bekötést")
    except Exception as e:
        print(f"Váratlan hiba a ciklusban: {e}")
    
    # Következő lekérdezés 10 mp múlva
    time.sleep(10)