INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Arduino MEGA + EthernetShield W5100 und weiteres SPI Device ?
09.10.2017, 21:37
Beitrag #1
Arduino MEGA + EthernetShield W5100 und weiteres SPI Device ?
Hallo in die Runde,

ich sitze hier derzeit an einen kleinen Problem.
Es geht dabei speziell um das Betreiben von 2 Devices am SPI-Bus.
Mit von der Partie sind eine Ethernet Karte mit Wiz5100 Chipsatz sowie einem Lightning Breakout-Board AS3935.

Beide laufen, wie gesagt, über den SPI-Bus des MEGA. Die Verkabelung ist soweit
alles okay und das Shield ist aufgesteckt. Der CS-Pin des AS3935-Boards ist dementsprechend abgeändert. Soweit so gut. Alles läuft soweit auch erstmal.

Doch nun kommen wir zu dem Kernproblem.

Immer wenn ich in dem Loop den Teil mit der Netzwerkkarte "in Betrieb" nehmen will, gibt mir das AS-Board nicht mehr das Ergebnis aus, was normal wäre.
Dabei funktioniert vorher alles sehr gut. Ich kann die Libary laden, den Server konfigurieren und starten...alles gut. Doch sobald ich die Website-Darstellung für die Messwerte starten will, ist da Feierabend. Dann bekomme ich die komischen Werte. Kann da etwas an der Konfiguration oder Taktung noch nicht ganz passen ?

Hier mal der Sketch...

Code:
#include "SPI.h"
#include "PWFusion_AS3935.h"
#include <Wire.h>
#include <ESP_SSD1306.h>
#include <Ethernet.h>
//#include <Adafruit_GFX.h>


///#################Code-Block ETHERNET########################
// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[] = {
  0x80, 0x3F, 0x5D, 0x42, 0x85, 0xCF
};
IPAddress ip(192, 168, 178, 250);

// Initialize the Ethernet server library
// with the IP address and port you want to use
// (port 80 is default for HTTP):
EthernetServer server(80);
//############################################################

//#########PIN-Zuordnung Relais#######################
const int RELAISHM = 4;


//#########Resetpin für das Display festlegen#########
#define OLED_RESET  3  // war mal 2


//##########Zuordnung für das OLED-Display############
ESP_SSD1306 display(OLED_RESET); // FOR I2C


//####### setup CS pins used for the connection with the sensor#######
//####### other connections are controlled by the SPI library)########
int8_t CS_PIN  = 8;
int8_t SI_PIN  = 9;
int8_t IRQ_PIN = 2;                       // digital pins 2 and 3 are available for interrupt capability
volatile int8_t AS3935_ISR_Trig = 0;


//########AS3935-Definitionen#########################
#define AS3935_INDOORS       1       // war vorher 1
#define AS3935_OUTDOORS      0
#define AS3935_DIST_DIS      0       // war vorher 1
#define AS3935_DIST_EN       0       // war vorher 0
#define AS3935_CAPACITANCE   64      // <-- SET THIS VALUE TO THE NUMBER LISTED ON YOUR BOARD (war mal 104 und als letztes 64)
// prototypes
void AS3935_ISR();
PWF_AS3935  lightning0(CS_PIN, IRQ_PIN, SI_PIN);






//#################SETUP-BLOCK########################


