Můj první pokus s arduinem.
Rozsvicuju ledky podle teploty. Modrou, když je zima. Zelenou, když je akorat. Červenou když je horko. To my ještě šlo, ale když chci rozblikat modrou nebo červenou jako pro velkou zimu, nebo velké teplo tak buď svítí, nebo nesvítí. Komunikace po lince funguje takže v PC vydím hodnoty.
Program zde.
Kód: Vybrat vše
//teplotni cidlo dallas DS18B20 a diody
//knihovny
#include <OneWire.h>
#include <DallasTemperature.h>
#define modra 5
#define zelena 6
#define cervena 7
//nastaveni pinu, promenych
int pinCidlaDS = 4;
int LED = 13;
float teplota = 0;
int spodniLimitBlik = 19;
int spodniLimit = 22;
int horniLimit = 24;
int horniLimitBlik = 27;
unsigned long Time1, dT1;
//instalace oneWireDS z knihovny OneWire
OneWire oneWireDS(pinCidlaDS);
//instalace senzoryDS z knihovny DallasTemperature
DallasTemperature senzoryDS(&oneWireDS);
//----------------------------------------------------------
//-----------------------------------------------------------
void setup() {
//komunikace pres seriovou linku
Serial.begin(9600);
//zapnuti komunikace knihovny s teplotnim cidlem
senzoryDS.begin();
//nastaveni pinu
pinMode(LED, OUTPUT);
pinMode(modra, OUTPUT);
pinMode(zelena, OUTPUT);
pinMode(cervena, OUTPUT);
//prvni vypis po seriove lince
Serial.println("MERENI TEPLOTY S LED DIODAMA");
//zhasnu L LED
digitalWrite(LED, LOW);
dT1 = 1000 / 2;
Time1 = millis();
}
//---------------------------------------------------------
//---------------------------------------------------------
void loop() {
//nacteni informaci ze vsech cidel pripojenych na danem pinu
senzoryDS.requestTemperatures();
//vypis teploty na seriovou linku, pri pripojeni vice cidel na jeden pin muzeme postupne nacist vsechny teploty pomoci zmeny cisla v zavorce (0) - poradi dle unikatni adresy cidel
Serial.print("Teplota cidla DS18B20: ");
Serial.print(senzoryDS.getTempCByIndex(0));
Serial.println("°C");
//nastaveni teplota = vystup cidla
teplota = senzoryDS.getTempCByIndex(0);
//------------------PROBLEM ZDE------------------------------------------------
if(teplota <= spodniLimitBlik){
Serial.println(", velka zima");
//zapne blikani
if(millis() >= Time1){
digitalWrite(modra, !digitalRead(modra));
Time1 += dT1;
}
digitalWrite(zelena, LOW);
digitalWrite(cervena, LOW);}
//--------------------PROBLEM ZDE---------------------------------------------
else if(teplota > spodniLimitBlik && teplota <= spodniLimit)
{Serial.println(", zima");
digitalWrite(modra, HIGH);
digitalWrite(zelena, LOW);
digitalWrite(cervena, LOW);
}
else if(teplota > spodniLimit && teplota < horniLimit)
{Serial.println(", akorat");
digitalWrite(modra, LOW);
digitalWrite(zelena, HIGH);
digitalWrite(cervena, LOW);
}
else if(teplota >= horniLimit && teplota < horniLimitBlik)
{Serial.println(", horko");
digitalWrite(modra, LOW);
digitalWrite(zelena, LOW);
digitalWrite(cervena, HIGH);
}
//----------------------------PROBLEM ZDE---------------------------------
else if(teplota >= horniLimitBlik){
Serial.println(", velke horko");
//zapne blikani
if(millis() >= Time1){
digitalWrite(cervena, !digitalRead(cervena));
Time1 += dT1;
}
digitalWrite(zelena, LOW);
digitalWrite(modra, LOW);
}
//--------------------------PROBLEM ZDE----------------------------------------
//pauza
delay(20000);
}
Zkoušel jsem různe styly programů na to blikání a ani s jedním mi to nešlo.
*********************************************************************************************************
1.
Kód: Vybrat vše
// interval blikani
int interval=1000;
// sledovani casu
unsigned long predchoziMillis=0;
void setup() {
//nastavy pin jeko vystup
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
digitalWrite(5,HIGH);
delay(5000);
}
void loop() {
//zapne blikani
unsigned long aktualniMillis = millis();
if((unsigned long)(aktualniMillis - predchoziMillis) >= interval) {
digitalWrite(5, !digitalRead(5));
predchoziMillis=aktualniMillis;
}
digitalWrite(6,LOW);
}
2.
Kód: Vybrat vše
//aktualni cas
unsigned long aktualniMillis;
//cas posledni akce
unsigned long predchoziMillis;
//promenna pro stav LED
boolean ledSvetlo;
//port pro led
int led = 7;
//-------------------------
//-------------------------
void setup() {
pinMode (led, OUTPUT);
}
//---------------------
//--------------------
void loop() {
aktualniMillis = millis();//podivam se na hodinky
if(ledSvetlo){//potrebuji LED shasnout nebo rosvitit?
if(aktualniMillis - predchoziMillis > 1000) {
predchoziMillis = aktualniMillis;
ledSvetlo=LOW;
}
}else if(aktualniMillis - predchoziMillis > 1000) {
predchoziMillis = aktualniMillis;
ledSvetlo=HIGH;
}
digitalWrite(led, ledSvetlo); //aktualizace stavu LED
}
3.
Kód: Vybrat vše
#define cervena 7
#define modra 5
unsigned long Time1, dT1;
void setup() {
pinMode(cervena, OUTPUT);
pinMode(modra, OUTPUT);
dT1 = 1000 / 2;
Time1 = millis();
}
void loop() {
if(millis() >= Time1){
digitalWrite(modra, !digitalRead(modra));
Time1 += dT1;
}
}
Samostatně fungují, ale nevím jak je naroubovat do programu. Poraďte prosím.