Hallo Zusammen, ich habe einen ATmega328P auf einem Breadboard und diesen über die Arduino IDE programmiert. Output funktioniert auch alles super. Auch das Senden von fixen Daten über Funk an meinen Pi funktioniert problemlos. Was jedoch nicht funktioniert, ist das Abfragen von Eingängen. void setup() { //Bewegungssensor pinMode(5, INPUT_PULLUP); digitalWrite(5, HIGH); } void loop() { //Dieser Wert ist immer 0 Dies ist jetzt ein Bewegungssensor. //Auch Temperatursensor liefert keinen Wert. //Das Gleiche direkt am Nano funktioniert super. //Habe auch schon die Pins gewechselt. int test = digitalRead(5); } Muss man hier bei einem nackten ATmega328P noch irgendetwas beachten was beim Nano und Uno auch so funktioniert? Danke! VG, Thomas
Hey Christopher, vielen Dank für die schnelle Antwort. Kannst du mir bitte ein Beispiel für meinen Code geben wie ich diese Zuordnung mache? Vielen Dank! Thomas
Christopher B. schrieb: > Ja, die Zuordnung von pin Nummer zu Port Die Zuordnung Pin Nummer zu Port erledigt die offensichtlich benutze Arduino Software Ebene. Thomas Z. schrieb: > Was jedoch nicht funktioniert, ist das Abfragen von Eingängen. An welchem Pin vom ATmega328 hast du denn dein Signal angelegt und was für eine Boardbeschreibungsdatei hast du in der Arduino IDE verwendet? Ob du am richtigen Pin gewackelt hast, kannst du feststellen, indem du ihn erstmal als Ausgang z.B. blinken läßt, prüfst, ob das der von dir vermeintlich als Eingang zugeordnete Pin ist und du dann wieder zu deiner Eingangstestfunktion gehst.
Hallo Wolfgang, ich hatte den digitalen Pin 2 und Pin 5 verwendet. ArduinoPin 2 am ATmega328P = PD2 ArduinoPin 5 am ATmega328P = PD5 Das mit der LED hatte ich an den Pins getestet und funktioniert wunderbar. Anbei die Boardbeschreibung: ############################################################## atmega328bb.name=ATmega328 on a breadboard (8 MHz internal clock) atmega328bb.upload.protocol=arduino atmega328bb.upload.maximum_size=30720 atmega328bb.upload.speed=57600 atmega328bb.bootloader.low_fuses=0xE2 atmega328bb.bootloader.high_fuses=0xDA atmega328bb.bootloader.extended_fuses=0x05 atmega328bb.bootloader.file=atmega/ATmegaBOOT_168_atmega328_pro_8MHz.hex atmega328bb.bootloader.unlock_bits=0x3F atmega328bb.bootloader.lock_bits=0x0F atmega328bb.build.mcu=atmega328p atmega328bb.build.f_cpu=8000000L atmega328bb.build.core=arduino:arduino atmega328bb.build.variant=arduino:standard atmega328bb.bootloader.tool=arduino:avrdude atmega328bb.upload.tool=arduino:avrdude Viele Grüße, Thomas
Dieses ist doppelt gemoppelt:
1 | pinMode(5, INPUT_PULLUP); |
2 | digitalWrite(5, HIGH); |
Einfach nur:
1 | pinMode(5, INPUT_PULLUP); |
2 | // digitalWrite(5, HIGH);
|
reicht völlig Alternativ:
1 | pinMode(5, INPUT); |
2 | digitalWrite(5, HIGH); |
Oder nur
1 | digitalWrite(5, HIGH); |
Weil der Default sowieso Input ist. Tipp: Arduino Pin 5 Ist PD5 Am DIL ATMega328P Pin 11
Danke für den Hinweis mit dem doppelt gemoppelten. :) Aber für mein Problem hast du auch keine Idee, was ich machen kann... oder? Das Teil kostet mich ganz schön Nerven.
Hallo, zum ersten Posting, ein "nackten" ATmega328P hat keinen Bootloader und läuft nur mit 1MHz RC Oszillator ! Programmier ihn ohne die Arduino-IDE, das ist sicherlich die bessere Lösung um schnellen Code zu schreiben.
Thomas Z. schrieb: > //Dieser Wert ist immer 0 Dies ist jetzt ein Bewegungssensor. > //Auch Temperatursensor liefert keinen Wert. Woher weisst du das ? Wo und wie wird dieser Wert angezeigt bzw. ausgegeben ? > Aber für mein Problem hast du auch keine Idee, was ich machen kann... > oder? In main() über serial ständig PD5 ausgeben. Dann einfach PD5 mit einem Kabel mehrmals kurz mit Masse verbinden. im loop laufen lassen.
Hallo Karl, sorry, da habe ich mich wohl falsch ausgedrückt. Also der Arduino Bootloader ist drauf. Mit nackt meinte ich nur, dass es ein reiner ATmega328P ist. Wenn man nach ATmega328P googelt, findet man immer nur Beiträge zu Arduinos. Ich hätte ihn gerne mit Atmel Studio so programmiert, da ich mit Atmel Studio allerdings nicht schaffen konnte, die String Bibliothek einzubinden, bin ich dann auf die Arduino IDE umgestiegen. Und hier geht soweit alles ganz gut, nur das Auslesen von Sensoren leider nicht. Egal ob Temperatur- oder Bewegungssensor. VG, Thomas
Hallo Marc, das weiß ich, weil ich mir die Werte mit einem Funkmodul NRF24L01+ an meinen BananaPi senden lasse. Und dort sehe ich dann die Daten die ankommen. Am Senden kann es nicht liegen. Sofern ich feste Zahlen eintrage, kommen die sauber drüben an. Hier mal der gesamte Code:
1 | #include <SPI.h> |
2 | #include "nRF24L01.h" |
3 | #include "RF24.h" |
4 | #include "printf.h" |
5 | #include "DHT.h" |
6 | |
7 | |
8 | |
9 | |
10 | //DHT 22 Sensor
|
11 | DHT dht; |
12 | |
13 | /* Hardware configuration: Set up nRF24L01 radio on SPI bus plus pins 9, 13 */
|
14 | RF24 radio(8,7); |
15 | uint64_t pipeAddressSenderLivingroom = 0xf0f0f0f0e1; |
16 | uint64_t pipeAddressReceiver = 0xf0f0f0f0d2; |
17 | |
18 | struct dataStruct{ |
19 | char room[4] = "WZ"; |
20 | float temperature = 0.0; |
21 | float humidity = 0.0; |
22 | int test = 8; |
23 | } data; |
24 | |
25 | |
26 | |
27 | |
28 | void setup() { |
29 | // put your setup code here, to run once:
|
30 | |
31 | |
32 | //DHT 22
|
33 | dht.setup(2); // data pin 2 |
34 | |
35 | //NRF24L01
|
36 | // Serial.begin(9600);
|
37 | radio.begin(); |
38 | |
39 | radio.setPALevel(RF24_PA_HIGH); |
40 | radio.setDataRate(RF24_250KBPS); |
41 | radio.setChannel(87); |
42 | radio.setRetries(15,15); |
43 | //radio.setAutoAck(1,false);
|
44 | |
45 | //Sender
|
46 | radio.openReadingPipe(1,pipeAddressReceiver); |
47 | radio.openWritingPipe(pipeAddressSenderLivingroom); |
48 | radio.stopListening(); |
49 | // printf_begin();
|
50 | // radio.printDetails();
|
51 | |
52 | //Bewegungssensor
|
53 | pinMode(5, INPUT); |
54 | digitalWrite(5, HIGH); |
55 | |
56 | }
|
57 | |
58 | void loop() { |
59 | // put your main code here, to run repeatedly:
|
60 | |
61 | data.temperature = dht.getTemperature(); |
62 | data.test = digitalRead(5); |
63 | data.humidity = dht.getHumidity(); |
64 | |
65 | // Serial.println(data.temperature);
|
66 | // Serial.println(data.humidity);
|
67 | // Serial.println();
|
68 | |
69 | // printf("Now sending ");
|
70 | // printf("",sizeof(data));
|
71 | //unsigned long time = millis();
|
72 | radio.stopListening(); |
73 | //bool ok = radio.write( &time, sizeof(unsigned long) );
|
74 | bool ok = radio.write(&data,sizeof(data)); |
75 | radio.startListening(); |
76 | // if (ok)
|
77 | // printf("ok.\n\r");
|
78 | // else
|
79 | // printf("failed.\n\r");
|
80 | |
81 | delay(dht.getMinimumSamplingPeriod()); |
82 | //delay(600000);
|
83 | |
84 | }
|
Thomas Z. schrieb: > void loop() { > > //Dieser Wert ist immer 0 Dies ist jetzt ein Bewegungssensor. > //Auch Temperatursensor liefert keinen Wert. > //Das Gleiche direkt am Nano funktioniert super. > //Habe auch schon die Pins gewechselt. > > int test = digitalRead(5); > > } hallo thomas, so kann das nicht funktionieren! die zeile "int test = digitalRead(5);" optimiert der kompiler einfach weg, da "test" nicht weiter verwendet wird. oder ist das nicht der vollständige code? gruß toni ups, da war ich wohl zu langsam :-(
:
Bearbeitet durch User
Hallo Toni, das war nur ein vereinfachtes Beispiel um mein Problem zu erklären. ;) Den Code habe ich eben weiter oben komplett gepostet.
Thomas Z. schrieb: > Daten die ankommen. Am Senden kann es nicht liegen. Sofern ich feste > Zahlen eintrage, kommen die sauber drüben an. Und so ?
1 | void loop() { |
2 | data.test = digitalRead(5); |
3 | Serial.println(data.test); |
4 | |
5 | delay(50); |
6 | }
|
Und dann mehrmals PD5 mit GND verbinden. Wenn es funktioniert, dht testen, danach nRF. Irgendwo muss man ja mit der Fehlersuche anfangen und das sollen ja nicht gleich zwei Sensoren und 2 Funkmodule sein...
Hallo Marc, ich weise nochmal darauf hin, dass es sich um einen ATmega328P handelt, der nur mit der Arduino IDE programmiert wird. Es ist kein Arduino. Daher gibt es auch keine serielle Schnittstelle zu meinem PC. Deshalb muss ich den Umweg über das Funkmodul gehen.
Thomas Z. schrieb: > ist kein Arduino. Daher gibt es auch keine serielle Schnittstelle zu > meinem PC. Deshalb muss ich den Umweg über das Funkmodul gehen. Nein. Lasse einfach an irgendeinem Portpin eine LED leuchten, wenn sich am PD5 irgendetwas ändert, bzw. LED ist AN wenn PD5 == 0 und AUS wenn PD5 == 1. Dasselbe danach für dht, wenn dht <> 0, LED ist AN usw.
:
Bearbeitet durch User
Thomas Z. schrieb: > Daher gibt es auch keine serielle Schnittstelle zu > meinem PC. Deshalb muss ich den Umweg über das Funkmodul gehen. Ein Funkmodul scheint doch für solche elementaren Tests arg übertrieben. Man könnte einfach einen anderen Pin als Ausgang initialisieren und dort eine LED anschließen, auf die man ein Echo vom Pin 5 ausgibt.
So, ich habe jetzt mal einen Test mit einer LED gemacht und es tut sich auch nichts. Anbei mal ein Screenshot was mein oben gepostetes Programm derzeit an den Pi sendet.
Thomas Z. schrieb: > So, ich habe jetzt mal einen Test mit einer LED gemacht und es tut sich > auch nichts. Und wenn du PD5 mehrmals kurz mit GND verbindest ?
:
Bearbeitet durch User
Also ich habe jetzt mal einen komplett neuen ATmega328P genommen und jetzt kommen auch schon mal Werte an. Allerdings nicht die, dich ich mir erhofft hatte. (siehe Screenshot)
Thomas Z. schrieb: > Also ich habe jetzt mal einen komplett neuen ATmega328P genommen und > jetzt kommen auch schon mal Werte an. Allerdings nicht die, dich ich mir > erhofft hatte. (siehe Screenshot) Wie wird der Bewegungssensor gestartet und wie werden die Werte eingelesen ? Wo wird bei dir DHTPIN definiert ? Wo wird bei dir DHTTYPE definiert ?
Der Bewegungsmelder (Sensor) muss ja nicht gestartet werden. Eingelesen wird er hier
1 | data.test = digitalRead(5); |
Für die DHT Pins gibt's eine extra Klasse. Die habe ich hier her: http://playground.arduino.cc/Main/DHTLib VG, Thomas
Hall zusammen, anbei hänge ich nochmal den Schaltplan mit an. Vielleicht ist der hilfreich. VG, Thomas.
Thomas Z. schrieb: > Hall zusammen, anbei hänge ich nochmal den Schaltplan mit an. Vielleicht > ist der hilfreich. Da solltest du erstmal ein bisschen aufräumen und die wirren Striche beseitigen, bevor du den raus gibst.
Schau mal da hin - z.B. wie das Teil angeschlossen wird ... https://learn.adafruit.com/dht/connecting-to-a-dhtxx-sensor
Hallo Dieter, auch mit zusätzlichem externen Pullup-Widerstand wie auf der Seite beschrieben, bekomm ich leider keine ordentlichen Werte. Temp: 0,0 Grad, Feuchtigkeit: 2,0 Prozent. VG, Thomas
Ich hoffe du hast deiner Schaltung, entgegen dem "Schaltplan", zumindest die Standardkondensatoren am Spannungsregler und µC spendiert.
Hallo Hubert, ja, ich hatte es auch mit Angstkondensator versucht. Auch das hatte leider nichts geholfen. VG, Thomas
Thomas Z. schrieb: > ja, ich hatte es auch mit Angstkondensator versucht. Auch das hatte > leider nichts geholfen. Tja, so geht das mit Arduino users - wenn der Sketch nicht läuft, ist man schon am Ende... Zum letzten Mal: Marc V. schrieb: > Wo wird bei dir DHTPIN definiert ? > Wo wird bei dir DHTTYPE definiert ? Marc V. schrieb: > Wie wird der Bewegungssensor gestartet und wie werden die Werte > eingelesen ? Thomas Z. schrieb: > Der Bewegungsmelder (Sensor) muss ja nicht gestartet werden. > Eingelesen wird er hierdata.test = digitalRead(5); Marc V. schrieb: > Und wenn du PD5 mehrmals kurz mit GND verbindest ? Reagiert PinD5 überhaupt als Eingang (Taster nach Masse) ?
Marc V. schrieb: > Tja, so geht das mit Arduino users - wenn der Sketch nicht läuft, > ist man schon am Ende... Mag im Einzelfall so sein... Aber kein Grund die kategorische Keule zu schwingen. Falls du nicht weißt, was das bedeutet: "kategorisches Urteil (einfache, nicht an Bedingungen geknüpfte Behauptung)" Aus dem Duden.
U. F. schrieb: > Falls du nicht weißt, was das bedeutet: Danke, ich weiss es auch ohne Duden zu bemühen. Falls du nicht weiter als Grundschule gekommen bist: Das nennt sich Logik, wird schon in Gymnasium gelehrt.
Hallo Zusammen, ich habe nochmal einen Test gemacht. Also Blink LED an PIN 2 und auch an PIN 5 funktioniert super. Es sind nur die Eingänge die nicht wollen. Selbst ein Taster liefert mir nichts zurück. Egal ob gedrückt oder nicht. Egal ob mit oder ohne PULLUP bzw. PULLDOWN - Widerstand. Es scheint fast so, als könnten die Pins an diesem ATmega ausschließlich schreiben und nicht lesen. Achso Marc, DHT Type wird automatisch ermittelt. Das macht die Bibliothek die ich oben gepostet hatte: http://playground.arduino.cc/Main/DHTLib DHT-Pin: Siehe oben den Code
1 | //DHT 22
|
2 | dht.setup(2); // data pin 2 |
VG, Thomas
:
Bearbeitet durch User
Thomas Z. schrieb: > ich habe nochmal einen Test gemacht. Also Blink LED an PIN 2 und auch an > PIN 5 funktioniert super. > > Es sind nur die Eingänge die nicht wollen. Selbst ein Taster liefert mir > nichts zurück. Egal ob gedrückt oder nicht. Egal ob mit oder ohne PULLUP Bravo. Hat nicht mal volle 4 Tage gedauert. Marc V. schrieb: > Dann einfach PD5 mit einem Kabel mehrmals kurz mit Masse verbinden. Marc V. schrieb: > Und dann mehrmals PD5 mit GND verbinden. Marc V. schrieb: > Lasse einfach an irgendeinem Portpin eine LED leuchten, wenn sich > am PD5 irgendetwas ändert, bzw. LED ist AN wenn PD5 == 0 und Marc V. schrieb: > Und wenn du PD5 mehrmals kurz mit GND verbindest ? Marc V. schrieb: > Reagiert PinD5 überhaupt als Eingang (Taster nach Masse) ?
Hallo Marc, ich hatte die Tests vorher schon gemacht. Auch deinen Trick, den Pin mehrmals kurz mit Masse zu verbinden. Dann hat sich der Wert der Temperatur bei Verbindung von 1,0 auf NaN geändert. Hatte nur heute nochmal komplett von vorn begonnen. Da es aber heute wieder nichts gebracht hatte, habe ich nun zusätzlich noch einen neuen ATmega328P genommen und nun funktioniert zumindest mal der Taster und ein Bodenfeuchtemesser bringt auch akzeptable Daten. Evtl. hat der andere ATmega eine Macke. Kann es sein, dass die DHT Bibliothek, welche ich verwende, einfach nur ausschließlich für Arduino funktioniert? Oder kann es evtl. was mit der Frequenz zu tun haben wegen der Einlesezeit am Sensor?
Hallo, der Arduino ist ein Mega328 mit Bootloader. Natülich verlassen sich die Routinen darauf, daß der AVR mit der angegeben Taktfrequenz läuft, also 16MHz beim Uno und Nano und 8 oder 16MHz beim ProMini. Für andere Frequenzen wirst Du Dir eine passende Boardbeschreibung in boards.txt bauen müssen, wenn Du mit der IDE compilierst. Gruß aus Berlin Michael
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.