From 735258f6ec25f82f056e8c99b84980484c3cdf56 Mon Sep 17 00:00:00 2001 From: rahimi rahimi Date: Fri, 19 Dec 2025 11:41:15 +0330 Subject: [PATCH] test 3 sensor --- TestLCD.ino | 265 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 265 insertions(+) create mode 100644 TestLCD.ino diff --git a/TestLCD.ino b/TestLCD.ino new file mode 100644 index 0000000..ab8f2ee --- /dev/null +++ b/TestLCD.ino @@ -0,0 +1,265 @@ +#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); +} \ No newline at end of file