Close

LED pásek + ultrasonic sensorem HC-SR04

Úvodní stránka Fórum Hardware Arduino LED pásek + ultrasonic sensorem HC-SR04

Označeno štítky: ,

Aktuálně je na stránce zobrazeno 11 příspěvků - 1. až 11. (celkem z 11)
  • Autor
    Příspěvky
  • #5756
    Krystof
    Účastník

    Dobrý den,kdybyste my nikdo dal radu ohledně tohoto, moc by my to pomohlo:)
    Mám připojený LED pás s ultrasonic sensorem (HC-SR04) při kontaktu bliká. A já potřebuji aby se při přiblížení se zvýšila světelná intenzita a při oddálení klesla.
    No kdyby vás něco napadlo dejte prosím vědět Díky!
    ‪#‎include‬ <ultrasonicranging.h>
    ‪#‎define‬ ECHO_PIN 7 // ECHO pin of HC-SR04
    #define TRIG_PIN 6 // Trigger pin of HC-SR04
    #define LED_OUT 11 // Drive LED (Base pin of TIP120
    const int space = 125; // Distance in cm in which to trigger LED
    void setup()
    {
    Serial.begin (9600);
    pinMode(TRIG_PIN, OUTPUT); // trigger pin of US range finder
    pinMode(ECHO_PIN, INPUT); // Echo pin of US range finder
    pinMode(LED_OUT, OUTPUT); // base of TIP120 to drive LED
    analogWrite(LED_OUT, 0);
    }
    void GlowLed()
    {
    // Slowly get from LED strip off to full bright (glow-in)
    for (int brightness = 25; brightness < 259; brightness++)
    {
    analogWrite(LED_OUT, brightness);
    delay(3);
    }
    // Slowly get from LED strip on to full off (glow-out)
    for (int brightness = 0; brightness >= 0; brightness–)
    {
    analogWrite(LED_OUT, brightness);
    delay(3);
    }
    }
    void loop()
    {
    int distance = GetDistanceInCm(TRIG_PIN, ECHO_PIN);
    Serial.println(distance);
    if (distance <= 0 || distance > space)
    {
    analogWrite(LED_OUT, 0);
    delay(500);
    return;
    }
    if (distance <= space)
    {
    GlowLed();
    }
    }

    #5777
    posjirka
    Účastník

    Vždyť nikde nemáš paralelu mezi vzdáleností a intenzitou, pouze stále dokola rozsvěcíš a zhasínaš LED.

    Zkus toto, ale píšu to jen od PC nemám Arduino u sebe:

    #‎include‬ <ultrasonicranging.h>
    ‪#‎define‬ ECHO_PIN 7 // ECHO pin of HC-SR04
    #define TRIG_PIN 6 // Trigger pin of HC-SR04
    #define LED_OUT 11 // Drive LED (Base pin of TIP120

    void setup()
    {
    pinMode(TRIG_PIN, OUTPUT); // trigger pin of US range finder
    pinMode(ECHO_PIN, INPUT); // Echo pin of US range finder
    pinMode(LED_OUT, OUTPUT); // base of TIP120 to drive LED
    analogWrite(LED_OUT, 0);
    }

    void loop()
    {
    int distance = GetDistanceInCm(TRIG_PIN, ECHO_PIN);
    if (distance > 254 ) {
    distance = 254;
    }
    analogWrite(LED_OUT, distance);
    delay(500);
    }

    #5778
    Krystof
    Účastník

    Mnohokrát děkuji,
    hned v pondělí to vyzkouším.

    #6182
    Nacelnik
    Účastník

    Ahoj, zneužiji již tento vyřešený dotaz ke svému.

    Jsem ve fázi úvah kdy chci také měnit intenzitu jasu pomocí vzdálenosti. Můj problém je ten, že když podržím překážku třebas v rozmezí 10-40cm (ta bude pevně daná) chci aby tato vzdálenost byla převedena na PWM a dále když tu překážku odstraním, tak chci aby hodnota PWM platila i pro odpojení napájení. Jenže jak to udělat?

    Podržím ruku na 10 cm bude PWM 125 (vymyslel jsem si toto)
    ale když tu ruku odstraním, tak nechci další přepočet ale chci aby platila hodnota 125.
    PO čase podržím ruku na 30cm, přepočte se hodntota na PWM (třeba) 200 a pak když dám tu ruku pryč, aby zas platila hodnota 200.

    Šlo by to zapisovat do EEpromky ( nebude častý zápis),ale jak udělat to, že když dám ruku do vzdálenosti 10cm , rozsvítí se ledka jasem PWM 125 a když překážku odstraním, nedojde k přepisu hodnoty PWM dokuď zase nepodržím ruku jakkoliv ve vzdálenosti 10-40cm.

    Poradíte?

    Děkuji velice

    David

    #6186
    posjirka
    Účastník

    eepromka ti moc nepomůže, spíš ji ničíš neustálím přepisem. Má max 100 000 přepísů což vypadá nekonečně ale při zápisu 1 x 1s = 100 000 s = 1666 min = 27h takže za 1 den zničíš 1 buňku eeprom….

    Když se nad tím zamyslím, tak by to mohlo jít např. touto cestou:
    1, udělat to formou hrubé stupnice např:
    <10cm = 0 (pwm)
    15-20cm = 85
    25-30cm = 170
    35-40cm = 255
    >40cm = zapiš ale ignoruj
    žádné mezi stavy, prostě tyto hodnoty.
    2, Každou 1s si změříš vzdálenost.
    3, Tu zapíšeš do pole o 5-ti hodnotách, které budeš neustále posouvat.
    4, Když 3 z 5 hodnot budou stejné a přitom menší než 40cm nastav PWM a zapiš do eeprom (pokud je změna proti původní hodnotě v eeprom)

    Takže dáš ruku na víc než 3s na vzdálenost/intenzitu jakou chceš a podle toho se ti nastaví LED.

    Co ty na to? Je to co si představuješ?

    #6194
    Nacelnik
    Účastník

    Tu epromku bych použil pouze v při prvním zápisu „nastavení“, a pak ppři změně. tu změnu počítám tak 1 -2x za týden. Takže 100000/2 je mraky týdnů.

    ad1) to se dá vyřešit matematicky ( např každé 2 cm = 1 PWM) + přidat argument – více jak 51cm – ignoruj
    ad3) Jak to myslíš? To jsem nepochopil…Můžeš mi dát konkrétní příklad?

    D.

    #6197
    posjirka
    Účastník

    napíšu to hodně mírně : jaké máš zkušenosti s touto oblastí ???
    Mám na mysli aplikace senzorů v reálném světě.

    #6198
    posjirka
    Účastník

    …nechám to tu chvilku odležet, nemám moc dobrý den a vznikla by zbytečná hádka bez řešení….. nech to být, hol jsem starý morous….

    #6199
    posjirka
    Účastník

    hotovo, odzkoušeno, vyřešeno. Až to vyzkoušíš v realitě zjitíš pro je zbytečné a krajně nevhodné hrát si s lineární stupnicí. Po odzkoušení pak celou serivou komunikaci zakomentuj ať ti zbytečně nezkouší odesílat data. zdržuje to procesor a může se i resetnout.

    // LED ovládaná rukou v.2
    // by JP 2016
    // přiblížením ruky se reguluje intzenzita jasu LED od 0 do 100% jasu.
    // zatím ve 12 krocích 0 - 240 PWM 
    // jemnější nastavení už téměř nejde dosáhnout. 
    // nová intenzita se nastavuje přiblížením ruky na dobu 2s 
    // V.2 - použito funkce map() pro nastavení citlivosti
    
    // knihovna EEPROM
    #include <EEPROM.h>
    
    int echoPin = 2; // přijímač
    int trigPin = 3; // vysílač
    long distance = 0; // čas odezvy / vzdálenost
    int LED = 10; // pin s LED diodou s PWM řízením
    long lastDistance = 0; // hodnota posledního měření 
    int pwm = 0; // hodnota PWM
    long max_dist = 1500; // maximalni vzdalenost v ms
    long min_dist = 100; // minimalni vzdalenost v ms
    long kroku = 6; // pocet stupnu intenzit, kdy 0 = vypni, max = nereaguj takze pocet stupnu je koku-1 
    
    byte adresa = 1022; // adresa záznamu v EEPROM 
    
    void setup() {
      Serial.begin(9600);
      pinMode(echoPin, INPUT);
      pinMode(trigPin, OUTPUT);
      pinMode(LED, OUTPUT);
      pwm = EEPROM.read(adresa); // načtení poslední hodnoty z EEPROM
      analogWrite(LED, pwm); // zápis PWM
    }
    
    void loop() {
      // vysílám impulz
      digitalWrite(trigPin, LOW);
      delayMicroseconds(2);
      digitalWrite(trigPin, HIGH);
      delayMicroseconds(10);
      digitalWrite(trigPin, LOW);
      // měřím délku odezvy
      distance = pulseIn(echoPin, HIGH);
      Serial.print(distance); 
      distance = map(distance, min_dist, max_dist, 0, kroku); // prepocet na stupne intenzity svitu LED
      distance = constrain(distance, 0, kroku); // omezení přepočtu na nastevný rozsah
      Serial.print("/"); 
      Serial.print(distance);  
      Serial.print("/"); 
      Serial.println(kroku);
      if (lastDistance == distance){
        if (distance < kroku){
           pwm = distance * (255/(kroku-1)); // přepočet na PWM
           analogWrite(LED, pwm); // zápis PWM
           // změna oproti záznamu v EEPROM
           if (pwm != int(EEPROM.read(adresa))) {
             EEPROM.write(adresa, pwm); // záznam do EEPROM  
             Serial.print("Zapis do EEPROM ...");
           }
        }
      }
      Serial.print("Aktualni PWM ...");
      Serial.println(pwm);
      lastDistance = distance; // předání záznamu posledního měření
      delay(1000);
    }
    #6200
    Nacelnik
    Účastník

    Ahoj, několikrát jsem četl tvůj kód a kombinace map a constrain je to pravé – vždycky jsem to řešil nějakým matematickým vzorcem, tyhle fce to udělají jednodušeji a najednou mi to dává smysl….

    děkuji ti moc, touhle ukázkou jsi mi ušetřil několik dní života.

    Pěkný den a večer.
    David

    #6201
    posjirka
    Účastník

    nemáš zač. Tu hrubou stupnici jsem tam navrhoval od začátku proto, že nikdy neudržíš ruku ve stejné vzdálenosti od čidla. To čidlo taky nikdy nedá 2x po sobě stejný výsledek už jen proto, že se musí počítat z dozvukem předcházejícího signálu , nerovnosti plochy, atd atd.
    Ani průměr několika hodnot ti nepomůže a budeš mít nejen velký rozptyl, ale navíc tě to bude stát spoustu času.
    Zkoušel jsem zkrátit čas smyčky na 500ms a nefunguje to špatně, navíc je to celkem rychlý.

    Rád jsem pomohl,…

Aktuálně je na stránce zobrazeno 11 příspěvků - 1. až 11. (celkem z 11)
  • Pro reakci na toto téma se musíte přihlásit.