Bzučák, PT100, led pásek

Wiring, C++, C, Java, ...
Pravidla fóra
Toto subfórum slouží k řešení obecných otázek kolem programování (konstrukce, knihovny, alokace paměti, ...)
Odpovědět
rodico
Příspěvky: 5
Registrován: 04 lis 2018, 00:35
Reputation: 0

Bzučák, PT100, led pásek

Příspěvek od rodico » 04 lis 2018, 01:05

Ahoj,
ve Wiringu jsem začátečník a prosím o radu při konstrukci knihovny.
V projektu měřím 9 teplot pomocí PT100. Jako signalizaci jednotlivých teplotních hladin používám led pásek a buzz.

Teploty sleduji ve 3 úrovních:
1. studená úroveň, 2. příprava, 3. ready status.
1. a 2. úroveň mě úplně nezajímá, ale 3. už ano.

Když mi teplota skočí do určité hladiny, rozsvítím danou barvu na led pásku. (To mi chodí).
Když se ovšem teplota převalí do 3. hladiny, pak potřebuji navíc k led pásku aktivovat buzz po dobu (1000ms) a hned ho zase vypnout.. a tady už mi to dělá neplechu. Buď píská pořád, nebo začne pískat ve 3. úrovni - což potřebuji ale už se nevypne. Přes digitalWrite ani přes Tone a noTone mi to prostě nejde.

Buzz používám - YL-44 a desku Arduino Mega.
Co mám zadat do podmínky, aby mi v poslední úrovni sepnul, trval 1vteřinu (1000ms) a hned zase vypnul?
Díky a přeji hezký večer!


Kod:

#include <Adafruit_MAX31865.h>
#include <RGBdriver.h>


//Teploty
//CS, DI, DO, CLK
Adafruit_MAX31865 max_1 = Adafruit_MAX31865(7, 4, 2, 3); //Cont1
Adafruit_MAX31865 max_2= Adafruit_MAX31865(7, 4, 2, 5); //Cont2
Adafruit_MAX31865 max_3= Adafruit_MAX31865(7, 4, 2, 6); //Cont3
Adafruit_MAX31865 max_4 = Adafruit_MAX31865(7, 4, 2, 8); //Fpat
Adafruit_MAX31865 max_5= Adafruit_MAX31865(7, 4, 2, 9); //Pat
Adafruit_MAX31865 max_6= Adafruit_MAX31865(7, 4, 2, 10); //Bcont
Adafruit_MAX31865 max_7 = Adafruit_MAX31865(7, 4, 2, 11); //Fcont
Adafruit_MAX31865 max_8= Adafruit_MAX31865(7, 4, 2, 12); //res1
Adafruit_MAX31865 max_9= Adafruit_MAX31865(7, 4, 2, 13); //res2

#define RREF 430.0
#define RNOMINAL 100.0

//Led pasek
#define CLK 14
#define DIO 15
RGBdriver Driver(CLK,DIO);

//bzucak
#define buz 16



void setup() {
Serial.begin(115200);
pinMode(buz, OUTPUT);



max_1.begin(MAX31865_4WIRE);
max_2.begin(MAX31865_4WIRE);
max_3.begin(MAX31865_4WIRE);
max_4.begin(MAX31865_4WIRE);
max_5.begin(MAX31865_4WIRE);
max_6.begin(MAX31865_4WIRE);
max_7.begin(MAX31865_4WIRE);
max_8.begin(MAX31865_4WIRE);
max_9.begin(MAX31865_4WIRE);



}

