#include <WiFi.h> //وارد کردن کتابخانه های مربوط به قطعات
#include <ThingerESP32.h>
#include <SD.h>
#include <SPI.h>
#include <ESP32Servo.h>
#include <NewPing.h>
// تظیمات وای فای و پلتفرم تینگر
const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char* username = "Hosneieh";
const char* device_id = "kavosh";
const char* device_credential = "kavoshkavosh";
// تعریف پینها
const int sdCsPin = 5;
const int servoPin = 14;
const int trigPin = 12;
const int echoPin = 13;
const int sensorPin = 34; //جایگزین طیف سنج
const int ledGreen = 2;
const int ledRed = 4;
const int buttonPin = 0;
// تنظیمات قطعات
Servo myServo;
NewPing sonar(trigPin, echoPin, 200); // حداکثر فاصله 200 سانتیمتر
ThingerESP32 thing(username, device_id, device_credential);
// تعریف متغیرها
bool isScanning = false;
int scanAngle = 0;
bool sdInitialized = false; // برای جلوگیری از ریست مکرر SD
void setup() {
Serial.begin(115200);
// تنظیم نوع پین ها
pinMode(ledGreen, OUTPUT);
pinMode(ledRed, OUTPUT);
// راهاندازی سروو
myServo.attach(servoPin);
myServo.write(90); // زاویه اولیه وسط
//راه اندازی کارت اس دی
if (SD.begin(sdCsPin)) {
Serial.println("کارت حافظه با موفقیت راهاندازی شد.");
digitalWrite(ledGreen, HIGH);
digitalWrite(ledRed, LOW);
sdInitialized = true;
} else {
Serial.println("خطا در راهاندازی کارت حافظه!");
digitalWrite(ledRed, HIGH); // هشدار قرمز
digitalWrite(ledGreen, LOW);
}
// اتصال به Wi-Fi
WiFi.begin(ssid, password);
Serial.println("در حال اتصال به وایفای...");
//ارسال داده به پلتفرم تینگر
thing["data"] << [](pson& out){
out["material"] = getMaterialType();
};
Serial.println("سیستم کاوشگر آماده است");
}
void loop() {
// چرخش سروو
scanAngle = (scanAngle + 5) % 180;
myServo.write(scanAngle);
// خواندن سنسور طیفسنج (شبیهساز)
String material = getMaterialType();
// خواندن فاصله با اولتراسونیک
int distance = sonar.ping_cm();
// تشخیص مانع
if (distance > 0 && distance < 15) {
digitalWrite(ledRed, HIGH); // هشدار قرمز
Serial.print("هشدار! مانع در فاصله ");
Serial.print(distance);
Serial.println(" سانتیمتری");
// توقف موقت اسکن برای برخورد نکردن با مانع(یا توقف موتور پیشران)
myServo.write(90);
delay(1000);
} else {
digitalWrite(ledRed, LOW);
}
// ذخیره داده در SD Card
if (sdInitialized){
File dataFile = SD.open("scan_log.txt", FILE_WRITE);
if (dataFile) {
dataFile.print(millis());
dataFile.print(" : زاویه: ");
dataFile.print(scanAngle);
dataFile.print(" : فاصله: ");
dataFile.print(distance);
dataFile.print(" : ماده: ");
dataFile.print(material);
dataFile.close();
}else{
Serial.println("خطا در باز کردن فایل برای نوشتن!");
}
}
if(WiFi.status() == WL_CONNECTED){
thing.handle(); // مدیریت ارتباط با Thinger
}else{
WiFi.begin(ssid, password);
}
}
//شبیه ساز پرتاب مثلا برای سیارک سیس
// تعریف زمانهای کلیدی (به ثانیه، محاسبه شده با قوانین کپلر)
// زمان روشن بودن موتور برای شروع حرکت (شتاب اولیه)
//const long TIME_BURN_INJECTION = 1.6 * 3600;
// زمان انتظار و حرکت آزاد در فضا (بدون سوختسوزی)
//const long TIME_COASTING = 1.295 * 365.25 * 24 * 3600;
// زمان روشن بودن موتور برای ترمز و ورود به مدار مقصد
//const long TIME_BURN_CAPTURE = 1.4 * 3600;
// زمان شروع هر مرحله (برای محاسبهی گذشت زمان)
//unsigned long startTime = 0;
// شمارهی مرحلهی فعلی مأموریت:
// 0: آمادهسازی اولیه
// 1: شتاب اولیه (ورود به بیضی)
// 2: سفر آزاد (صبر کردن)
// 3: ترمز نهایی (ورود به مدار)
//int missionPhase = 0;
// مرحله ۱: شتاب اولیه
//if (missionPhase == 0) {
// اگر زمان شروع موتور هنوز تمام نشده، موتور روشن باشه
//if (millis() - startTime < TIME_BURN_INJECTION) {
//startThrusters();
//Serial.println("در حال افزایش سرعت برای خروج از مدار زمین...");
//} else {
// زمان تمام شد: موتور خاموش، برو مرحله بعد
//stopThrusters();
//missionPhase = 1;
//startTime = millis(); // ریست کردن تایمر برای مرحله بعد
//Serial.println("موتور خاموش. سفر آزاد در فضا شروع شد.");
//}
//}
// مرحله ۲: سفر آزاد (Coasting)
//else if (missionPhase == 1) {
// چک میکنیم آیا زمان سفر تمام شده؟
// if (millis() - startTime > TIME_COASTING) {
//missionPhase = 2; // برو مرحله ترمز
//startTime = millis();
//Serial.println("رسیدن به سیارک! آماده برای ترمز.");
//}
//}
// مرحله ۳: ترمز نهایی
//else if (missionPhase == 2) {
// اگر زمان ترمز تمام نشده، موتور معکوس روشن باشه
//if (millis() - startTime < TIME_BURN_CAPTURE) {
//startThrustersReverse();
//Serial.println("در حال کاهش سرعت برای گیر افتادن در مدار سیارک...");
//} else {
// زمان تمام شد: مأموریت تمام شد
//stopThrusters();
//missionPhase = 3;
//Serial.println("ورود به مدار موفقیتآمیز! مأموریت به پایان رسید.");
//}
//}
// تابع تشخیص نوع ماده بر اساس مقدار سنسور
String getMaterialType() {
int val = analogRead(sensorPin);
if (val < 1000) return "خاک ساده";
else if (val < 2000) return "سنگ بازالتی";
else if (val < 3000) return "مواد آلی (احتمالی)";
else return "یخ یا نمک";
}