Program C i Arduino. Pomoc.

Coś Ci się zepsuło? Nie chce działać jak powinno? Opisz dokładnie swój problem a postaramy się pomóc...
ptja
Posty: 2414
Rejestracja: poniedziałek 31 gru 2012, 12:44
Lokalizacja: Łódź

Post 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&#40;&#41;;

void setup&#40;&#41; &#123;
  Serial.begin&#40;9600&#41;;
  mySwitch.enableReceive&#40;0&#41;;  // Receiver on inerrupt 0 => that is pin #2
  Serial.print&#40;"aqq"&#41;;
&#125;

void loop&#40;&#41; &#123;
  if &#40;mySwitch.available&#40;&#41;&#41; &#123;
    
    int value = mySwitch.getReceivedValue&#40;&#41;;  
    
    if &#40;value == 0&#41; &#123;
      Serial.print&#40;"Unknown encoding"&#41;;
    &#125; else &#123;
      Serial.print&#40;"Received "&#41;;
      Serial.print&#40; mySwitch.getReceivedValue&#40;&#41; &#41;;
      Serial.print&#40;" / "&#41;;
      Serial.print&#40; mySwitch.getReceivedBitlength&#40;&#41; &#41;;
      Serial.print&#40;"bit "&#41;;
      Serial.print&#40;"Protocol&#58; "&#41;;
      Serial.println&#40; mySwitch.getReceivedProtocol&#40;&#41; &#41;;
    &#125;

    mySwitch.resetAvailable&#40;&#41;;
  &#125;
&#125;
--
pozdrawiam,
Jarek Andrzejewski
Mieciu
Posty: 455
Rejestracja: czwartek 29 sie 2013, 19:34
Lokalizacja: Białystok

Post 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]
fedu
Posty: 220
Rejestracja: piątek 11 gru 2015, 09:02
Lokalizacja: Zamosc

Post autor: fedu »

Błąd komplikacji dla płytki Arduino.
ptja
Posty: 2414
Rejestracja: poniedziałek 31 gru 2012, 12:44
Lokalizacja: Łódź

Post autor: ptja »

Powodzenia.
--
pozdrawiam,
Jarek Andrzejewski
Marcin S.
Posty: 435
Rejestracja: piątek 12 wrz 2008, 10:11

Post 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.
Awatar użytkownika
Pyra
Site Admin
Posty: 8527
Rejestracja: niedziela 02 sie 2009, 20:35
Lokalizacja: Gądki

Post 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
Izali miecz godniejszy niżli topór w boju?
Piszmy po polsku, wszak jesteśmy Polakami.
fedu
Posty: 220
Rejestracja: piątek 11 gru 2015, 09:02
Lokalizacja: Zamosc

Post autor: fedu »

Wiem że jestem irytujący. No ale się uczę :mrgreen: 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&#40;ONE_WIRE_BUS&#41;;
LiquidCrystal_I2C lcd&#40;0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE&#41;;  // Ustawienie adresu ukladu na 0x27
DallasTemperature sensors&#40;&oneWire&#41;;  //Przekazanie danych dotyczących One Wire do DallasTemperature
  int buzzer = 10;                             //pin 12 jako buzzer
 

void setup&#40;void&#41;
&#123;
  pinMode&#40;buzzer,OUTPUT&#41;;                    //ustawiamy buzzer jako output
  lcd.begin&#40;16,2&#41;;       //ustaw rozdzielczość ekranu 16x4
  lcd.backlight&#40;&#41;;       // Zalaczenie podwietlenia 
  //Serial.begin&#40;9600&#41;;
  sensors.begin&#40;&#41;;      //Włączenie biblioteki
 
&#125;
 
void loop&#40;void&#41;
&#123;
  sensors.requestTemperatures&#40;&#41;;                  //zazadaj odczyt temperatury z czujnika
  lcd.setCursor&#40;0,0&#41;;                             //ustaw kursor w pozycji 0,0
  lcd.print&#40;"Temp1 &#58;"&#41;;                           //wyswietl "Temperatura&#58; "
  lcd.setCursor&#40;10,0&#41;; 
  lcd.print&#40;sensors.getTempCByIndex&#40;0&#41;&#41;;          //wyswietl wartosc z czujnika 0

  lcd.setCursor&#40;0,1&#41;; 
  lcd.print&#40;"Temp2 &#58;"&#41;;
  lcd.setCursor&#40;10,1&#41;; 
  lcd.print&#40;sensors.getTempCByIndex&#40;1&#41;&#41;;
  delay&#40;1000&#41;;

if&#40;sensors.getTempCByIndex&#40;0&#41; >= 40&#41;       //jezeli temperatura jest >= 50
 
  digitalWrite&#40;buzzer, HIGH&#41;;              //uruchom alaram
  
  //tutaj mozesz wstawic program odpowiedzialny
  //np. za uruchomienie chlodzenia aby obnizyc
  //temperature
  
  else                                    //w przeciwnym wypadku
  digitalWrite&#40;buzzer, LOW&#41;;              //nie uruchamiaj alarmu
&#125;
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&#40;&#41; &#123;
  pinMode&#40;buzzer, OUTPUT&#41;; // set pin 8 as output
&#125;

void loop&#40;&#41; &#123;
  for &#40;int i = 0; i < 100; i++&#41; &#123;  // make a sound
    digitalWrite&#40;buzzer, HIGH&#41;; // send high signal to buzzer 
    delay&#40;1&#41;; // delay 1ms
    digitalWrite&#40;buzzer, LOW&#41;; // send low signal to buzzer
    delay&#40;1&#41;;
  &#125;
  delay&#40;50&#41;;
  for &#40;int j = 0; j < 100; j++&#41; &#123; //make another sound
    digitalWrite&#40;buzzer, HIGH&#41;;
    delay&#40;2&#41;; // delay 2ms
    digitalWrite&#40;buzzer, LOW&#41;;
    delay&#40;2&#41;;
  &#125;
  delay&#40;1000&#41;;
&#125;
ptja
Posty: 2414
Rejestracja: poniedziałek 31 gru 2012, 12:44
Lokalizacja: Łódź

Post autor: ptja »

Oj, nie chcesz skorzystać z rad...
Co oznacza drugi parametr wywołania konstruktora LiquidCrystal_I2C?
--
pozdrawiam,
Jarek Andrzejewski
Awatar użytkownika
Pyra
Site Admin
Posty: 8527
Rejestracja: niedziela 02 sie 2009, 20:35
Lokalizacja: Gądki

Post 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&#40;&#41;;                           //rozpocznij odczyt z czujnika
  lcd.begin&#40;20,4&#41;;                           //ustaw rozdzielczość ekranu 20x4
U ciebie

Kod: Zaznacz cały

  lcd.begin&#40;16,2&#41;;       //ustaw rozdzielczość ekranu 16x4
  lcd.backlight&#40;&#41;;       // Zalaczenie podwietlenia
  //Serial.begin&#40;9600&#41;;
  sensors.begin&#40;&#41;;      //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&#40;void&#41;
&#123;
...
  pinMode&#40;10, OUTPUT&#41;;
  TCCR1A = _BV&#40;COM1A1&#41; | _BV&#40;COM1B1&#41; | _BV&#40;WGM10&#41;;              //beep pasywny
  TCCR1B = _BV&#40;CS11&#41;;              //beep pasywny
...&#125;
A potem wywoływałem:

Kod: Zaznacz cały

  OCR1A = 127;              //beep pasywny
i wyłączałem:

Kod: Zaznacz cały

  OCR1A = 0;  
Pozdrawiam
Izali miecz godniejszy niżli topór w boju?
Piszmy po polsku, wszak jesteśmy Polakami.
fedu
Posty: 220
Rejestracja: piątek 11 gru 2015, 09:02
Lokalizacja: Zamosc

Post 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ę.
Awatar użytkownika
Pyra
Site Admin
Posty: 8527
Rejestracja: niedziela 02 sie 2009, 20:35
Lokalizacja: Gądki

Post 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&#40;sensors.getTempCByIndex&#40;0&#41; >= 40&#41;       //jezeli temperatura jest >= 50 
Sprawdzasz tylko pierwszy czujnik...

Pozdrawiam
Izali miecz godniejszy niżli topór w boju?
Piszmy po polsku, wszak jesteśmy Polakami.
fedu
Posty: 220
Rejestracja: piątek 11 gru 2015, 09:02
Lokalizacja: Zamosc

Post autor: fedu »

Teraz to jak załącza się buzzer to LCD przygasa :roll:
Awatar użytkownika
Pyra
Site Admin
Posty: 8527
Rejestracja: niedziela 02 sie 2009, 20:35
Lokalizacja: Gądki

Post autor: Pyra »

Witam
fedu pisze:Teraz to jak załącza się buzzer to LCD przygasa :roll:
Daj rezystor szeregowo z buzerkiem, nie wiem jaki masz.

Pozdrawiam
Izali miecz godniejszy niżli topór w boju?
Piszmy po polsku, wszak jesteśmy Polakami.
fedu
Posty: 220
Rejestracja: piątek 11 gru 2015, 09:02
Lokalizacja: Zamosc

Post 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&#40;ONE_WIRE_BUS&#41;;
LiquidCrystal_I2C lcd&#40;0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE&#41;;  // Ustawienie adresu ukladu na 0x27
DallasTemperature sensors&#40;&oneWire&#41;;  //Przekazanie danych dotyczących One Wire do DallasTemperature
  int buzzer = 10;                             //pin 12 jako buzzer
 

void setup&#40;void&#41;
&#123;
  Serial.begin&#40;9600&#41;;
  sensors.begin&#40;&#41;;      //Włączenie biblioteki
  pinMode&#40;buzzer,OUTPUT&#41;;                    //ustawiamy buzzer jako output
  lcd.begin&#40;16,2&#41;;       //ustaw rozdzielczość ekranu 16x4
  lcd.backlight&#40;&#41;;       // Zalaczenie podwietlenia 
  
 
&#125;
 
void loop&#40;void&#41;
&#123;
  sensors.requestTemperatures&#40;&#41;;                  //zazadaj odczyt temperatury z czujnika
  lcd.setCursor&#40;0,0&#41;;                             //ustaw kursor w pozycji 0,0
  lcd.print&#40;"Temp1 &#58;"&#41;;                           //wyswietl "Temperatura&#58; "
  lcd.setCursor&#40;10,0&#41;; 
  lcd.print&#40;sensors.getTempCByIndex&#40;0&#41;&#41;;          //wyswietl wartosc z czujnika 0

  sensors.requestTemperatures&#40;&#41;;
  lcd.setCursor&#40;0,1&#41;; 
  lcd.print&#40;"Temp2 &#58;"&#41;;
  lcd.setCursor&#40;10,1&#41;; 
  lcd.print&#40;sensors.getTempCByIndex&#40;1&#41;&#41;;
  delay&#40;1000&#41;;

 if&#40;sensors.getTempCByIndex&#40;0&#41; >= 40&#41;       //jezeli temperatura jest >= 40
 
  digitalWrite&#40;buzzer, HIGH&#41;;              //uruchom alaram
 
 if&#40;sensors.getTempCByIndex&#40;1&#41; >= 40&#41;
  
  digitalWrite&#40;buzzer, HIGH&#41;;              //uruchom alaram
  
  //tutaj mozesz wstawic program odpowiedzialny
  //np. za uruchomienie chlodzenia aby obnizyc
  //temperature
  
  else                                    //w przeciwnym wypadku
  digitalWrite&#40;buzzer, LOW&#41;;              //nie uruchamiaj alarmu
&#125;
Przy tym programie piszczy głośno.

Kod: Zaznacz cały

int buzzer = 10;// setting controls the digital IO foot buzzer
void setup &#40;&#41;
&#123;
  pinMode &#40;buzzer, OUTPUT&#41;;// set the digital IO pin mode, OUTPUT out of Wen
&#125;
void loop &#40;&#41;
&#123;
  unsigned char i, j;// define variables
  while &#40;1&#41;
  &#123;
    for &#40;i = 0; i <80; i++&#41; // Wen a frequency sound
    &#123;
      digitalWrite &#40;buzzer, HIGH&#41;;// send voice
      delay &#40;1&#41;;// Delay 1ms
      digitalWrite &#40;buzzer, LOW&#41;;// do not send voice
      delay &#40;1&#41;;// delay ms
    &#125;
    for &#40;i = 0; i <100; i++&#41; // Wen Qie out another frequency sound
    &#123;
      digitalWrite &#40;buzzer, HIGH&#41;;// send voice
      delay &#40;2&#41;;// delay 2ms
      digitalWrite &#40;buzzer, LOW&#41;;// do not send voice
      delay &#40;2&#41;;// delay 2ms
    &#125;
  &#125;
&#125;
Marcin S.
Posty: 435
Rejestracja: piątek 12 wrz 2008, 10:11

Post 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&#40;0&#41;;
t2 = sensors.getTempCByIndex&#40;0&#41;;
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.
ODPOWIEDZ