void loop() {
uint16_t rtd1 = max_1.readRTD();
uint16_t rtd2 = max_2.readRTD();
uint16_t rtd3 = max_3.readRTD();
uint16_t rtd4 = max_1.readRTD();
uint16_t rtd5 = max_2.readRTD();
uint16_t rtd6 = max_3.readRTD();
uint16_t rtd7 = max_1.readRTD();
uint16_t rtd8 = max_2.readRTD();
uint16_t rtd9 = max_3.readRTD();


float ratio1 = rtd1;
float ratio2 = rtd2;
float ratio3 = rtd3;
float ratio4 = rtd1;
float ratio5 = rtd2;
float ratio6 = rtd3;
float ratio7 = rtd1;
float ratio8 = rtd2;
float ratio9 = rtd3;

ratio1 /= 32768;
ratio2 /= 32768;
ratio3 /= 32768;
ratio4 /= 32768;
ratio5 /= 32768;
ratio6 /= 32768;
ratio7 /= 32768;
ratio8 /= 32768;
ratio9 /= 32768;



Serial.print("Cont1 = ");
Serial.println(max_1.temperature(100, RREF));
Serial.print("Cont2 = ");
Serial.println(max_2.temperature(100, RREF));
Serial.print("Cont3 = ");
Serial.println(max_3.temperature(100, RREF));
Serial.print("FPat = ");
Serial.println(max_4.temperature(100, RREF));
Serial.print("Pat = ");
Serial.println(max_5.temperature(100, RREF));
Serial.print("BCont = ");
Serial.println(max_6.temperature(100, RREF));
Serial.print("FCont = ");
Serial.println(max_7.temperature(100, RREF));
Serial.print("Res1 = ");
Serial.println(max_8.temperature(100, RREF));
Serial.print("Res2 = ");
Serial.println(max_9.temperature(100, RREF));



Serial.println();

//Teploty CONT1-3, piny 3,5,6

//Cont1

if(max_1.temperature(100, RREF) < 26){ //studena - prvni uroven bila
Driver.SetColor(100, 100, 100);
Driver.begin();

}


if((max_1.temperature(100, RREF) > 27) && (max_1.temperature(100, RREF) < 29)){ //priprava - druha uroven modra
Driver.SetColor(0, 0, 255);
Driver.begin();

}

if(max_1.temperature(100, RREF) > 30){ //ready - treti uroven zelena
Driver.begin();
Driver.SetColor(0, 255, 0);

digitalWrite(buz, HIGH);
delay(250);
digitalWrite(buz, LOW);

}
else{digitalWrite(buz,LOW);}


}

petan
Příspěvky: 274
Registrován: 23 črc 2017, 10:19
Reputation: 0
Kontaktovat uživatele:

Re: Bzučák, PT100, led pásek

Příspěvek od petan » 04 lis 2018, 11:02

Snadné by bylo vytvořit si proměnnou, která bude aktivní jenom jeden cyklus po překročení teploty. Hlídala by se tedy náběžná hrana. Nezkoušel jsem to.

Kód: Vybrat vše

bool signal1; //hlídaný signál
bool lasSignal1; //minulé stav
bool edgeSignal1; //proměnná je true pouze jeden cyklus po náběžné hraně 

---

if(max_1.temperature(100, RREF) > 30){ //ready - treti uroven zelena
input1 = true;
}
else{
input1 = false;
}

 //detekce hrany signálu 
 edgeSignal1 = (signal1 ^ lastSignal1) & signal1; 
 
 if signal1{
 //pokud došlo k sepnutí signálu, tak pípni
 //toto se sepne pouze na jeden cyklus po překročení teploty
 tone(buz, 5000, 1000);
 }
 
  //uložení minulého stavu vstupů 
 lastSignal1 = signal1; 
Jo a ještě si zkontroluj podmínky. Která podmínka se splní v případě, že bude teplota 26, nebo 27°? Která podmínka se splní v případě, že bude teplota 29, nebo 30°? Žádná.

petan
Příspěvky: 274
Registrován: 23 črc 2017, 10:19
Reputation: 0
Kontaktovat uživatele:

Re: Bzučák, PT100, led pásek

Příspěvek od petan » 04 lis 2018, 12:50

mám tam chybu. Místo "if signal1{" má být "if edgeSignal1{"

rodico
Příspěvky: 5
Registrován: 04 lis 2018, 00:35
Reputation: 0

Re: Bzučák, PT100, led pásek

Příspěvek od rodico » 04 lis 2018, 13:38

Ahoj,
díky za radu.

Když to tam dám, tak se stane následující:

Buz píská pořád. Ve chvíli, kdy se dostanu do zelené úrovně, tak mi tam jiným tonem na vteřinu pípne jiná frekvence buzu a vypne. Zatímco první buz píská pořád dál.

Když smažu pinMode(buz, OUTPUT); pak nic nepíská a jakmile se dostanu do zelené úrovně tak písknou buzy 2. Jeden na vteřinu, druhý na pořád.

Kód: Vybrat vše

#include <Adafruit_MAX31865.h>
#include <RGBdriver.h>

bool signal1; //hlídaný signál
bool lastSignal1; //minulé stav
bool edgeSignal1; //proměnná je true pouze jeden cyklus po náběžné 



