DigitalWrite bringt keine Antwort

Hallo Forum,

ich stehe vor folgendem Problem. Und zwar rufe ich in einer Funktion folgendes auf: digitalWrite(light_pin, HIGH); Leider wird dies aber nicht ausgeführt. Eine Zeile davor und dahinter habe ich mir mal im Serial Monitor einen Test ausgeben lassen, der erscheint auch.

Könnt ihr mir schon helfen, oder braucht es noch mehr Informationen? Ich wäre euch sehr dankbar.

Hast du den Pin im setup erwähnt?

const int ledPin = 13;

void setup() {
pinMode(ledPin, OUTPUT);
}

void loop() {
digitalWrite(ledPin, HIGH);
}

Bei solchen Fragen bitte immer den Sketch im Code-Block mitposten. Erspart einige Rückfragen.

Ja, das habe ich gemacht. Auch wenn ich den Pin im Setup ansteuere funtioniert es. Nur in der Funktion kommt keine Antwort.

pinMode(light_pin, OUTPUT); // declare light_pin an output
   digitalWrite(reset_pin, HIGH); // set reset_pin to HIGH
   pinMode(reset_pin, OUTPUT);

Hi,

welchen Pin versuchst Du denn anzuschalten?

Wenn im Programm steht: pinMode(8, OUTPUT); digitalWrite(8, HIGH); und der Compiler keinen Fehler meldet, sollte DP8 auch auf +5V gehen. Bringst Du vielleicht die Pinbezeichnungen (in meinem Beispiel DP8) mit den Pins am Controller durcheinander und schaust dann, ob der falsche Pin HIGH wird? DP8 wäre am ATMega8 (168/328) z.B. Pin 14.

Gruß,
Ralf

Da kann ich dir grad nicht folgen. Ich poste mal meinen Code:

#include <Ethernet.h>
#include <SPI.h>

int light_pin = 12; // pin of the light

byte ip[] = { 192, 168, 0, 72 };
byte server[] = { xxx, xxx, xxx, xxx };
char host[] = "xxxxx.xx"; // host-address

char c;
String count_string;
int new_count_int;
int old_count_int;

String serverData = String();
char serverName[] = "www.xxxxxxx.xx";

int isTransferring = 0;
long likeDifference = 0;
long likeCount = 0;
long likeNumber = 0;
long lastLikeCount = 0;

EthernetClient client;

void setup()
{  
   pinMode(light_pin, OUTPUT); // declare light_pin an output
    
   Ethernet.begin(ip);
   Serial.begin(9600);

   delay(1000);

   Serial.println("connecting...");
}

void loop()
{ 
  digitalWrite(light_pin, HIGH);   // sets the LED on
  delay(1000);                  // waits for a second
  digitalWrite(light_pin, LOW);    // sets the LED off
  delay(1000); 
  if(isTransferring == 0){
    if (client.connect(serverName, 80)) {
  
      // Make a HTTP request:
      client.println("GET http://www.projecter.de/arduino.html HTTP/1.1"); //replace with your php script path
      client.println("Host: http://www.projecter.de/arduino.html"); //replaced with your php script host
      client.println();
      
      isTransferring = 1;
    } else {
      isTransferring = 0; 
    }
  }
  
  while (client.available()) {
    
    // Collect client response data
    char c = client.read();
    
    // Append to our returned server data to parse later
    serverData += c;

  }
  
  if(isTransferring == 1){
    
    // if the server's disconnected, stop the client:
    if (!client.connected()) {
	
      Serial.println();
      Serial.println("disconnecting.");
      client.stop();
      
      isTransferring = 0;
      
      long likeLine = long(serverData.indexOf("?="));
      Serial.println("like line");
      Serial.println(likeLine);
      
      //substr out the count number
      String likeCount = String(serverData.substring(likeLine+2, likeLine+17));
      //remove white space
      likeCount.trim();
      
      Serial.println("like count");
      Serial.println(likeCount);
      //convert
      likeNumber = stringToLong(likeCount);
      
      Serial.println("likeNumber:");
      Serial.println(likeNumber);
            
      Serial.println("lastLikeCount:");
      Serial.println(lastLikeCount);
            
      // How many likes since last time?
      likeDifference = likeNumber - lastLikeCount;
      
      // Save the new like value
      lastLikeCount = likeNumber;
        
      Serial.println("likeDifference:");
      Serial.println(likeDifference);
      
      if(likeDifference > 0 && likeDifference != lastLikeCount){
        for(int i=0;i<likeDifference;i++){
            Serial.println("Blinking...");
            delay(2000);
            pinMode(light_pin, OUTPUT);
            digitalWrite(light_pin, HIGH);
            delay(2000);
            digitalWrite(light_pin, LOW);
        }
      }
      
      serverData = String();
      
      // Wait X more seconds before checking again. 5000 is 5 sec
      delay(5000);
    }
  }  
}

long stringToLong(String s) {
    char arr[12];
    s.toCharArray(arr, sizeof(arr));
    return atol(arr);
}