void setup()
{
  Ethernet.begin(mac, ip);
  server.begin();
  Wire.begin();
  Serial.begin(115200);
  tone( 8, 1000, 800);
  delay(250);
  tone( 8, 2000, 800);
  delay(250);
  tone( 8, 3000, 800);
  delay(250);
  digitalWrite(RELAISHM, HIGH);
  delay(1000);
  digitalWrite(RELAISHM, LOW);
  Serial.println("System bootet...");


  //############Display wird initialisiert############
  display.begin(SSD1306_SWITCHCAPVCC);  // Switch OLED


  //############Displayausgabe des Starts#############

  display.clearDisplay();
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.setCursor(0, 0);
  display.println("BlitzBox");
  display.setCursor(0, 30);
  display.println("Ver. 1.2");
  display.display();
  delay(8000);

  display.clearDisplay();
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.setCursor(0, 0);
  display.println("System");
  display.setCursor(0, 30);
  display.println("bootet...");
  display.display();
  delay(2000);

  display.clearDisplay();
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.setCursor(0, 0);
  display.println("Sensor-IP:");
  display.setCursor(0, 30);
  display.println(Ethernet.localIP());
  display.display();
  delay(2000);




  //#######Konfiguration des Relais auf Ausgang###################
  pinMode(RELAISHM, OUTPUT);



  //#############Setup für die SPI library########################
  SPI.begin();                            // begin SPI
  SPI.setClockDivider(SPI_CLOCK_DIV16);   // SPI speed to SPI_CLOCK_DIV16/1MHz (max 2MHz, NEVER 500kHz!)
  SPI.setDataMode(SPI_MODE1);             // MAX31855 is a Mode 1 device
  //    --> clock starts low, read on rising edge
  SPI.setBitOrder(MSBFIRST);              // data sent to chip MSb first
  lightning0.AS3935_DefInit();                        // set registers to default
  // now update sensor cal for your application and power up chip
  lightning0.AS3935_ManualCal(AS3935_CAPACITANCE, AS3935_OUTDOORS, AS3935_DIST_EN);
  // AS3935_ManualCal Parameters:
  //   --> capacitance, in pF (marked on package)
  //   --> indoors/outdoors (AS3935_INDOORS:0 / AS3935_OUTDOORS:1)
  //   --> disturbers (AS3935_DIST_EN:1 / AS3935_DIST_DIS:2)
  // function also powers up the chip

  // enable interrupt (hook IRQ pin to Arduino Uno/Mega interrupt input: 0 -> pin 2, 1 -> pin 3 )
  attachInterrupt(0, AS3935_ISR, RISING);

}




//#########################LOOP-Block##########################

void loop()
{


  display.clearDisplay();
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.setCursor(0, 0);
  display.println("Messung"); display.println();
  display.setCursor(0, 20);
  display.println("aktiv.. "); display.println();
  display.display();


  if (lightning0.AS3935_GetLightningDistKm() <= 16.00)
  {
    digitalWrite(RELAISHM, LOW);
    delay(100);
    digitalWrite(RELAISHM, HIGH);

  }

  else
  { digitalWrite(RELAISHM, HIGH);
  }



  // This program only handles an AS3935 lightning sensor. It does nothing until
  // an interrupt is detected on the IRQ pin.
  while (0 == AS3935_ISR_Trig) {}


  // reset interrupt flag
  AS3935_ISR_Trig = 0;


  // now get interrupt source
  uint8_t int_src = lightning0.AS3935_GetInterruptSrc();
  if (0 == int_src)
  {
    Serial.println("interrupt source result not expected");
    display.clearDisplay();
    display.setTextSize(2);
    display.setTextColor(WHITE);
    display.setCursor(0, 0);
    display.println("System-"); display.println();
    display.setCursor(0, 20);
    display.println("fehler.."); display.println();
    display.display();
    delay(2000);

  }
  else if (1 == int_src)
  {
    uint8_t lightning_dist_km = lightning0.AS3935_GetLightningDistKm();
    Serial.print("Lightning detected! Distance to strike: ");
    Serial.print(lightning_dist_km);
    Serial.println(" kilometers");
    display.setTextSize(4);
    display.setTextColor(WHITE);
    display.setCursor(0, 0);
    display.print("BLITZ!");
    display.display();
    delay(1000);

    display.clearDisplay();
    display.setTextSize(2);
    display.setTextColor(WHITE);
    display.setCursor(0, 0);
    display.print("Entfernung"); display.println();
    display.setCursor(0, 34);
    display.println("beträgt: "); display.print(lightning_dist_km); display.println();
    display.display();
    delay(1500);
    //digitalWrite(Blitz, HIGH);
    tone( 8, 2000, 500);
    delay(1000);
    //digitalWrite(Blitz, LOW);

  }
  else if (2 == int_src)
  {

    Serial.println("Disturber detected");
    delay(2000);
    display.clearDisplay();
    display.setTextSize(2);
    display.setTextColor(WHITE);
    display.setCursor(0, 0);
    display.println("Sörmessung"); display.println();
    display.setCursor(0, 20);
    display.println("erkannt ! "); display.println();
    display.display();
    display.clearDisplay();


  }
  else if (3 == int_src)
  {
    Serial.println("Noise level too high");
    display.clearDisplay();
    display.setTextSize(1);
    display.setTextColor(WHITE);
    display.setCursor(0, 0);
    display.print("Umgebungsrauschen"); display.println();
    display.setCursor(0, 17);
    display.print("zu hoch..."); display.println();
    display.setCursor(0, 51);
    display.print("Neuen Ort suchen !"); display.println();
    display.display();
    delay(2000);
    display.clearDisplay();

  }
  //    lightning0.AS3935_PrintAllRegs(); // for debug...
}


