Hirdetés

Új hozzászólás Aktív témák

  • Tomika86

    senior tag

    Sziasztok!

    Távolság számlálást, jelenleg ezt használom, hogy lehetne átalakítani, hogy ne legyenek kerekítések és esetleg ne legyen float számolás. Jelenleg működik így. (ESP32 miatt van interruptban az FPU bekapcsolás és regiszter mentés). A kód devkiten fut és négyszögjellel hajtom meg, soros monitoron figyelem,
    float CalibrationValue_nextion = 6900.0;
    float GearratioValue_nextion = 5.0;
    Ez a kettő érték változik, felső egy kalibráló érték, ezzel lehet pontosítani, alsó az áttétel megadása.

    #define METER_RESET_BUTTON_PIN GPIO_NUM_39
    #define SPEED_INTERRUPT_PIN GPIO_NUM_14
    #define TRIP_COUNTER_RESET_METER 2000
    #define SPEEDOMETER_RESET_TIME_MS 3000
    void IRAM_ATTR Speed_ISR_Handler();
    void SpeedAndTripCalculation(gpio_num_t meterresetinput, const uint32_t speedometerZeroTime, const uint16_t TripmeterResetInterval);

    float CalibrationValue_nextion = 6900.0;
    float GearratioValue_nextion = 5.0;


    uint16_t Speedometer;
    uint32_t TravelledMeters_tonextion, TripMeter_Km, OdoMeter_Km;
    uint8_t TripMeter_100meterPlace;
    volatile float Trip_meter, Odo_meter, Meter_calc;
    float DistanceOfImpulse_mm;
    float DistanceOfImpulse_m;
    volatile uint32_t MillisSavingInSpeedinterrupt;
    volatile uint32_t TimeInSpeedinterrupt;
    volatile uint32_t PreviousMicrosInSpeedinterrupt;
    uint32_t cp0_regs[18];

    void setup() {
    pinMode(SPEED_INTERRUPT_PIN, INPUT);
    pinMode(METER_RESET_BUTTON_PIN, INPUT);
    Serial.begin(115200);
    attachInterrupt(SPEED_INTERRUPT_PIN, Speed_ISR_Handler, FALLING);
    delay(500);
    }

    void loop() {
    SpeedAndTripCalculation(METER_RESET_BUTTON_PIN, SPEEDOMETER_RESET_TIME_MS, TRIP_COUNTER_RESET_METER);
    Serial.print("Sebesseg: ");
    Serial.println(Speedometer);
    Serial.print("Meter: ");
    Serial.println(TravelledMeters_tonextion);

    Serial.print("Trip szamolo: ");
    Serial.println(TripMeter_Km);
    Serial.print("Trip 100m szamolo: ");
    Serial.println(TripMeter_100meterPlace);
    Serial.print("\n");
    }

    void SpeedAndTripCalculation(gpio_num_t meterresetinput, const uint32_t speedometerZeroTime, const uint16_t TripmeterResetInterval) {
    DistanceOfImpulse_mm = CalibrationValue_nextion / GearratioValue_nextion;
    DistanceOfImpulse_m = DistanceOfImpulse_mm / 1000.0;
    // Sebesség
    if ((millis() - MillisSavingInSpeedinterrupt) < speedometerZeroTime) {
    Speedometer = 3600 * DistanceOfImpulse_mm / (TimeInSpeedinterrupt);
    }
    else {
    Speedometer = 0;
    }
    Speedometer = constrain(Speedometer, 0, 300);
    // Megtett méter számláló
    if (Meter_calc > 99999 || (digitalRead(meterresetinput))) {
    Meter_calc = 0;
    }
    TravelledMeters_tonextion = round (Meter_calc);
    // Napi számláló
    if (Trip_meter > 999.9999) {
    Trip_meter = 0;
    TripMeter_Km++;
    }
    // Nullázás ha 9999km felett van, vagy a beállított felett, vagy nulláztunk gombbal
    if ((TripMeter_Km > 9999) || (TripMeter_Km >= TripmeterResetInterval)) {
    Trip_meter = 0;
    TripMeter_Km = 0;
    }
    TripMeter_100meterPlace = ((uint32_t)Trip_meter / 100) - (((uint32_t)Trip_meter / 1000) * 10);
    // Odo km
    if (Odo_meter > 999.9999) {
    Odo_meter = 0;
    OdoMeter_Km++;
    }
    if (OdoMeter_Km > 9999999) {
    Odo_meter = 0;
    OdoMeter_Km = 0;
    }
    }


    void IRAM_ATTR Speed_ISR_Handler() {
    // get FPU state
    uint32_t cp_state = xthal_get_cpenable();
    if(cp_state) {
    // Save FPU registers
    xthal_save_cp0(cp0_regs);
    } else {
    // enable FPU
    xthal_set_cpenable(1);
    }
    Odo_meter += DistanceOfImpulse_m;
    Trip_meter += DistanceOfImpulse_m;
    Meter_calc += DistanceOfImpulse_m;
    TimeInSpeedinterrupt = (micros() - PreviousMicrosInSpeedinterrupt);
    PreviousMicrosInSpeedinterrupt = micros();
    MillisSavingInSpeedinterrupt = millis();
    if(cp_state) {
    // Restore FPU registers
    xthal_restore_cp0(cp0_regs);
    } else {
    // turn it back off
    xthal_set_cpenable(0);
    }
    }

    Bármi ötletet meghallgatok, ami jobbá teszi.

    Köszönöm!

Új hozzászólás Aktív témák