noratic3
Vytvořené odpovědi
-
AutorPříspěvky
-
Zbyšek Voda
ÚčastníkFB buď Zbyšek Voda, nebo stačí napsat na stránku Arduino.cz na FB
tom.vitek
ÚčastníkProsím tě das mi na tebe tel kontakt nebo facebook ? funguje to přesně naopak než řikas
Zbyšek Voda
ÚčastníkProblém bude v tom, že tak, jak máte program napsaný je opravdu správně chování, že při zmáčknutí tlačítka se relé vypne!
if(buttonState == HIGH) { //!! tato funkce relé vypíná! digitalWrite(relePin1, LOW); } else{ digitalWrite(relePin1, HIGH); }
Pokud chcete, aby stejný stav jako má relé mělo i tlačítko, musíte prohodit LOW a HIGH:
if(buttonState == HIGH) { digitalWrite(relePin1, HIGH); } else{ digitalWrite(relePin1, LOW); }
Dva IFy na stejné úrovni se rozhodně nedají brát jako „hlavní“ a „podřadný“. „Podřadnosti“ dosáhnete až jejich zanořováním 🙂
yenda.net
Účastníktom.vitek
ÚčastníkZdravím, mám tu prosím další problém se kterým si nevím rady:
V tomto programu je ovládání výstupního relé pomocí teploty – funguje samo automaticky
a dále je tu, že když sepnu tlačítko tak by se mělo sepnout i relé. A tady je ten kamen urazu po nahraní teplota automaticky řidí relé, ale když manualně zmačknu tlačítko abych seplo relé,když není seplé tak tato funkce nefunguje. Myslím že chyba bude třeba v rozmístění dané části programu nebo takoveho něco.Je možné že když jsou 2 IF v programu tak jedno program bere jako to hlavní a druhé podřadné?
#include <DHT.h>
#define DHT1PIN 7 //teplota
#define DHT2PIN 6 // teplota 2
#define DHT1TYPE DHT22 //definuje typ senzoru
#define DHT2TYPE DHT22 //definuje typ senzoru
DHT dht1(DHT1PIN, DHT1TYPE); //definuje typ senzoru
DHT dht2(DHT2PIN, DHT2TYPE); //definuje typ senzoru
const int buttonPin1 = 50; // kam je připojeno tlačítko
const int relePin1 = 30; // kam je připojeno rele
int buttonState = 0;void setup() {
Serial.begin(9600);
pinMode(relePin1, OUTPUT);
pinMode(buttonPin1,INPUT);
dht1.begin();
dht2.begin();
}void loop() {
buttonState = digitalRead(buttonPin1);
if (buttonState == HIGH) { // zapneme relé:
digitalWrite(relePin1, LOW);
}
else {
digitalWrite(relePin1, HIGH);
} // vypneme relé:
//automatické ovladani pomoci teploty
if (dht1.readTemperature() >= 30) {
digitalWrite(relePin1, LOW);
}else{
if (dht1.readTemperature() <= 28)
digitalWrite(relePin1, HIGH);
}
//snímani teploty
void teplotavlhkost();
delay(4000);
float h1 = dht1.readHumidity();
float t1 = dht1.readTemperature();
float h2 = dht2.readHumidity();
float t2 = dht2.readTemperature();
if (isnan(t1) || isnan(h1)) {
Serial.println(„Failed to read from DHT #1“);
}
if (isnan(t2) || isnan(h2)) {
Serial.println(„Failed to read from DHT #2“);
}
Serial.print(„T1:“);
Serial.print(dht1.readTemperature(),1);
Serial.print((char)223); // vypíše znak ° na displej
Serial.print(„C „);
}tom.vitek
Účastníkje to tak! díky moc , takhle to vypadá a funguje to 🙂 ještě jednou díky
if (dht1.readTemperature() >= 25.0)
{
digitalWrite(relePin1, LOW);
if (dht1.readTemperature() <= 20.0)
{
digitalWrite(relePin1, HIGH);
}
}Zbyšek Voda
ÚčastníkTo asi bude tim, ze readTemperature je funkce volana na objektu dht1. A funkce potrebuji mit za sebou zavorky (i kdyz treba prazdne). Spravny zapis by tedy byl dht1.readTemperature().
tom.vitek
Účastníkaha, díky na radu ale i když jsem se smazal tak program píše tuhle chybu :
celek_pokus_vetrak.ino:53:28: error: expected primary-expression before ‚>‘ tokena pokud to napisu takhle :
if (dht1.readTemperature > 25.0)
{
digitalWrite(relePin1, LOW);
if (dht1.readTemperature < 20.0)
{
digitalWrite(relePin1, HIGH);
}
}tak chybu to píše :
error: invalid use of member function (did you forget the ‚()‘ ?)Zbyšek Voda
ÚčastníkNebude chyba v tom, ze cisla zabalujete do uvozovek? On je pak program bere jako String a ne jako cislo 😉
tom.vitek
ÚčastníkAhoj, ještě bych tu měl jeden problém :
chci pomocí teploty ovládávat relé na který je napojen větrák
když je teplota => 25°C tak sepni větrák (relé)
když je teplota =< 20°C tak vypni větrák (relé)program:
if (dht1.readTemperature => „25.0“)
{
digitalWrite(relePin1, LOW);
if (dht1.readTemperature =< „20.0“)
{
digitalWrite(relePin1, HIGH);
}
}napsal sem to nějak takhle, ale program mi nebere ty hodnoty
chyba říka:
celek_pokus_vetrak.ino: In function ‚void loop()‘:
celek_pokus_vetrak.ino:53:28: error: expected primary-expression before ‚>‘ token
celek_pokus_vetrak.ino:56:30: error: expected primary-expression before ‚<‚ token
Chyba kompilace.program je vytržen z celého programu zde:
//Projekt Inteligentní skleník Vítek Tomáš
#include <DHT.h> // knihovna dht teploty
#define DHT1PIN 7 //teplota
#define DHT2PIN 6 // teplota 2
#define DHT1TYPE DHT22 //definuje typ senzoru
#define DHT2TYPE DHT22 //definuje typ senzoru
DHT dht1(DHT1PIN, DHT1TYPE); //definuje typ senzoru
DHT dht2(DHT2PIN, DHT2TYPE); //definuje typ senzoru
int temt6000Pin = A0; // senzor svetla
int dirpin = 8; // motorek dir
int steppin = 9; // motorek stepbyte sensorInterrupt = 0; // 0 = digital pin 2 //zacatek prutokomer
byte sensorPin = 2;
float calibrationFactor = 4.5;
volatile byte pulseCount;
float flowRate;
unsigned int flowMilliLitres;
unsigned long totalMilliLitres;
unsigned long oldTime; // konec prutokomer
//———————-POKUS ovladani vetraku —————————–
const int buttonPin1 = 50; // kam je připojeno tlačítko
const int relePin1 = 30; // kam je připojeno rele
int buttonState = 0;
//————————————————————–
void setup() {
Serial.begin(9600);
pinMode(relePin1, OUTPUT); // POKUS rele jako vystup na pin
pinMode(buttonPin1,INPUT); //POKUS tlačítka jako vstup:
pinMode(dirpin, OUTPUT); // motorek
pinMode(steppin, OUTPUT); // motorek
pinMode(sensorPin, INPUT); //zacatek prutokomer
digitalWrite(sensorPin, HIGH);pulseCount = 0;
flowRate = 0.0;
flowMilliLitres = 0;
totalMilliLitres = 0;
oldTime = 0;
attachInterrupt(sensorInterrupt, pulseCounter, FALLING); // konec prutokomer
dht1.begin(); // zacni merit teplotu 1
dht2.begin(); // zacni merit teplotu 2
}void loop() {
//ovládání relé 1 pomocí tlačítka —————–
void vetrak1();
buttonState = digitalRead(buttonPin1);
if (buttonState == HIGH) { // zapneme relé:
digitalWrite(relePin1, LOW);
}else {
digitalWrite(relePin1, HIGH); } // vypneme rele
//ovládání větráku pomocí teploty POKUS ————–
if (dht1.readTemperature => „25.0“)
{
digitalWrite(relePin1, LOW);
if (dht1.readTemperature =< „20.0“)
{
digitalWrite(relePin1, HIGH);
}
}
//——————–prutokomer——————————————–
if((millis() – oldTime) > 1000) // Only process counters once per second
{
detachInterrupt(sensorInterrupt);
flowRate = ((1000.0 / (millis() – oldTime)) * pulseCount) / calibrationFactor;
oldTime = millis();
flowMilliLitres = (flowRate / 60) * 1000;
totalMilliLitres += flowMilliLitres;
unsigned int frac;
pulseCount = 0;
attachInterrupt(sensorInterrupt, pulseCounter, FALLING);
}
//———————-lcd——————————-
clearLCD();
backlightOn();
unsigned int frac; // deklarace promere frac pro prutokomer
//————————————————
selectLineOne();
delay(100);
Serial.print(„T1:“);
Serial.print(dht1.readTemperature(),1);
Serial.print((char)223); // vypíše znak ° na displej
Serial.print(„C „);
Serial.print(„T2:“);
Serial.print(dht2.readTemperature(),1);
Serial.print((char)223); // vypíše znak ° na displej
Serial.print(„C“);
delay(500);
//————————————————
selectLineTwo();
delay(100);
Serial.print(„Vl:“);
Serial.print(dht1.readHumidity(),1);
Serial.print(„% „);
Serial.print(„V2:“);
Serial.print(dht2.readHumidity(),1);
Serial.print(„%“);
delay(500);
//————————————————
selectLineThree();
delay(100);
Serial.print(„VP:“);
Serial.print(analogRead(A1)/11,1);
Serial.print(„% „);
Serial.print(„S:“);
Serial.print(analogRead(temt6000Pin)/11,1);
Serial.print(„%“);
delay(500);
//———————————————
selectLineFour();
delay(100);
Serial.print(„P:“);
Serial.print(int(flowRate)); // Print the integer part of the variable
Serial.print(„.“); // Print the decimal point
frac = (flowRate – int(flowRate)) * 10;
Serial.print(frac, DEC) ; // Print the fractional part of the variable
Serial.print(„L/min“);
Serial.print(„Pc“); // Output separator
Serial.print(totalMilliLitres);
Serial.println(„mL“);
delay(5000);
//——————————————–
}
//SerialLCD Functions
void selectLineOne(){ //puts the cursor at line 0 char 0.
Serial.write(0xFE); //command flag
Serial.write(128); //position
}
void selectLineTwo(){ //puts the cursor at line 2 char 0.
Serial.write(0xFE); //command flag
Serial.write(192); //position
}
void selectLineThree(){ //puts the cursor at line 3 char 0.
Serial.write(0xFE); //command flag
Serial.write(148); //position
}
void selectLineFour(){ //puts the cursor at line 4 char 0.
Serial.write(0xFE); //command flag
Serial.write(212); //position
}
void goTo(int position) { //position = line 1: 0-19, line 2: 20-39, etc, 79+ defaults back to 0
if (position<20){ Serial.write(0xFE); //command flag
Serial.write((position+128)); //position
}else if (position<40){Serial.write(0xFE); //command flag
Serial.write((position+128+64-20)); //position
}else if (position<60){Serial.write(0xFE); //command flag
Serial.write((position+128+20-40)); //position
}else if (position<80){Serial.write(0xFE); //command flag
Serial.write((position+128+84-60)); //position
} else { goTo(0); }
}
void clearLCD(){
Serial.write(0xFE); //command flag
Serial.write(0x01); //clear command.
}
void backlightOn(){ //turns on the backlight
Serial.write(0x7C); //command flag for backlight stuff
Serial.write(157); //light level.
}
void backlightOff(){ //turns off the backlight
Serial.write(0x7C); //command flag for backlight stuff
Serial.write(128); //light level for off.
}
void backlight50(){ //sets the backlight at 50% brightness
Serial.write(0x7C); //command flag for backlight stuff
Serial.write(143); //light level for off.
}
void serCommand(){ //a general function to call the command flag for issuing all other commands
Serial.write(0xFE);
}
//————–motorek1————————–
void motor1(){
int i;
digitalWrite(dirpin, LOW); // Nastaveni smeru
delay(100);
for (i = 0; i<4000; i++) // otočení o 4000 kroků
{
digitalWrite(steppin, LOW); // This LOW to HIGH change is what creates the
digitalWrite(steppin, HIGH); // „Rising Edge“ so the easydriver knows to when to step.
delayMicroseconds(500); // rychlost otáček
}
digitalWrite(dirpin, HIGH); // Nastaveni smeru
delay(10000);
for (i = 0; i<4000; i++) // otočení o 4000 kroků
{
digitalWrite(steppin, LOW); // This LOW to HIGH change is what creates the
digitalWrite(steppin, HIGH); // „Rising Edge“ so the easydriver knows to when to step.
delayMicroseconds(500); // This delay time is close to top speed for this
}
}
// particular motor. Any faster the motor stalls.
//————motorek2——————————–
//————motorek3———————————
//————vetrak1——————————-
//————-vetrak2——————————-
//———————topeni———————-
//——————–LED-paska——————–
// —————-senzor-světla——————-
void svetlo(){
int value = analogRead(temt6000Pin);
}
//—————vlhkost-půdy————————–
void vlhkostpudy(){
int sensorValue = analogRead(A1);
}
//———teplota 1,2 — vlhkost 1,2 —————–
void teplotavlhkost(){
delay(4000);
float h1 = dht1.readHumidity();
float t1 = dht1.readTemperature();
float h2 = dht2.readHumidity();
float t2 = dht2.readTemperature();
if (isnan(t1) || isnan(h1)) {
Serial.println(„Failed to read from DHT #1“);
}
if (isnan(t2) || isnan(h2)) {
Serial.println(„Failed to read from DHT #2“);
}
}
//————-prutokomer——————–
void pulseCounter()
{
pulseCount++;
}Díky
Aleš
ÚčastníkBohužel bydlím v paneláku, takže anemometr ani srážkoměr nemám kam dát. Ale kolega má podobnou meteostanici s Arduinem, a má tam jak anemometr, tak srážkoměr, a chodí mu to celkem bez problému. Anemometr tam má tento: http://www.hadex.cz/t114-anemometr-k-meteostanicim-wh1080-a-wh1090/ a odkaz na jeho měření je zde: http://meteof.wz.cz/uvod.php Co vím, tak dokonce s tím anemometrem jezdil v autě, aby zjistil, jestli to ukazuje správnou rychlost 🙂
Kubusz
ÚčastníkAhoj, taky jsem se chystal na meteostanici, ale ztroskotal jsem na anemometru, který je pro mně nejdůležitější. Pořád ještě bych do toho rád šel, neuvažuješ taky nad rozšíření?
Aleš
ÚčastníkTo jsem nevěděl, že je nula posunutá. Kdysi jsem ho chtěl k něčemu použít, ale zjistil jsem, že to nízké proudy ukazuje špatně. Je to celkem logické, když je v tom hallova sonda. Malý proud, slabé elektrické pole, nízká přesnost.
Jarda_1
ÚčastníkJo, dík už jsem našel a objednal senzor s ACS712 do 20A. Rozlišení asi nebude potřeba dle popisu by měla být nula posunuta a výstup při 0 A be měl být 2,5V, při záporných proudech se bude snižovat o 100mV na A a při kladných zvyšovat takže měření by mělo být bez problému.
Nevím pro proč se schema nezobrazuje, odkaz byl OK.Aleš
ÚčastníkSchéma se nezobrazuje, ale pro měření proudu hledejte „ACS712 Current Sensor Module“. Je to Hall sensor, kterému je docela jedno, jestli skrz něj teče proud tam, nebo zpátky. Ale asi bude problém rozlišit, kterým směrem zrovna teče 🙂 Asi by se k tomu muselo dobastlit ještě něco s diodou, na které by se měřil ten směr. Kolik ampér má v obvodu téct?
Aleš
ÚčastníkAsi takhle. Když budete „uzatvárať obvod bez napätia“, tak se nebude dít vůbec nic. Aby zařízení poznalo, že „někdo zapnul vypínač“, tak musí do jednoho vývodu vypínače pouštět nějaké napětí, a na druhém vývodu vypínače kontrolovat, jestli napětí prochází (sepnuto), nebo neprochází (rozepnuto). Takže máte 2 možnosti. Buď použít relé, to bude univerzální a bez problému, protože jeho kontakty mechanicky uzavřou obvod. Druhá možnost je změřit si napětí na kontaktech, a podle toho použít příslušný tranzistor, nebo tyristor/triak. Vy s tím ale chcete spínat blesk fotoaparátu, takže tam by asi relé použít nešlo, protože má dost velké časové zpoždění. A řekl bych, že to zpoždění nikdy nebude naprosto stejné. Takže pro Vás bude asi varianta č.2, nějaký polovodičový spínací prvek.
Zbyšek Voda
ÚčastníkTomu se věnují třeba tady: http://diy-scib.org/blog/multiple-dht-humidity-sensors-arduino
Sám jsem to ale ještě nezkoušel.tom.vitek
Účastníkještě dotaz: co kdybych tyto čidla měl 2 a chtěl bych jejich hodnoty průměrovat… máte s tím zkušenosti ?
tom.vitek
Účastníkjo, měl jste pravdu bylo to knihovnou. Díky moc už to měří jak má 🙂
Zbyšek Voda
ÚčastníkDobrý den,
myslím, že to bude tím že nemáte staženou, nebo správně přidanou knihovnu. V návodu máte odkaz přímo v prvním odstavci. Kdyžtak návod, jak přidat knihovnu najdete zde: https://bastlirna.hwkitchen.cz/jak-importovat-knihovnu-do-arduino-ide/:)
tom.vitek
Účastníktom.vitek
ÚčastníkNahrál jsem program bez žádneho připojení a nahrálo se to, pak jsem to zapojil a motorek funguje. \Díky 🙂
Zbyšek Voda
ÚčastníkTo asi nebude problém zapojení. Zkoušel jste nahrát program do Arduina bez čehokoliv k němu připojeného?
Ondra78
Účastník
tomas.masar
ÚčastníkAhoj, díky moc za radu. Už to v pořádku funguje :-).
Zbyšek Voda
ÚčastníkAhoj, ten čip používá driver CH340G.
Mělo by stačit stáhnout driver odsud: http://www.arduined.eu/ch340g-converter-windows-7-driver-download/
Je to zip, tak bude možná potřeba ho rozbalit.Pak otevřeš ovládací panely -> Správce zařízení a po připojení nového Arduina by se mělo zobrazit v seznamu zařízení – Neznámé zařízení. Klikneš pravým, dáš aktualizovat ovladač, instalovat z lokálního uložiště a navedeš instalační program na stažený balíček.
To by mělo fungovat.
Bublina6
ÚčastníkKoukni na tuhle stránku, je tam tabulka kde je všech deset pinů popsanejch.
http://forum.gadgetfactory.net/index.php?/topic/1502-low-res-monochrome-hitachi-lcd-driver/
Oldřich Horáček
SprávceZdravím, myslím si že to máte napsané na začátek už tak dost optimálně 🙂
Pokud chcete využít ještě jiný způsob, podívejte se na switch case…
https://arduino.cc/en/Tutorial/SwitchCase
Délka programu zůstane nejspíše stejná.Oldřich Horáček
SprávceAno, myslel jsem jen si změřit proud motoru obyčejným A-metrem. Řekněme na prázdno, při zátěži a taky při zablokovaném motoru. Tímto si uděláte dobrou představu o proudu do motoru a tím budete přesnější zadání pro výběr motor driveru.
journey_cz
ÚčastníkPodarilo se mi ho zprovoznit. Zjistil jsem ze na pinu
7 je +5V
8 zem
9 -12V
10 kontrast přes trimr 8M2 -7V až -12VJeste jak zjistit ty datovy
-
AutorPříspěvky