Bluetooth přijímá jiné hodnoty, než posílám z telefonu

jankop
Příspěvky: 551
Registrován: 06 zář 2017, 20:04
Reputation: 0
Bydliště: Brno
Kontaktovat uživatele:

Re: Bluetooth přijímá jiné hodnoty, než posílám z telefonu

Příspěvek od jankop » 21 kvě 2019, 14:36

Stejně vůbec nechápu, proč dvě Arduina a dva BT moduly.

QRocky
Příspěvky: 23
Registrován: 28 zář 2017, 16:30
Reputation: 0

Re: Bluetooth přijímá jiné hodnoty, než posílám z telefonu

Příspěvek od QRocky » 21 kvě 2019, 14:58

jankop píše:
21 kvě 2019, 14:36
Stejně vůbec nechápu, proč dvě Arduina a dva BT moduly.
Potřebuju vynulovat proměnou speedk v případě, že její hodnota se například tři vteřiny nezměnila. Pokud tedy speedk bude mít hodnotu 60 celé tři vteřiny, potřebuji, aby se vynulovala...

Proč dvě Arduina - testujeme v práci princip ovládání ventilátoru na dálku. Pro tyto testy jsme využili právě Arduino...

jankop
Příspěvky: 551
Registrován: 06 zář 2017, 20:04
Reputation: 0
Bydliště: Brno
Kontaktovat uživatele:

Re: Bluetooth přijímá jiné hodnoty, než posílám z telefonu

Příspěvek od jankop » 21 kvě 2019, 19:29

Tady je odzkoušený Master:

Kód: Vybrat vše

//Master

#define PIN_IRQ 2
long start;
long elapsed;
float circMetric = 2.093; // wheel circumference (in meters)
volatile int speedk;
void setup() {
 Serial1.begin(38400); // Default communication rate of the Bluetooth module
  Serial.begin(38400);
  pinMode(PIN_IRQ,INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(PIN_IRQ), speedCalc, RISING);
  start = millis();
}
void speedCalc() {
  //Function called by the interrupt
  if ((millis() - start) > 100) // 100 millisec debounce{
    //calculate elapsed
    elapsed = millis() - start;
  //reset start
  start = millis();
  //calculate speed in km/h
  speedk = (int)((3600.0 * circMetric) / (float)elapsed);
}
void loop() {
  Serial.print("Odesilam na Slave : ");
  Serial.println(speedk);
  Serial1.write(speedk);
  delay(100);
}
Zapojení je
MEGA - HC5
TX1 - RX
RX1 - TX
GND - GND
3V3 - Vcc
Program funguje tak, že měří dobu otáčky a z ní (netuším proč) vypočítá rychlost bicyklovýho kola. Tuto rychlost odesílá přes sériový port na Slave.
Po resetu začne nejprve odesílat 0 a odesílá data každých 0,1 sekundy.
Slave je tady:

Kód: Vybrat vše

//Slave

#include <SoftwareSerial.h>
#define Aura 3
#define TIMEOUT 2500 // doba cekani na data od Master v ms
int State = 0; // Vyctena hodnota z bluetooth
int OldState = 0;
int CountTheSame = 0;
unsigned long LastTime;
SoftwareSerial mySerial(10, 11); // RX, TX
void setup() {
  pinMode(Aura, OUTPUT);
  mySerial.begin(38400);
  Serial.begin(38400);
  analogWrite(Aura, 0);
  LastTime = millis();
}
void loop() {
  if (mySerial.available() > 0) {
    LastTime = millis();
    State = mySerial.read();
    Serial.print("Prijato z Master : " );
    Serial.println(State);
    // pokud prijdou po sobe dva stejne udaje zvysi se citac CountTheSame
    if (OldState == State) CountTheSame++; else CountTheSame = 0;
    OldState = State;
    // pokud prijdou 20x po sobe stejne udaje nebo budou mimo rozsah 0-255, nastavi se na vystup PWM 0
    if (State < 0 || State > 255 || CountTheSame > 20)State = 0;
    analogWrite(Aura, State);
    Serial.print("Odeslano na PWM  : ");
    Serial.println(State);
  }
  // Nulovani, pokud prestanou prichazet data od Master
  if (millis() - LastTime > TIMEOUT) { 
    State = 0;
    analogWrite(Aura, State);
    LastTime=millis();
    Serial.println("Nedostavam Data !");
    Serial.print("Odeslano na PWM  : ");
    Serial.println(State);
  }
}
Zapojen je takto:
UNO - HC5
10 - TX
11 - RX
GND - GND
3V3 - Vcc
Po resetu odesílá na PWM hodnotu 0, pokud začne dostávat od Master data, pak je přeposílá na PWM. Pokud dostane 20x po sobě od Master stejná data (tj. po dobu 2 sekund), pak odešle na PWM 0 a dělá to tak dlouho dokud nedojde ke změně příchozích dat. Pokud přestane dostávat od Master data déle než 2,5s , tak odešle na PWM hodnotu nula.
Ty programy jsem zhruba odzkoušel, měl jsem propojeno Mega a UNO přes uvedené piny, ovšem ne přes BT, ale přímo přes dráty. Pokud ti to nebude fungovat, tak hledej chybu v špatném propojení nebo chybné konfiguraci BT modulů (master/slave atp.)
Druhá věc je, že nejsi schopen ani rozumně specifikovat otáčky, aby bylo možné udělat scaling z otáček na PWM. Tak to holt bude na tobě.

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 1 host