Strona 2 z 3
: wtorek 21 mar 2017, 10:52
autor: ptja
fedu pisze: Albo coś robię nie tak.
najprawdopodobniej.
Wklej kod programu (użyj znacznika "code").
Tu przykładowy:
Kod: Zaznacz cały
/*
Simple example for receiving
http://code.google.com/p/rc-switch/
*/
#include <RCSwitch.h>
RCSwitch mySwitch = RCSwitch();
void setup() {
Serial.begin(9600);
mySwitch.enableReceive(0); // Receiver on inerrupt 0 => that is pin #2
Serial.print("aqq");
}
void loop() {
if (mySwitch.available()) {
int value = mySwitch.getReceivedValue();
if (value == 0) {
Serial.print("Unknown encoding");
} else {
Serial.print("Received ");
Serial.print( mySwitch.getReceivedValue() );
Serial.print(" / ");
Serial.print( mySwitch.getReceivedBitlength() );
Serial.print("bit ");
Serial.print("Protocol: ");
Serial.println( mySwitch.getReceivedProtocol() );
}
mySwitch.resetAvailable();
}
}
: wtorek 21 mar 2017, 11:53
autor: Mieciu
Bez wypluwania do portu szeregowego nie napisałbym chyba nic
Kiedy teoria miesza się z praktyką dowiadujemy się o nowych rzeczach, które przeoczyliśmy i właśnie podgląd tego co się dzieje daje nam szansę zareagować i poprawić błędy.
Przykład takiego podglądu sterowania trybami latarki:
[youtube]
http://www.youtube.com/watch?v=3RhyvKOzmI4[/youtube]
: wtorek 21 mar 2017, 13:47
autor: fedu
Błąd komplikacji dla płytki Arduino.
: wtorek 21 mar 2017, 14:23
autor: ptja
Powodzenia.
: wtorek 21 mar 2017, 14:59
autor: Marcin S.
Jarek, nie denerwuj się
Damy radę.
fedu, wklej TWÓJ kod do posta na forum (korzystając ze znacznika Code), a nie przykładowy kod Jarka do Arduino. Zobaczymy, dlaczego nie działa Ci port szeregowy i czemu bzyczek... nie bzyczy.
Pozdrawiam
M.
: wtorek 21 mar 2017, 16:19
autor: Pyra
Witam
fedu napisz skąd wziąłeś ten kod, bo coś mi w nim nie pasuje...
Nie znam dobrze tej biblioteki, ale np. nie widzę poszukiwania adresu czujnika, który potem jest przekazywany do procedury odczytu temperatury.
Skorzystaj może na początek, z jakiegoś programu dołączonego do biblioteki i sprawdź przez port szeregowy, jakie wysyłasz i odbierasz dane itp.
Osobiście używam biblioteki ds18b20, prosta i skuteczna...
Pozdrawiam
: wtorek 21 mar 2017, 19:05
autor: fedu
Wiem że jestem irytujący. No ale się uczę
Program zaczerpnąłem
tutaj
Kod: Zaznacz cały
#include <OneWire.h>
#include <DallasTemperature.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define TEMPERATURE_PRECISION 12 // rozdzielczosc czujnika
#define ONE_WIRE_BUS 2 //Linia danych podpięta jest pod pin 2 Ardiuno
OneWire oneWire(ONE_WIRE_BUS);
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); // Ustawienie adresu ukladu na 0x27
DallasTemperature sensors(&oneWire); //Przekazanie danych dotyczących One Wire do DallasTemperature
int buzzer = 10; //pin 12 jako buzzer
void setup(void)
{
pinMode(buzzer,OUTPUT); //ustawiamy buzzer jako output
lcd.begin(16,2); //ustaw rozdzielczość ekranu 16x4
lcd.backlight(); // Zalaczenie podwietlenia
//Serial.begin(9600);
sensors.begin(); //Włączenie biblioteki
}
void loop(void)
{
sensors.requestTemperatures(); //zazadaj odczyt temperatury z czujnika
lcd.setCursor(0,0); //ustaw kursor w pozycji 0,0
lcd.print("Temp1 :"); //wyswietl "Temperatura: "
lcd.setCursor(10,0);
lcd.print(sensors.getTempCByIndex(0)); //wyswietl wartosc z czujnika 0
lcd.setCursor(0,1);
lcd.print("Temp2 :");
lcd.setCursor(10,1);
lcd.print(sensors.getTempCByIndex(1));
delay(1000);
if(sensors.getTempCByIndex(0) >= 40) //jezeli temperatura jest >= 50
digitalWrite(buzzer, HIGH); //uruchom alaram
//tutaj mozesz wstawic program odpowiedzialny
//np. za uruchomienie chlodzenia aby obnizyc
//temperature
else //w przeciwnym wypadku
digitalWrite(buzzer, LOW); //nie uruchamiaj alarmu
}
Buzzer robi tylko króciutkie i ciche pi, a chciałbym np.
Kod: Zaznacz cały
int buzzer = 10; // set the buzzer control digital IO pin
void setup() {
pinMode(buzzer, OUTPUT); // set pin 8 as output
}
void loop() {
for (int i = 0; i < 100; i++) { // make a sound
digitalWrite(buzzer, HIGH); // send high signal to buzzer
delay(1); // delay 1ms
digitalWrite(buzzer, LOW); // send low signal to buzzer
delay(1);
}
delay(50);
for (int j = 0; j < 100; j++) { //make another sound
digitalWrite(buzzer, HIGH);
delay(2); // delay 2ms
digitalWrite(buzzer, LOW);
delay(2);
}
delay(1000);
}
: wtorek 21 mar 2017, 19:33
autor: ptja
Oj, nie chcesz skorzystać z rad...
Co oznacza drugi parametr wywołania konstruktora LiquidCrystal_I2C?
: wtorek 21 mar 2017, 19:35
autor: Pyra
Witam
Czy cokolwiek się wyświetla na LCD?
Kiedyś miałem problem, bo okazało się, że znaczenie ma kolejność inicjalizacji bibliotek.
W przykładzie masz
Kod: Zaznacz cały
sensors.begin(); //rozpocznij odczyt z czujnika
lcd.begin(20,4); //ustaw rozdzielczość ekranu 20x4
U ciebie
Kod: Zaznacz cały
lcd.begin(16,2); //ustaw rozdzielczość ekranu 16x4
lcd.backlight(); // Zalaczenie podwietlenia
//Serial.begin(9600);
sensors.begin(); //Włączenie biblioteki
Ty masz buzzer pasywny, który wymaga, właśnie podawania fali prostokątnej na wyjściu, a nie tylko stanu, tak działa buzzer aktywny. Ja w takim wypadku, konfigurowałem PWM, i aktywowałem go z wypełnieniem 50%
Kod: Zaznacz cały
....
Void setup(void)
{
...
pinMode(10, OUTPUT);
TCCR1A = _BV(COM1A1) | _BV(COM1B1) | _BV(WGM10); //beep pasywny
TCCR1B = _BV(CS11); //beep pasywny
...}
A potem wywoływałem:
i wyłączałem:
Pozdrawiam
: wtorek 21 mar 2017, 20:05
autor: fedu
Wyświetlacz działa wyświetla itd. Tylko buzzer się załącza na chwilę i bardzo cichutko jak jest 50stC. Przy opadaniu temperatury też piknie przy 50. No i tylko przy pierwszym czujnika. Przy drugim buzzer nie reaguję.
: wtorek 21 mar 2017, 20:12
autor: Pyra
Witam
fedu pisze:Tylko buzzer się załącza na chwilę i bardzo cichutko jak jest 50stC. Przy opadaniu temperatury też piknie przy 50.
Już pisaliśmy o co chodzi.
fedu pisze:No i tylko przy pierwszym czujniku. Przy drugim buzzer nie reaguje.
Przecież:
Kod: Zaznacz cały
if(sensors.getTempCByIndex(0) >= 40) //jezeli temperatura jest >= 50
Sprawdzasz tylko pierwszy czujnik...
Pozdrawiam
: wtorek 21 mar 2017, 21:42
autor: fedu
Teraz to jak załącza się buzzer to LCD przygasa
: wtorek 21 mar 2017, 22:19
autor: Pyra
Witam
fedu pisze:Teraz to jak załącza się buzzer to LCD przygasa
Daj rezystor szeregowo z buzerkiem, nie wiem jaki masz.
Pozdrawiam
: środa 22 mar 2017, 11:40
autor: fedu
Rezystor 4,7k na czujniku ds18d20. Zaczyna coś brzęczeć ale dalej cicho i z przerwami na pierwszym czujniku. Na drugim tylko pyka raz. Ciężkie to do ogarnięcia jest. Ktoś umie połączyć te dwa sketche? Żeby przy danej temperaturze z 1 i/lub 2 czujnika zaczęło grać.
Kod: Zaznacz cały
#include <OneWire.h>
#include <DallasTemperature.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define TEMPERATURE_PRECISION 12 // rozdzielczosc czujnika
#define ONE_WIRE_BUS 2 //Linia danych podpięta jest pod pin 2 Ardiuno
OneWire oneWire(ONE_WIRE_BUS);
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); // Ustawienie adresu ukladu na 0x27
DallasTemperature sensors(&oneWire); //Przekazanie danych dotyczących One Wire do DallasTemperature
int buzzer = 10; //pin 12 jako buzzer
void setup(void)
{
Serial.begin(9600);
sensors.begin(); //Włączenie biblioteki
pinMode(buzzer,OUTPUT); //ustawiamy buzzer jako output
lcd.begin(16,2); //ustaw rozdzielczość ekranu 16x4
lcd.backlight(); // Zalaczenie podwietlenia
}
void loop(void)
{
sensors.requestTemperatures(); //zazadaj odczyt temperatury z czujnika
lcd.setCursor(0,0); //ustaw kursor w pozycji 0,0
lcd.print("Temp1 :"); //wyswietl "Temperatura: "
lcd.setCursor(10,0);
lcd.print(sensors.getTempCByIndex(0)); //wyswietl wartosc z czujnika 0
sensors.requestTemperatures();
lcd.setCursor(0,1);
lcd.print("Temp2 :");
lcd.setCursor(10,1);
lcd.print(sensors.getTempCByIndex(1));
delay(1000);
if(sensors.getTempCByIndex(0) >= 40) //jezeli temperatura jest >= 40
digitalWrite(buzzer, HIGH); //uruchom alaram
if(sensors.getTempCByIndex(1) >= 40)
digitalWrite(buzzer, HIGH); //uruchom alaram
//tutaj mozesz wstawic program odpowiedzialny
//np. za uruchomienie chlodzenia aby obnizyc
//temperature
else //w przeciwnym wypadku
digitalWrite(buzzer, LOW); //nie uruchamiaj alarmu
}
Przy tym programie piszczy głośno.
Kod: Zaznacz cały
int buzzer = 10;// setting controls the digital IO foot buzzer
void setup ()
{
pinMode (buzzer, OUTPUT);// set the digital IO pin mode, OUTPUT out of Wen
}
void loop ()
{
unsigned char i, j;// define variables
while (1)
{
for (i = 0; i <80; i++) // Wen a frequency sound
{
digitalWrite (buzzer, HIGH);// send voice
delay (1);// Delay 1ms
digitalWrite (buzzer, LOW);// do not send voice
delay (1);// delay ms
}
for (i = 0; i <100; i++) // Wen Qie out another frequency sound
{
digitalWrite (buzzer, HIGH);// send voice
delay (2);// delay 2ms
digitalWrite (buzzer, LOW);// do not send voice
delay (2);// delay 2ms
}
}
}
: środa 22 mar 2017, 19:56
autor: Marcin S.
Nie lubię tak, ale muszę Cię skierować do jakiegoś kursu podstaw języka C. Poszukaj, jak działa if...else. W przypadku przekroczenia temperatury na pierwszym czujniku ustawiasz wyjście w stan wysoki, drugie if ten stan od razu kasuje. Tam trzeba sumę logiczną warunków zrobić.
Niepotrzebnie też za każdym razem czytasz temperaturę z czujników. Na początku pętli podstaw je do zmiennych i działaj na tych zmiennych. Jakoś tak:
Kod: Zaznacz cały
t1 = sensors.getTempCByIndex(0);
t2 = sensors.getTempCByIndex(0);
W pętli nie ma śladu kodu do obsługi portu szeregowego, więc nie działa
Poczyść najpierw to, bo kod buzzera na przerwaniach trzeba zrobić, nie wszystko na raz.
Pozdrawiam
M.