#include #include #include #include #include // تعریف پین‌ها #define ADC_PIN PA2 // یا A2 اگر تعریف شده #define LED_PIN PC13 #define OLED_ADDR 0x3C // پین‌های I2C #define I2C_SDA PB9 #define I2C_SCL PB8 // آبجکت‌ها Adafruit_SHT31 sht31; BH1750 lightMeter; Adafruit_SSD1306 display(128, 64, &Wire, -1); // متغیرها float temperature, humidity, light; int raw_adc = 0; float voltage = 0; float co_ppm = 0; // تابع دیباگ برای تست ADC void testADC() { Serial1.print("ADC Pin: PA2 (Pin "); Serial1.print(ADC_PIN); Serial1.println(")"); // خواندن 10 نمونه Serial1.println("Reading ADC values:"); for (int i = 0; i < 10; i++) { int val = analogRead(ADC_PIN); Serial1.print("Sample "); Serial1.print(i); Serial1.print(": "); Serial1.print(val); Serial1.print(" ("); Serial1.print(val * 3.3 / 4095.0, 3); Serial1.println("V)"); delay(200); } } // تابع برای بررسی اتصال MQ-7 void checkMQ7Connection() { Serial1.println("\n=== Testing MQ-7 Connection ==="); // حالت 1: اتصال باز (هوای آزاد) Serial1.println("1. Disconnect MQ-7 (open circuit):"); delay(3000); raw_adc = analogRead(ADC_PIN); voltage = raw_adc * 3.3 / 4095.0; Serial1.print(" ADC: "); Serial1.print(raw_adc); Serial1.print(" -> Voltage: "); Serial1.print(voltage, 3); Serial1.println("V"); // حالت 2: اتصال به GND Serial1.println("2. Short MQ-7 output to GND:"); Serial1.println(" (Connect AOUT to GND temporarily)"); delay(5000); raw_adc = analogRead(ADC_PIN); voltage = raw_adc * 3.3 / 4095.0; Serial1.print(" ADC: "); Serial1.print(raw_adc); Serial1.print(" -> Voltage: "); Serial1.print(voltage, 3); Serial1.println("V"); // حالت 3: اتصال به 3.3V Serial1.println("3. Short MQ-7 output to 3.3V:"); Serial1.println(" (Connect AOUT to 3.3V temporarily)"); delay(5000); raw_adc = analogRead(ADC_PIN); voltage = raw_adc * 3.3 / 4095.0; Serial1.print(" ADC: "); Serial1.print(raw_adc); Serial1.print(" -> Voltage: "); Serial1.print(voltage, 3); Serial1.println("V"); Serial1.println("=== End Test ==="); } float readCO() { // خواندن مستقیم ADC raw_adc = analogRead(ADC_PIN); voltage = raw_adc * 3.3 / 4095.0; // اگر ولتاژ خیلی کم یا زیاد باشد if (voltage < 0.1) { return 0.1; // حداقل مقدار } if (voltage > 4.9) { return 1000; // حداکثر مقدار } // محاسبه Rs (مقاومت سنسور) float Rs = 10000.0 * (5.0 - voltage) / voltage; // فرض R0 ثابت (می‌توانید کالیبره کنید) float R0 = 10000.0; float ratio = Rs / R0; // محاسبه PPM با فرمول MQ-7 float ppm = 99.042 * pow(ratio, -1.518); // محدود کردن خروجی if (ppm < 0.5) ppm = 0.5; if (ppm > 1000) ppm = 1000; return ppm; } void setup() { Serial1.begin(115200); Serial1.println("\n=== STM32 4-Sensor Monitor ==="); // تنظیم پین‌ها pinMode(LED_PIN, OUTPUT); digitalWrite(LED_PIN, HIGH); // روشن برای نشان دادن فعالیت // تنظیم ADC analogReadResolution(12); // برای STM32 مهم است! // تنظیم I2C Wire.setSDA(I2C_SDA); Wire.setSCL(I2C_SCL); Wire.begin(); // OLED if (!display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR)) { Serial1.println("OLED not found!"); while(1); } // SHT31 if (!sht31.begin(0x44)) { Serial1.println("SHT31 not found!"); } // BH1750 if (!lightMeter.begin()) { Serial1.println("BH1750 not found!"); } else { lightMeter.configure(BH1750::CONTINUOUS_HIGH_RES_MODE); } // تست اولیه ADC testADC(); // نمایش صفحه شروع display.clearDisplay(); display.setTextSize(1); display.setTextColor(SSD1306_WHITE); display.setCursor(20, 20); display.println("ADC Test Mode"); display.setCursor(30, 35); display.println("Check Serial"); display.display(); Serial1.println("\nSend 't' to test MQ-7 connection"); Serial1.println("Send 'r' to read normal values"); } void loop() { // بررسی دستورات سریال if (Serial1.available()) { char cmd = Serial1.read(); if (cmd == 't' || cmd == 'T') { checkMQ7Connection(); } if (cmd == 'r' || cmd == 'R') { // خواندن حالت عادی temperature = sht31.readTemperature(); humidity = sht31.readHumidity(); light = lightMeter.readLightLevel(); co_ppm = readCO(); Serial1.print("\nTemp: "); Serial1.print(temperature, 1); Serial1.print("C, Hum: "); Serial1.print(humidity, 1); Serial1.print("%, Light: "); Serial1.print(light, 0); Serial1.print("lx, CO: "); Serial1.print(co_ppm, 1); Serial1.print("ppm, ADC: "); Serial1.print(raw_adc); Serial1.print(" ("); Serial1.print(voltage, 3); Serial1.println("V)"); } } // خواندن و نمایش معمول temperature = sht31.readTemperature(); humidity = sht31.readHumidity(); light = lightMeter.readLightLevel(); co_ppm = readCO(); // نمایش روی OLED display.clearDisplay(); display.setTextSize(1); display.setTextColor(SSD1306_WHITE); // عنوان display.setCursor(40, 0); display.println("SENSORS"); display.drawLine(0, 10, 128, 10, SSD1306_WHITE); // دما display.setCursor(0, 15); display.print("Temp: "); display.print(temperature, 1); display.print("C"); // رطوبت display.setCursor(0, 25); display.print("Hum: "); display.print(humidity, 1); display.print("%"); // نور display.setCursor(0, 35); display.print("Light:"); if (light < 1000) { display.print(light, 0); } else { display.print(light / 1000, 1); display.print("k"); } display.print("lx"); // CO با نمایش ولتاژ display.setCursor(0, 45); display.print("CO: "); display.print(co_ppm, 1); display.print("ppm"); // نمایش ADC و ولتاژ در پایین display.drawLine(0, 55, 128, 55, SSD1306_WHITE); display.setCursor(0, 58); display.print("ADC:"); display.print(raw_adc); display.print(" V:"); display.print(voltage, 2); display.print("V"); // چشمک زدن LED برای نشان دادن فعالیت static unsigned long lastBlink = 0; if (millis() - lastBlink > 1000) { digitalWrite(LED_PIN, !digitalRead(LED_PIN)); lastBlink = millis(); } display.display(); delay(500); }