#include <SPI.h>
#include <SD.h>
// הגדרת פין CS עבור הממיר (MCP3204)
const int CS_PIN = 5;
// הגדרת פין CS עבור כרטיס ה-MicroSD
const int SD_CS_PIN = 4;
// הגדרת מערך הפינים עבור 4 נורות ה-LED
const int LED_PINS[4] = {25, 26, 27, 14};
// זווית הסיבוב המקסימלית הפיזית של הפוטנציומטר
const float MAX_SENSOR_ANGLE = 270.0;
void setup() {
Serial.begin(115200);
// הגדרת פין CS של הממיר למצב המתנה (לא פעיל)
pinMode(CS_PIN, OUTPUT);
digitalWrite(CS_PIN, HIGH);
// הגדרת פיני הנורות כיציאות וכיבוי ראשוני
for (int i = 0; i < 4; i++) {
pinMode(LED_PINS[i], OUTPUT);
digitalWrite(LED_PINS[i], LOW);
}
// אתחול ערוץ ה-SPI המשותף
SPI.begin();
delay(1000);
// --- אתחול כרטיס ה-SD ---
Serial.print("מאתחל כרטיס SD... ");
if (!SD.begin(SD_CS_PIN)) {
Serial.println("שגיאה: כרטיס ה-SD לא אותר!");
} else {
Serial.println("כרטיס SD מוכן.");
// פתיחת קובץ ה-CSV להוספת שורת כותרות אם הוא ריק/חדש
File dataFile = SD.open("/data.csv", FILE_WRITE);
if (dataFile) {
if (dataFile.size() == 0) {
dataFile.println("Time(ms),CH0_Angle,CH1_Angle,CH2_Angle,CH3_Angle");
}
dataFile.close();
}
}
Serial.println("מערכת טלמטריה מוכנה. מתחיל דגימה...");
}
// פונקציה ייעודית לקריאת ערוץ מהממיר MCP3204
int readMCP3204(int channel) {
if (channel < 0 || channel > 3) return -1;
SPI.beginTransaction(SPISettings(1000000, MSBFIRST, SPI_MODE0));
digitalWrite(CS_PIN, LOW);
SPI.transfer(0x06);
uint8_t msb = SPI.transfer(channel << 6);
uint8_t lsb = SPI.transfer(0x00);
digitalWrite(CS_PIN, HIGH);
SPI.endTransaction();
return ((msb & 0x0F) << 8) | lsb;
}
void loop() {
// מחרוזת שתכיל את השורה שתיכתב ל-CSV, מתחילה בחותמת הזמן
String csvLine = String(millis());
for (int i = 0; i < 4; i++) {
// 1. קריאת נתון גולמי
int rawValue = readMCP3204(i);
// 2. המרה לזווית
float currentAngle = (rawValue / 4095.0) * MAX_SENSOR_ANGLE;
// 3. חיווי נורות LED על מצבי קצה מהלך
if (currentAngle < 20.0 || currentAngle > 250.0) {
digitalWrite(LED_PINS[i], HIGH);
} else {
digitalWrite(LED_PINS[i], LOW);
}
// 4. בניית שורת ה-CSV (הוספת הזווית מופרדת בפסיק)
csvLine += "," + String(currentAngle, 1);
// 5. הדפסה ל-Serial Monitor לבקרה
Serial.print("CH"); Serial.print(i);
Serial.print(": A="); Serial.print(currentAngle, 1);
Serial.print("°\t");
}
Serial.println();
// --- שמירת הנתונים לכרטיס ה-SD ---
File dataFile = SD.open("/data.csv", FILE_APPEND);
if (dataFile) {
dataFile.println(csvLine);
dataFile.close();
} else {
Serial.println("שגיאה: לא ניתן לכתוב לקובץ הנתונים!");
}
// --- טריגר לבדיקת תוכן הקובץ ---
if (Serial.available() > 0) {
// ניקוי הבאפר של כל מה שהוקלד
while (Serial.available()) {
Serial.read();
}
File readFile = SD.open("/data.csv");
if (readFile) {
Serial.println("\n--- תוכן הקובץ data.csv ---");
while (readFile.available()) {
Serial.write(readFile.read());
}
readFile.close();
Serial.println("---------------------------\n");
} else {
Serial.println("שגיאה: לא הצלחתי לפתוח את הקובץ לקריאה.");
}
}
// קצב דגימה של 20 הרץ
delay(50);
}