CCCPaste

Transmitter Lora

#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();
  }
}