Hirdetés
- Luck Dragon: Asszociációs játék. :)
- V.Milán: Lapdiffúzor nyomáseloszlása: gondoltad volna?
- eBay-es kütyük kis pénzért
- bambano: Bambanő háza tája
- gban: Ingyen kellene, de tegnapra
- Sub-ZeRo: Euro Truck Simulator 2 & American Truck Simulator 1 (esetleg 2 majd, ha lesz) :)
- Gurulunk, WAZE?!
- GoodSpeed: 3I/Atlas: Üstökös vagy idegen civilizáció űrhajója?
- Meggyi001: Több tucat Eiffel torony??? Igen, gyere, mutatom, hogy hol...
- sziku69: Szólánc.
-
LOGOUT
Arduino hardverrel és szoftverrel foglakozó téma. Minden mikrovezérlő ami arduinoval programozható, és minden arduino program, board, és hardverrel kapcsolatos kérdések helye.
Ú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
- Zenbook S 16 UM5606WA 16" 3K OLED Ryzen AI 9 HX370 890M 32GB 1TB IR kam gar
- Xiaomi Redmi 15 128GB, Kártyafüggetlen, 1 Év Garanciával
- Samsung,Dell,iiyama,LG,BenQ,AOC monitorok,garancia,számla,22-24",IPS,TN,W-LED,HD,FHD,FHD+
- Samsung Galaxy A56 5G 256GB, Kártyafüggetlen, 1 Év Garanciával
- GIGABYTE AORUS FO32U2 Monitor(oled,4k,240hz)+ monitor arm
- Huawei Watch 5 Titanium 46mm
- ÁRGARANCIA!Épített KomPhone Ryzen 7 5700X3D 32/64GB RAM RX 7800 XT 16GB GAMER PC termékbeszámítással
- REFURBISHED - Lenovo ThinkPad 40AC Thunderbolt 3 Dock
- Telefon felvásárlás!! Honor Magic6 Lite, Honor Magic6 Pro, Honor Magic7 Lite, Honor Magic7 Pro
- GYÖNYÖRŰ iPhone 14 Pro Max 128GB Space Black -1 ÉV GARANCIA - Kártyafüggetlen, MS2998, 100% Akksi
Állásajánlatok
Cég: PCMENTOR SZERVIZ KFT.
Város: Budapest
Cég: Laptopműhely Bt.
Város: Budapest
ekkold