//Teploty
//CS, DI, DO, CLK 
Adafruit_MAX31865 max_1 = Adafruit_MAX31865(7, 4, 2, 3); //Cont1
Adafruit_MAX31865 max_2= Adafruit_MAX31865(7, 4, 2, 5); //Cont2
Adafruit_MAX31865 max_3= Adafruit_MAX31865(7, 4, 2, 6); //Cont3
Adafruit_MAX31865 max_4 = Adafruit_MAX31865(7, 4, 2, 8); //Fpat
Adafruit_MAX31865 max_5= Adafruit_MAX31865(7, 4, 2, 9); //Pat
Adafruit_MAX31865 max_6= Adafruit_MAX31865(7, 4, 2, 10); //Bcont
Adafruit_MAX31865 max_7 = Adafruit_MAX31865(7, 4, 2, 11); //Fcont
Adafruit_MAX31865 max_8= Adafruit_MAX31865(7, 4, 2, 12); //res1
Adafruit_MAX31865 max_9= Adafruit_MAX31865(7, 4, 2, 13);  //res2

#define RREF      430.0
#define RNOMINAL  100.0

//Led pasek
#define CLK 14        
#define DIO 15
RGBdriver Driver(CLK,DIO);

//bzucak
#define buz 16


Kód: Vybrat vše

void setup() {  
  Serial.begin(115200);  
pinMode(buz, OUTPUT);
  

 max_1.begin(MAX31865_4WIRE); 
 max_2.begin(MAX31865_4WIRE); 
 max_3.begin(MAX31865_4WIRE); 
 max_4.begin(MAX31865_4WIRE); 
 max_5.begin(MAX31865_4WIRE); 
 max_6.begin(MAX31865_4WIRE);
 max_7.begin(MAX31865_4WIRE); 
 max_8.begin(MAX31865_4WIRE); 
 max_9.begin(MAX31865_4WIRE);



}

Kód: Vybrat vše

void loop() { 
  
  uint16_t rtd1 = max_1.readRTD();
  uint16_t rtd2 = max_2.readRTD();  
  uint16_t rtd3 = max_3.readRTD();
  uint16_t rtd4 = max_1.readRTD();
  uint16_t rtd5 = max_2.readRTD();  
  uint16_t rtd6 = max_3.readRTD();
  uint16_t rtd7 = max_1.readRTD();
  uint16_t rtd8 = max_2.readRTD();  
  uint16_t rtd9 = max_3.readRTD();
 
 
  float ratio1 = rtd1; 
  float ratio2 = rtd2; 
  float ratio3 = rtd3;
  float ratio4 = rtd1; 
  float ratio5 = rtd2; 
  float ratio6 = rtd3;
  float ratio7 = rtd1; 
  float ratio8 = rtd2; 
  float ratio9 = rtd3;

   ratio1 /= 32768;   
   ratio2 /= 32768;   
   ratio3 /= 32768;  
   ratio4 /= 32768;   
   ratio5 /= 32768;   
   ratio6 /= 32768;
   ratio7 /= 32768;   
   ratio8 /= 32768;   
   ratio9 /= 32768;   
   
   
   
   Serial.print("Cont1 = ");
   Serial.println(max_1.temperature(100, RREF));  
   Serial.print("Cont2 = "); 
   Serial.println(max_2.temperature(100, RREF));
   Serial.print("Cont3 = "); 
   Serial.println(max_3.temperature(100, RREF));
   Serial.print("FPat = ");
   Serial.println(max_4.temperature(100, RREF));  
   Serial.print("Pat = "); 
   Serial.println(max_5.temperature(100, RREF));
   Serial.print("BCont = "); 
   Serial.println(max_6.temperature(100, RREF));
   Serial.print("FCont = ");
   Serial.println(max_7.temperature(100, RREF));  
   Serial.print("Res1 = "); 
   Serial.println(max_8.temperature(100, RREF));
   Serial.print("Res2 = "); 
   Serial.println(max_9.temperature(100, RREF));



  Serial.println(); 

  //Teploty CONT1-3, piny 3,5,6

  //Cont1
  
 if(max_1.temperature(100, RREF) < 26){ 
  Driver.SetColor(100, 100, 100);
  Driver.begin();
 
  }

    
if((max_1.temperature(100, RREF) > 27) && (max_1.temperature(100, RREF) < 29)){ 
  Driver.SetColor(0, 0, 255);    
  Driver.begin();

}

if(max_1.temperature(100, RREF) > 30){ //ready - treti uroven zelena
Driver.SetColor(0, 255, 0);    
  Driver.begin();

signal1 = true;
}
else{
signal1 = false;
}

 //detekce hrany signálu 
 edgeSignal1 = (signal1 ^ lastSignal1) & signal1; 
 
 if (edgeSignal1){
 //pokud došlo k sepnutí signálu, tak pípni
 //toto se sepne pouze na jeden cyklus po překročení teploty
 tone(buz, 5000, 1000);
 }
 
  //uložení minulého stavu vstupů 
  lastSignal1 = signal1;
}