// this is irq handler for AS3935 interrupts, has to return void and take no arguments
// always make code in interrupt handlers fast and short
void AS3935_ISR()
{
  AS3935_ISR_Trig = 1;



  /*/  listen for incoming clients

  EthernetClient client = server.available();
  if (client) {
    Serial.println("new client");
    // an http request ends with a blank line
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        Serial.write(c);
        // if you've gotten to the end of the line (received a newline
          // character) and the line is blank, the http request has ended,
          // so you can send a reply
          if (c == '\n' && currentLineIsBlank) {
          // send a standard http response header
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println("Connection: close");  // the connection will be closed after completion of the response
          client.println("Refresh: 60");  // refresh the page automatically every 60 sec
          client.println();
          client.println("<!DOCTYPE HTML>");
          client.println("<html>");
          // output the value of each analog input pin
          for (int analogChannel = 0; analogChannel < 1; analogChannel++) {
            int sensorReading = analogRead(analogChannel);
            client.print("Umgebungstemperatur : ");
             /* client.print(mlx.readAmbientTempC());
              client.print("   C");
              client.println("<br />");
              client.print("Himmelstemperatur : ");
              client.print(mlx.readObjectTempC());
              client.print("   C");
              client.println("<br />");
              client.print("Relative Luftfeuchtigkeit : ");
              client.print(DHT.humidity, 1);
              client.print("   %");
              client.println("<br />");
              client.print("\tTemperatur Rolldachhuette ");
              client.print(DHT.temperature, 1);
              client.print("   C");
              client.println("<br />");
              client.print("Analogwert Helligkeitssensor :");
              client.print(LightAnalogValue, DEC);
              client.println("<br />");
              client.print("Analogwert Regensensor :");
              client.print(sensorReading);
              client.println("<br />");
              client.print("UV-Intensitaet :");
              client.print(uvIntensitaet);
              client.println("<br />");

          }
          client.println("</html>");
          break;
          }
          if (c == '\n') {
          // you're starting a new line
          currentLineIsBlank = true;
          } else if (c != '\r') {
          // you've gotten a character on the current line
          currentLineIsBlank = false;
          }
          }
          }
          // give the web browser time to receive the data
          delay(1);
          // close the connection:
          client.stop();
          Serial.println("Warte auf nächste Verbindung...");
        */

}

Ich stehe da derzeit echt auf dem Schlauch. Ich habe den Loop-Part in diesem Beispiel noch auskommentiert gelassen.

Weiß da jemand einen Rat ?

Viele Grüße und besten Dank,

André
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
09.10.2017, 22:02
Beitrag #2
RE: Arduino MEGA + EthernetShield W5100 und weiteres SPI Device ?
Ist es das Ethernet-Shield oder ein Ethernetmodul?
Lange Zeit, evtl heute noch, hatten die Module einen Hardwarebug, dass sie den MISO pin nicht hochohmig geschaltet haben, wenn sie nicht angewählt waren. Bei den Original-Shields sollte dieser Bug nicht auftreten.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
09.10.2017, 22:20
Beitrag #3
RE: Arduino MEGA + EthernetShield W5100 und weiteres SPI Device ?
Hallo André,
Tommy hat das vermutliche Problem bereits benannt.

Wenn dein Ethernetmodul so aussieht, gibt es eine Problembeschreibung mit Lösungsvorschlägen im Thema "Probleme mit SPI - Ethernet und nRF24L01".
Ab Beitrag #20 wird es interessant.

Gruß
Arne

Gruß Arne
Mit zunehmender Anzahl qualifizierter Informationen bei einer Fragestellung, erhöht sich zwangsläufig die Gefahr auf eine zielführende Antwort.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
10.10.2017, 04:56
Beitrag #4
RE: Arduino MEGA + EthernetShield W5100 und weiteres SPI Device ?
Hallo zusammen,

nee...ich habe folgendes Shield verbaut.

Arduino EthernetShield

Deswegen liegt das Problem wahrscheinlich bei mir.

VG

