#include // הגדרות פינים const int PIN_RX = 10; const int PIN_TX = 11; const int M0 = 7; const int M1 = 8; // פינים אנלוגיים לג'ויסטיקים וטרמים const int POT_THROTTLE = A0; const int POT_STEERING = A1; const int POT_TRIM_T = A2; const int POT_TRIM_S = A3; SoftwareSerial loraSerial(PIN_RX, PIN_TX); // מבנה נתונים ארוז - חייב להיות זהה למקלט struct __attribute__((packed)) ControlData { byte header; // 0xAA byte throttle; // 0-255 byte steering; // 0-255 byte trimT; // 0-255 byte trimS; // 0-255 byte checksum; }; ControlData transmitterdat; void setup() { // הגדרת מצב עבודה למודול LoRa (Normal Mode) pinMode(M0, OUTPUT); pinMode(M1, OUTPUT); digitalWrite(M0, LOW); digitalWrite(M1, LOW); Serial.begin(115200); loraSerial.begin(9600); Serial.println("Transmitter Ready - Broadcasting..."); // הגדרת ה-Header פעם אחת (הוא לעולם לא משתנה) transmitterdat.header = 0xAA; } void loop() { // 1. קריאת הערכים מהפוטנציומטרים (0-1023) והמרתם ל-0-255 //transmitterdat.throttle = map(readStable(POT_THROTTLE), 0, 1023, 0, 255); //transmitterdat.steering = map(readStable(POT_STEERING), 430, 700, 0, 255); //transmitterdat.trimT = map(readStable(POT_TRIM_T), 0, 1023, 0, 255); //transmitterdat.trimS = map(readStable(POT_TRIM_S), 0, 1023, 0, 255); int mappedValue; mappedValue = map(readStable(POT_THROTTLE), 370, 650, 0, 255); transmitterdat.throttle = constrain(mappedValue, 0, 255); // 1. קריאה ומיפוי לתוך משתנה זמני שיכול להכיל מספרים מחוץ לטווח 0-255 mappedValue = map(readStable(POT_STEERING), 430, 700, 0, 255); // 2. הגבלה (Constrain) כשהערך עדיין בתוך ה-INT // 3. ורק אז שמירה לתוך ה-struct (מסוג byte) transmitterdat.steering = constrain(mappedValue, 0, 255); // דוגמה לטרים mappedValue = map(readStable(POT_TRIM_T), 0, 1023, 0, 255); transmitterdat.trimT = constrain(mappedValue, 0, 255); // דוגמה לטרים mappedValue = map(readStable(POT_TRIM_S), 0, 1023, 0, 255); transmitterdat.trimS = constrain(mappedValue, 0, 255); /* transmitterdat.throttle = 100; transmitterdat.steering = 250; transmitterdat.trimT = 200; transmitterdat.trimS = 127; */ // 2. חישוב ה-Checksum לאימות הנתונים בצד השני transmitterdat.checksum = (byte)(transmitterdat.throttle + transmitterdat.steering + transmitterdat.trimT + transmitterdat.trimS); // 3. שידור המבנה המלא ל-LoRa loraSerial.write((byte*)&transmitterdat, sizeof(ControlData)); // הדפסה לדיבאג (אופציונלי) debugPrint(); // השהייה קטנה לקביעת קצב השידור (כ-20 פעמים בשנייה) delay(50); } int readStable(int pin) { long sum = 0; for (int i = 0; i < 15; i++) { // לוקחים 10 דגימות sum += analogRead(pin); } return sum / 15; // מחזירים את הממוצע } void debugPrint() { static unsigned long lastDebug = 0; if (millis() - lastDebug > 500) { /* Serial.print("Sending -> T: "); Serial.print(transmitterdat.throttle); Serial.print(" S: "); Serial.println(transmitterdat.steering); */ //Serial.print("Sending -> Throttle: "); Serial.println(readStable(POT_THROTTLE)); Serial.print("Sending -> Final Throttle: "); Serial.println(transmitterdat.throttle); //Serial.print("Sending -> Steering: "); Serial.println(readStable(POT_STEERING)); Serial.print("Sending -> Final Steering: "); Serial.println(transmitterdat.steering); //Serial.print("Sending -> TrimT: "); Serial.println(readStable(POT_TRIM_T)); Serial.print("Sending -> Final TrimT: "); Serial.println(transmitterdat.trimT); //Serial.print("Sending -> TrimS: "); Serial.println(readStable(POT_TRIM_S)); Serial.print("Sending -> Final TrimS: "); Serial.println(transmitterdat.trimS); Serial.println("________ "); lastDebug = millis(); } }