Files
Arduino/TestLCD.ino
2025-12-19 11:41:15 +03:30

265 lines
6.6 KiB
C++

#include <Wire.h>
#include <Adafruit_SHT31.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <BH1750.h>
// تعریف پین‌ها
#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);
}