rodico
Příspěvky: 5
Registrován: 04 lis 2018, 00:35
Reputation: 0

Re: Bzučák, PT100, led pásek

Příspěvek od rodico » 11 lis 2018, 21:40

Tak nakonec jsem to trochu obešel pomocí další podmínky.
Ve sledovaném rozpětí "fáze přípravy" jsem vložil podmínku 29.1 - 29.9, pak přejde na 30 a buzz vypne.
Do void setupu jsem dal ještě jeden buzz - inicializace po zapnutí.
K jednorázovému sepnutí buzzu v podmínce a následného vypnutí, jsem se rady nikde nedočetl.
#include <Adafruit_MAX31865.h>
#include <RGBdriver.h>


//Teploty
//CS, DI, DO, CLK
Adafruit_MAX31865 max_1 = Adafruit_MAX31865(7, 4, 2, 3); //Cont1
Adafruit_MAX31865 max_2= Adafruit_MAX31865(7, 4, 2, 5); //Cont2
Adafruit_MAX31865 max_3= Adafruit_MAX31865(7, 4, 2, 6); //Cont3
Adafruit_MAX31865 max_4 = Adafruit_MAX31865(7, 4, 2, 8); //Fpat
Adafruit_MAX31865 max_5= Adafruit_MAX31865(7, 4, 2, 9); //Pat
Adafruit_MAX31865 max_6= Adafruit_MAX31865(7, 4, 2, 10); //Bcont
Adafruit_MAX31865 max_7 = Adafruit_MAX31865(7, 4, 2, 11); //Fcont
Adafruit_MAX31865 max_8= Adafruit_MAX31865(7, 4, 2, 12); //res1
Adafruit_MAX31865 max_9= Adafruit_MAX31865(7, 4, 2, 13); //res2

#define RREF 430.0
#define RNOMINAL 100.0

//Led pasek
#define CLK 14
#define DIO 15
RGBdriver Driver(CLK,DIO);

//bzucak
int bzucak = 16;
void setup() {
Serial.begin(115200);
pinMode(bzucak, HIGH);
delay(1500);
pinMode(bzucak, LOW);

max_1.begin(MAX31865_4WIRE);
max_2.begin(MAX31865_4WIRE);
max_3.begin(MAX31865_4WIRE);
max_4.begin(MAX31865_4WIRE);
max_5.begin(MAX31865_4WIRE);
max_6.begin(MAX31865_4WIRE);
max_7.begin(MAX31865_4WIRE);
max_8.begin(MAX31865_4WIRE);
max_9.begin(MAX31865_4WIRE);


}

