#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)