void alarm(){
   digitalWrite(light_pin, HIGH); // set light_pin to HIGH: turn light on
   delay(3000); // wait
   digitalWrite(light_pin, LOW); // set light_pin to LOW: turn light off
}

Der DigitalWrite am Anfang von Loop hab ich zum testen mal reingeschrieben. Der wird schon nicht ausgeführt.

Update: Habe gerade mal Ethernet.begin(ip); ausgeklammert, dann funktioniert es. Hilft das vielleicht?

Ich nehme mal an Du hast einen Arduino UNO und ein Ethenetshield mit dem W5100 und sd Karte.
Die Schnittstelle für den Ethernetbaustein benutzt das Pin 12. Darum kannst Du das pin 12 nicht für die LED benutzen. Gleiches gilt für die Pins 13, 11, 10 und 4.

int light_pin = 12; // pin of the light

Grüße Uwe

Hallo Uwe,

danke für die Info. Habe aber leider auch schon andere PINs probiert, leider ohne Erfolg.

Also mein Vorschlag wäre jetzt systematisch vorgehen: Zuerst mal alle Shields ab und sehen, ob Du einen Sketch zum Laufen bekommst, in dem nur die LED am gewünschten Pin blinkt. Wenn das geht, Shield wieder drauf und sehen ob es immer noch geht.
Wenn es ohne Shield klappt, weißt Du, das Du den Pin wie gewünscht benutzen kannst.
Wenn es mit dem Shield dann nicht mehr klappt, liegt die Vermutung nahe, dass das Shield Dir den Pin blockiert oder aber, dass das Shield defekt ist. Davon wollen wir aber mal nicht ausgehen.
Jetzt versuchts Du nach und nach die Funktionen aus Deinem Sketch wieder dazu zu nehmen und schaust, wann die LED nicht mehr blinkt. Ich denke, dass der Fehler dann soweit eingegrenzt ist, dass er sich finden lässt.

Gruß,
Ralf

Sommerlatsch:
Hallo Uwe,

danke für die Info. Habe aber leider auch schon andere PINs probiert, leider ohne Erfolg.

Welche anderen Pins?

Ok, bin systematisch durchgegangen und habe jetzt das Programm mit Pin7 zum laufen gebracht. Jetzt gibt es nur noch ein kleines Problem. Habe ich das Board mit USB angeschlossen funktioniert es, im Serial Monitor laufen alle Ausgaben rein. Starte ich den Arduino ohne USB läuft das Programm leider nicht. Beim reseten initialisiert er alles, die LED leuchten zum testen auf, aber der Rest der Programmlogik wird nicht ausgeführt.

Nachtrag: Resete ich einmal den Arduino über das Board dann läuft das Programm. Woran kann das liegen?

der Rest der Programmlogik wird nicht ausgeführt.

Glaub ich nicht :wink:

Irgendwas macht ein Controller immer, und ob jemand mitkriegt was Serial ausgibt oder nicht, interessiert den Arduino nicht.

Was für eine Spannungsversorgung hast du denn, wenn es nicht USB ist ?

Resete ich einmal den Arduino über das Board dann läuft das Programm. Woran kann das liegen?

Reset fertig bevor Vin wirklich ok ist, vielleicht ...
Abhilfe:
Software: Ein Delay in setup() , vor der Initialisierung
Hardware: ein dicker Kondensator, der den Reset Pin länger LOW lässt...

Sommerlatsch:
Ok, bin systematisch durchgegangen und habe jetzt das Programm mit Pin7 zum laufen gebracht. Jetzt gibt es nur noch ein kleines Problem. Habe ich das Board mit USB angeschlossen funktioniert es, im Serial Monitor laufen alle Ausgaben rein. Starte ich den Arduino ohne USB läuft das Programm leider nicht. Beim reseten initialisiert er alles, die LED leuchten zum testen auf, aber der Rest der Programmlogik wird nicht ausgeführt.

Nachtrag: Resete ich einmal den Arduino über das Board dann läuft das Programm. Woran kann das liegen?

Ich hatte das Problem beim Arduino NANO wenn ich einen zu großen Elektrolytkondensator an die 5V Spannungsversorgung angeschlossen hatte. Mein Verdacht ist daß die Versorgungsspannung zu langsam ansteigt und der ATmega nicht richtig resettiert.
Hast Du es mit einem anderen Netzteil versucht?
Grüße Uwe

Ich benutze jetzt ein 9V Netzteil von Conrad. Habe aber jetzt rausbekommen, dass es an der Ethernetverbindung liegt. Manchmal schafft der Arduino es nicht ins Heimnetzwerk gelassen zu werden. Bei einem Reset bekommt er meistens auch eine neue IP, und deshalb funktioniert es häufig.

Mach ich mit der Internetverbindung noch etwas falsch? Ich weise ihm ja mit

byte mac[] = {  0x90, 0xA2, 0xDA, 0x00, 0x35, 0x1C };
byte ip[] = { 192, 168, 0, 109 };

ja schon eine IP zu, aber wenn ich ihn mal an meinen Rechner stecke, hat der Arduino jedes Mal eine andere IP und wahrscheinlich sind manche IPs dann im Netzwerk gesperrt bzw. schon in Benutzung.