void loop() {
uint16_t rtd1 = max_1.readRTD();
uint16_t rtd2 = max_2.readRTD();
uint16_t rtd3 = max_3.readRTD();
uint16_t rtd4 = max_1.readRTD();
uint16_t rtd5 = max_2.readRTD();
uint16_t rtd6 = max_3.readRTD();
uint16_t rtd7 = max_1.readRTD();
uint16_t rtd8 = max_2.readRTD();
uint16_t rtd9 = max_3.readRTD();


float ratio1 = rtd1;
float ratio2 = rtd2;
float ratio3 = rtd3;
float ratio4 = rtd1;
float ratio5 = rtd2;
float ratio6 = rtd3;
float ratio7 = rtd1;
float ratio8 = rtd2;
float ratio9 = rtd3;

ratio1 /= 32768;
ratio2 /= 32768;
ratio3 /= 32768;
ratio4 /= 32768;
ratio5 /= 32768;
ratio6 /= 32768;
ratio7 /= 32768;
ratio8 /= 32768;
ratio9 /= 32768;



Serial.print("Cont1 = ");
Serial.println(max_1.temperature(100, RREF));
Serial.print("Cont2 = ");
Serial.println(max_2.temperature(100, RREF));
Serial.print("Cont3 = ");
Serial.println(max_3.temperature(100, RREF));
Serial.print("FPat = ");
Serial.println(max_4.temperature(100, RREF));
Serial.print("Pat = ");
Serial.println(max_5.temperature(100, RREF));
Serial.print("BCont = ");
Serial.println(max_6.temperature(100, RREF));
Serial.print("FCont = ");
Serial.println(max_7.temperature(100, RREF));
Serial.print("Res1 = ");
Serial.println(max_8.temperature(100, RREF));
Serial.print("Res2 = ");
Serial.println(max_9.temperature(100, RREF));



Serial.println();

//Teploty CONT1-3, piny 3,5,6

//Cont1
if(max_1.temperature(100, RREF) < 26){
Driver.SetColor(100, 100, 100);
Driver.begin(); // begin

}
//chladna faze
if((max_1.temperature(100, RREF) > 27) && (max_1.temperature(100, RREF) < 29)){
Driver.SetColor(0, 0, 255);
Driver.begin(); // begin

}
//pripravna faze
if((max_1.temperature(100, RREF) > 29.1) && (max_1.temperature(100, RREF) < 29.9)){
Driver.SetColor(0, 255, 0);
Driver.begin(); // begin
pinMode(bzucak, HIGH);
delay(60);
pinMode(bzucak, LOW);

}

//faze pripraveno
if(max_1.temperature(100, RREF) > 30){
Driver.begin(); // begin
Driver.SetColor(0, 255, 0);
}

}

petan
Příspěvky: 274
Registrován: 23 črc 2017, 10:19
Reputation: 0
Kontaktovat uživatele:

Re: Bzučák, PT100, led pásek

Příspěvek od petan » 11 lis 2018, 22:11

Ty podmínky máš furt takový kostrbatý. Sice jsi snížil rozptyl, ale stejně tam je prostor, kde není žádná podmínka splněna.
Lepší by to bylo takhle:

Kód: Vybrat vše

if((max_1.temperature(100, RREF) > 27) && (max_1.temperature(100, RREF) <= 29)){
//splněno pokud je teplota nad 27° a menší, nebo rovna 29°}

if((max_1.temperature(100, RREF) > 29) && (max_1.temperature(100, RREF) <= 30)){
//splněno pokud je teplota nad 29° a menší, nebo rovna 30°}

if(max_1.temperature(100, RREF) > 30){
//splněno, pokud je teplota větší než 30°}
Tímhle je od teploty nad 27 výše vždycky jedna podmínka splněna. Bez žádných hluchých míst.

Ta detekce hrany, jak jsem psal předtím tedy nefungovala? Použil jsem tam funkci Tone. Ta se používá pro generování tónů. Ale už jsem to dlouho nepoužíval, takže si nejsem úplně jistej, jak funguje. Nejradši pracuju přímo s HW, kde si to můžu vyzkoušet. Ale pokud neřešíš nějaké časování (nevadí ti delay), tak by šlo použít toto:

Kód: Vybrat vše

bool signal1; //hlídaný signál
bool lasSignal1; //minulé stav
bool edgeSignal1; //proměnná je true pouze jeden cyklus po náběžné hraně 

---

if(max_1.temperature(100, RREF) > 30){ //ready - treti uroven zelena
input1 = true;
}
else{
input1 = false;
}

 //detekce hrany signálu 
 edgeSignal1 = (signal1 ^ lastSignal1) & signal1; 
 
 if (edgeSignal1) {
 //pokud došlo k sepnutí signálu, tak pípni
 //toto se sepne pouze na jeden cyklus po překročení teploty
 pinMode(bzucak, HIGH);
delay(60);
pinMode(bzucak, LOW);
 }
 
  //uložení minulého stavu vstupů 
 lastSignal1 = signal1; 
 
Je to úplně stejný, jako to předtím, ale spíná se na 60 ms jeden výstup. Během toho pípání program visí na místě.

---

Samozřejmě, že by to bylo daleko elegantnější řešit přesným časováním programu. Zkus se mrknout na http://joysfera.blogspot.com/2015/03/ta ... duinu.html Tam je k dispozici Tasker, který jednoduše umožňuje "paralelní" zpracování více věcí na Arduinu. Jde tam vytvořit např. funkce, která je aktivní nějakou dobu a po nastaveném čase se vypne. Tam by se dal vrazit ten pípák.

Ps.: Na vkládání kódu je ti tlačítko "zobrazení kódu". Je to to páté tlačítko vedle uvozovek (citace).

Odpovědět

Kdo je online

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