André
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
10.10.2017, 05:56 (Dieser Beitrag wurde zuletzt bearbeitet: 10.10.2017 05:59 von Bitklopfer.)
Beitrag #5
RE: Arduino MEGA + EthernetShield W5100 und weiteres SPI Device ?
Moin,
das mit dem CS scheint ein wiederkehrendes Problem zu sein, ich habe das mal so gelöst:
Code:
//################# Chip-Select ansteuern ###################################
void selETH() {     // waehlt den Ethernetcontroller aus
  
digitalWrite(SDselect, HIGH);
digitalWrite(ETHselect, LOW);

}
//####################################
void selSD() {      // waehlt die SD-Karte aus
  
digitalWrite(ETHselect, HIGH);
digitalWrite(SDselect, LOW);

}

//#################################
void selCLK() {      // waehlt die RTC aus bzw. sperrt Ethernet und SD-Karte
  
digitalWrite(SDselect, HIGH);
digitalWrite(ETHselect, HIGH);

}
und dann habe ich vor jedem Aufruf von ETH oder SD Karte die CS Signale manuell gesetzt. Nachzulesen bei meinem Megalogger. Danach hatte ich an der Stelle keine Probleme mehr.
Axo, selCLK() ist einfach das sperren beider CS Signale...eine Clock wie man vermuten könnte war da keine vorhanden.
Fast vergessen, ich hatte auch so ein Standart ETH Shield wie gezeigt.
lgbk

1+1 = 10 Angel ...und ich bin hier nicht der Suchmaschinen-Ersatz Dodgy...nur mal so als genereller Tipp..
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
10.10.2017, 08:22 (Dieser Beitrag wurde zuletzt bearbeitet: 10.10.2017 08:23 von Stargazer.)
Beitrag #6
RE: Arduino MEGA + EthernetShield W5100 und weiteres SPI Device ?
Hallo Bitklopfer,

d.h., ich muss nur noch die beides CS-Pins definieren.
Bei mir wären das ja Pin 10 für das ETHselect, ( SDselect auf Pin 4 fällt für mich weg, weil nicht benutzt) und anstatt Pin 4 würde ich dann das CS vom AS3935 als Pin definieren.

Das wäre dann für mich doch der Werdegang, oder ?

VG

André

PS... : Erstmal Danke für den Codeschnipsel von dir !
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
11.10.2017, 07:21
Beitrag #7
RE: Arduino MEGA + EthernetShield W5100 und weiteres SPI Device ?
Hallo zusammen,

ich hatte es gestern nochmal mit der Vorlage von Bitklopfer versucht, aber leider hat es nicht so ganz geklappt. Ich konnte die CS-Pins erfolgreich ansteuern,
doch mehr funktionierte leider nicht.

Nun kam mir der Gedanke, ob dieser Bug wirklich nur bei diesem Shield auftritt ?

Würde das originale EthernetShield 2 wohl mit dem zweiten SPI Gerät klar kommen ?

VG und besten Dank !

André
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
11.10.2017, 09:38
Beitrag #8
RE: Arduino MEGA + EthernetShield W5100 und weiteres SPI Device ?
Mit dem Ethernetshield2 bekommst Du unter Umständen andere Probleme, da die zugehörige Lib nicht kompatibel zu anderen Anwendungen ist.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Mega 2560 + USB Host Shield + USB-Stick Cospieler 4 448 19.09.2018 11:17
Letzter Beitrag: Tommy56
  Serielle Daten Windigipet 2018 Software, Arduino Mega 2560 verarbeiten/melden Christian_Moba-Arduino 11 1.165 15.09.2018 09:43
Letzter Beitrag: MicroBahner
  am besten nur für Arduino MEGA compilieren ? uweq 12 886 17.08.2018 19:22
Letzter Beitrag: uweq
  TFT 2.8" SPI bleibt weiß MEGA 2560 tillmg 24 5.030 01.06.2018 10:20
Letzter Beitrag: Franzel007
  Arduino Mega mit Shield und 7" Touch Tudorf 10 1.532 25.02.2018 14:30
Letzter Beitrag: Tommy56
  Daten vom Arduino Mega an Nextion Diskusguppy 4 1.203 25.02.2018 13:29
Letzter Beitrag: hotsystems
  COM Port bei Arduino Mega? LoroLoco 8 1.438 19.01.2018 12:49
Letzter Beitrag: hotsystems
  timer Mega 2560 4x tone Output see 6 2.040 11.01.2018 20:11
Letzter Beitrag: Tommy56
  Mega 2560 Visualisieren binderj1 11 1.498 01.10.2017 19:07
Letzter Beitrag: Tommy56
  Logger am Mega 2560 Wolfgang50 3 958 13.09.2017 10:53
Letzter Beitrag: Tommy56

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste