Bluetooth + RGB LED + DS18B20

Masz problem z Arduino? Tutaj możesz szukać pomocy.
ODPOWIEDZ
mgreta36
Majsterkowicz
Posty: 115
Rejestracja: 11 mar 2014, 22:20

Bluetooth + RGB LED + DS18B20

Post autor: mgreta36 » 19 mar 2015, 01:47

Spłodziłem takie coś:
- aplikacja na androida w AppInventor'ze,
- moduł BT
- czujka temp. DS18B20
- Arduino Mega

Aplikacja w telefonie ma za zadanie pokazywać temp. z czujnika i sterować 3 kolorami diody RGB. Wszytko dziala, ale jest jedno ale...

Program co 2 s. wywala na serial temp. Prędkość podawania temperetury nie może być zbyt duża bo moduł BT gubi się a to blokuje na 2 s. przełączanie w aplikacji kolorów diody RGB na Arduino.

Jak zrobić aby program w Arduino działał normalnie a Serial.print() podawał temp. tylko co 2 s. ?

Tak wygląda apk.
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.

Co miesiąc do wygrania nagrody o wartości ponad 1600 zł!


e-szymek
Młodszy majsterkowicz
Posty: 35
Rejestracja: 31 sty 2015, 00:23

Re: Bluetooth + RGB LED + DS18B20

Post autor: e-szymek » 19 mar 2015, 09:02

W miejscu, gdzie serial.print podaje temperaturę:
- stworzenie zmiennej czas
- odczyt aktualnego czasu i dodanie tego czasu (powiększonego o 2 sek) do zmiennej
- warunek jeśli millis() >= czas, wykonaj serial.print
- wyzerowanie zmiennej czas
mgreta36
Majsterkowicz
Posty: 115
Rejestracja: 11 mar 2014, 22:20

Re: Bluetooth + RGB LED + DS18B20

Post autor: mgreta36 » 19 mar 2015, 10:32

Prosze kod:

Kod: Zaznacz cały

#include <OneWire.h>
#include <DS18B20.h>
#define ONEWIRE_PIN 2
OneWire onewire(ONEWIRE_PIN);
DS18B20 sensors(&onewire);
byte sensorTemp1[8] = {0x28, 0x7F, 0x94, 0xCB, 0x4, 0x0, 0x0, 0x39};

int BluetoothData;
int ledpinR=26;
int ledpinG=28;
int ledpinB=30;

long czas_poprzedni = 0;

void setup() //============================= setup =======
{
 // BT.begin(9600);
  sensors.begin(12);
  //BT.available();
  Serial.begin(38400);
  pinMode(ledpinR,OUTPUT);
  pinMode(ledpinG,OUTPUT);
  pinMode(ledpinB,OUTPUT);
  
}
void loop()//============================== loop =========
{

  BluetoothData=Serial.read();

   if((millis() - czas_poprzedni) > 2000) tempIN();
    tempIN();
    bt_r();
    bt_g();
    bt_b();
  }
  
}
void bt_r() //====================== BT_R ==============
{
   if(BluetoothData=='r')
     {
       digitalWrite(ledpinR,1);
      // BT.println("LED Czerwona ON ! ");
     }
   if (BluetoothData=='1')
     {
       digitalWrite(ledpinR,0);
      // BT.println("LED Czerwona Off ! ");
     } 
   //Serial.println(BT.available());
   Serial.println(BluetoothData);
   delay(50);
}
void bt_g() //====================== BT_G ==============
{
   if(BluetoothData=='g')
     {
       digitalWrite(ledpinG,1);
      // BT.println("LED Zielona ON ! ");
     }
   if (BluetoothData=='2')
     {
       digitalWrite(ledpinG,0);
      // BT.println("LED Zielona Off ! ");
     }  
   // Serial.println(BT.available());
    Serial.println(BluetoothData);
    delay(50);
}
void bt_b() //====================== BT_B ==============
{
   if(BluetoothData == 'b')
     {
       digitalWrite(ledpinB,1);
      // BT.println("LED Niebieska ON ! ");
     }
   if (BluetoothData == '3')
     {
       digitalWrite(ledpinB,0);
      // BT.println("LED Niebieska Off ! ");
     }  
    Serial.println(BluetoothData);
    //Serial.println(BT.available());
    delay(50);
}  

void tempIN()//======================== tempIN =============
{
  if (sensors.available())
  {
    int temperatureIN = sensors.readTemperature(sensorTemp1);
    sensors.request(sensorTemp1);
    Serial.println((temperatureIN)%100);
   }

  delay(2000);
}  
I nie chce drukowac na Serial co 2 sec. :(
razorxx100
Starszy majsterkowicz
Posty: 329
Rejestracja: 1 sie 2014, 22:57

Re: Bluetooth + RGB LED + DS18B20

Post autor: razorxx100 » 19 mar 2015, 14:34

No a niby jak chcesz to zrobic?
e-szymek przeciez ci podal najlepsze i chyba jedyne rozmiazanie, chyba ze chcesz stosowac delay i zatrzymywac caly program..
mgreta36
Majsterkowicz
Posty: 115
Rejestracja: 11 mar 2014, 22:20

Re: Bluetooth + RGB LED + DS18B20

Post autor: mgreta36 » 19 mar 2015, 16:25

Ok - podaje na serial co 2 sec. pomiar z temp.
Ale na te same 2 sec. zatrzymuje się sterowanie diodami. Dodałem
long czas_poprzedni = 0;
i
if((millis() - czas_poprzedni) > 2000) tempIN();

i dalej sie zatrzymuje sterowanie LED.

Jakieś propozycje ?
stiven
Złota rączka
Posty: 1599
Rejestracja: 13 maja 2014, 08:47
Lokalizacja: Zielona Góra

Re: Bluetooth + RGB LED + DS18B20

Post autor: stiven » 19 mar 2015, 17:11

No ale co ty zrobiłeś? Dodałeś if((millis() - czas_poprzedni) > 2000) tempIN(), okej, ale masz też delay(2000) w funkcji tempIN(), to on powoduje zatrzymanie programu i nie można sterować diodami (w rzeczywistości to tylko ten delay powoduje przerwę na dwie sekundy, bo brakuje paru szczegółów do ifa, aby działał prawidłowo, tutaj działa zawsze).
Usuń delay.
Masz linijkę if((millis() - czas_poprzedni) > 2000) tempIN(); a pod nią tempIN(); usuń tą drugą linijkę.
Zmienna czas_poprzedni musi być co te dwie sekundy aktualizowana, czyli najlepiej w funkcji tempIN() wpisz: czas_poprzedni = millis();
mgreta36
Majsterkowicz
Posty: 115
Rejestracja: 11 mar 2014, 22:20

Re: Bluetooth + RGB LED + DS18B20

Post autor: mgreta36 » 19 mar 2015, 19:52

Teraz mam tak :

Kod: Zaznacz cały

// http://www.element14.com/community/people/neilk/blog/2014/07/18/app-inventor-and-arduino-part-2--send-data-from-arduino-to-android-app
// http://www.instructables.com/id/Android-receiving-data-from-arduino-via-bluetooth-/

//#include <SoftwareSerial.h>
//SoftwareSerial BT(11,10); // RX, TX
#include <OneWire.h>
#include <DS18B20.h>
#define ONEWIRE_PIN 2
OneWire onewire(ONEWIRE_PIN);
DS18B20 sensors(&onewire);
byte sensorTemp1[8] = {0x28, 0x7F, 0x94, 0xCB, 0x4, 0x0, 0x0, 0x39};
//byte sensorTemp2[8] = {0x28, 0x87, 0x6A, 0xA1, 0x3, 0x0, 0x0, 0x1F};  

int BluetoothData;
int ledpinR=26;
int ledpinG=28;
int ledpinB=30;
long czas_poprzedni = 0;

void setup() //============================= setup =======
{
 // BT.begin(9600);
  sensors.begin();
  //BT.available();
  Serial.begin(38400);
  pinMode(ledpinR,OUTPUT);
  pinMode(ledpinG,OUTPUT);
  pinMode(ledpinB,OUTPUT);
}

void bt_r() //====================== BT_R ==============
{
   if(BluetoothData=='r')
     {
       digitalWrite(ledpinR,1);
      // BT.println("LED Czerwona ON ! ");
     }
   if (BluetoothData=='1')
     {
       digitalWrite(ledpinR,0);
      // BT.println("LED Czerwona Off ! ");
     } 
   //Serial.println(BT.available());
   Serial.println(BluetoothData);
   delay(50);
}
void bt_g() //====================== BT_G ==============
{
   if(BluetoothData=='g')
     {
       digitalWrite(ledpinG,1);
      // BT.println("LED Zielona ON ! ");
     }
   if (BluetoothData=='2')
     {
       digitalWrite(ledpinG,0);
      // BT.println("LED Zielona Off ! ");
     }  
   // Serial.println(BT.available());
    Serial.println(BluetoothData);
    delay(50);
}
void bt_b() //====================== BT_B ==============
{
   if(BluetoothData == 'b')
     {
       digitalWrite(ledpinB,1);
      // BT.println("LED Niebieska ON ! ");
     }
   if (BluetoothData == '3')
     {
       digitalWrite(ledpinB,0);
      // BT.println("LED Niebieska Off ! ");
     }  
    Serial.println(BluetoothData);
    //Serial.println(BT.available());
    delay(50);
}  

void tempIN()//======================== tempIN =============
{
  if (sensors.available())
  {
    int temperatureIN = sensors.readTemperature(sensorTemp1);
    sensors.request(sensorTemp1);
    Serial.println((temperatureIN)%100);
    czas_poprzedni = 0;
  }
//  while(!sensors.available());
  //temperature = sensors.readTemperature(sensorTemp1);
  //Serial.println((uint8_t)temperatureIN);
  //delay(2000);
}  

void loop()//============================== loop =========
{
  BluetoothData=Serial.read();
    bt_r();
    bt_g();
    bt_b();
    if((millis() - czas_poprzedni) >= 2000) tempIN();    
}
i dalej bez zmian.
stiven
Złota rączka
Posty: 1599
Rejestracja: 13 maja 2014, 08:47
Lokalizacja: Zielona Góra

Re: Bluetooth + RGB LED + DS18B20

Post autor: stiven » 19 mar 2015, 20:05

W funkcji tempIN() czas_poprzedni = millis() (wartość zwracana przez tą funkcję millis() cały czas się zwiększa, wpisujesz nowy, aktualny czas, żeby potem można było sprawdzić czy minęły kolejne 2 sekundy sprawdzając różnicę między millis() i czas poprzedni, inaczej się nie da).

Jak robisz deklarację long czas_poprzedni, to też zrób long czas_poprzedni = millis(); (to jest bez sensu trochę, ale zauważyłem ostatnio, że jak przy deklaracji nie napisze się millis(), to to nie chce działać).
mgreta36
Majsterkowicz
Posty: 115
Rejestracja: 11 mar 2014, 22:20

Re: Bluetooth + RGB LED + DS18B20

Post autor: mgreta36 » 19 mar 2015, 22:45

No nie kumam... czasu.

Teraz dwie procedury wygladają tak:

Kod: Zaznacz cały

void tempIN()//======================== tempIN =============
{
  if (sensors.available())
  {
    int temperatureIN = sensors.readTemperature(sensorTemp1);
    sensors.request(sensorTemp1);
    Serial.println((temperatureIN)%100);    
   }
}
void loop()//============================== loop =========
{
  BluetoothData=Serial.read();
    bt_r();
    bt_g();
    bt_b();
    //tempIN();
    long czas_poprzedni = millis();
    if((millis() - czas_poprzedni) > 2000) tempIN();    
    czas_poprzedni = 0;
}
stiven
Złota rączka
Posty: 1599
Rejestracja: 13 maja 2014, 08:47
Lokalizacja: Zielona Góra

Re: Bluetooth + RGB LED + DS18B20

Post autor: stiven » 19 mar 2015, 22:50

Kod: Zaznacz cały

    // http://www.element14.com/community/people/neilk/blog/2014/07/18/app-inventor-and-arduino-part-2--send-data-from-arduino-to-android-app
    // http://www.instructables.com/id/Android-receiving-data-from-arduino-via-bluetooth-/

    //#include <SoftwareSerial.h>
    //SoftwareSerial BT(11,10); // RX, TX
    #include <OneWire.h>
    #include <DS18B20.h>
    #define ONEWIRE_PIN 2
    OneWire onewire(ONEWIRE_PIN);
    DS18B20 sensors(&onewire);
    byte sensorTemp1[8] = {0x28, 0x7F, 0x94, 0xCB, 0x4, 0x0, 0x0, 0x39};
    //byte sensorTemp2[8] = {0x28, 0x87, 0x6A, 0xA1, 0x3, 0x0, 0x0, 0x1F}; 

    int BluetoothData;
    int ledpinR=26;
    int ledpinG=28;
    int ledpinB=30;
    unsigned long czas_poprzedni = millis();

    void setup() //============================= setup =======
    {
     // BT.begin(9600);
      sensors.begin();
      //BT.available();
      Serial.begin(38400);
      pinMode(ledpinR,OUTPUT);
      pinMode(ledpinG,OUTPUT);
      pinMode(ledpinB,OUTPUT);
    }

    void bt_r() //====================== BT_R ==============
    {
       if(BluetoothData=='r')
         {
           digitalWrite(ledpinR,1);
          // BT.println("LED Czerwona ON ! ");
         }
       if (BluetoothData=='1')
         {
           digitalWrite(ledpinR,0);
          // BT.println("LED Czerwona Off ! ");
         }
       //Serial.println(BT.available());
       Serial.println(BluetoothData);
       delay(50);
    }
    void bt_g() //====================== BT_G ==============
    {
       if(BluetoothData=='g')
         {
           digitalWrite(ledpinG,1);
          // BT.println("LED Zielona ON ! ");
         }
       if (BluetoothData=='2')
         {
           digitalWrite(ledpinG,0);
          // BT.println("LED Zielona Off ! ");
         } 
       // Serial.println(BT.available());
        Serial.println(BluetoothData);
        delay(50);
    }
    void bt_b() //====================== BT_B ==============
    {
       if(BluetoothData == 'b')
         {
           digitalWrite(ledpinB,1);
          // BT.println("LED Niebieska ON ! ");
         }
       if (BluetoothData == '3')
         {
           digitalWrite(ledpinB,0);
          // BT.println("LED Niebieska Off ! ");
         } 
        Serial.println(BluetoothData);
        //Serial.println(BT.available());
        delay(50);
    } 

    void tempIN()//======================== tempIN =============
    {
      if (sensors.available())
      {
        int temperatureIN = sensors.readTemperature(sensorTemp1);
        sensors.request(sensorTemp1);
        Serial.println((temperatureIN)%100);
        czas_poprzedni = millis();
      }
    //  while(!sensors.available());
      //temperature = sensors.readTemperature(sensorTemp1);
      //Serial.println((uint8_t)temperatureIN);
      //delay(2000);
    } 

    void loop()//============================== loop =========
    {
      BluetoothData=Serial.read();
        bt_r();
        bt_g();
        bt_b();
        if((millis() - czas_poprzedni) >= 2000) tempIN();   
    }
ODPOWIEDZ

Strony partnerskie: