Hallo,
ich hab mir mal Gedanken zu einem kleinen Projekt gemacht und dazu ein paar Codeschnipsel zusammengefügt.
Es soll über ein UNO folgendes realisiert werden.
Ein REED-Schalter steuert ein UNO an, dass bei open/closed eine SMS an eine Nummer (über ein GSM Shield) versendet, zusätzlich soll in einem gesetzten Zeitintervall das UNO eine Spannungsabfrage (Eigendiagnose) starten und beim unterschreiten eines Schwellwertes (z.B. Batteriespannung unter 5V) ebenso eine SMS absetzen.
Und der letzte Schritt wäre, dass das GSM Shield quasi dauerhaft im Sleep-Mode ist, außer der Schaltzustand des REED ändert sich oder die Batteriespannung fällt unter den gesetzten Wert.
Normalerweise müsste ich alle Codes zusammen haben, welche nun aufbereitet werden müssten, dass die Reihenfolge stimmt bzw. alles richtig funktioniert.
Würde sich das mal jemand angucken können?
Vielen Dank und liebe Grüße!
P.s. Bitte nehmt es mir nicht übel, aber ich bin erst seit einer Woche dabei mir C++ (nicht C) zu lernen
Die Idee wäre, dass du das selber machst und wenn du dabei konkrete Probleme hast, fragst du mal nach.
Scheint so als hätte niemand Lust, dir deinen Code zu schreiben.
Ich würds gerne tun, aber würdest du im Gegenzug meinen schreiben dafür?
/*
Projekt zum Vergleich aus Code: http://www.instructables.com/id/Mailbox-Phone-Alert/?ALLSTEPS
*/
#include <SoftwareSerial.h>
#include <String.h>
#include <Reed_Sensor.h)
#include <Batteriespannung.h)
SoftwareSerial mySerial(7,8);
int SchalterPin = 3; // REED-Schalter PIN
boolean KlappeGeschlossen = 0; // REED-Status
int SchwellwertBatteriespannung = 5000; // Schwellwert der Batteriespannung unter 5,0V
// Baudrate festlegen
void setup()
{
mySerial.begin(19200); // GPRS Baudrate
Serial.begin(19200); // GPRS Baudrate
delay(500);
}
// Beginne Dauerschleife
void loop(){
// Wenn der Reedschalter geschlossen ist, dann WAHR und 10Sek warten
int SchalterStatus = digitalRead(SchalterPin);
if(SchalterStatus == HIGH){
KlappeGeschlossen = 1;
delay(10000);
}
int Batteriespannung = analogRead(A1);
if(SchwellwertBatteriespannung < Batteriespannung & KlappeGeschlossen){ // Wenn die Klappe geschlossen ist ODER die Batteriespannung unter 5,0V fällt wird eine SMS versendet
SMSversenden();
KlappeGeschlossen = false;
delay(100000);
}
delay(500);
}
// Textnachricht senden
void SMSversenden()
{
mySerial.print(" AT+CMGF=1\r "); // Nachricht als Text versenden; -> Textmode = AT-Befehl "CMGF=1" (siehe: http://www.nobbi.com/atgsm.html)
delay(100);
mySerial.println(" AT+CMGS=\" +49123456789\" "); // Nachricht senden -> Telefonnummer IMMER mit internationaler Vorwahl!
delay(100);
mySerial.print(" Testnachricht 123456 "); //Inhalt der Nachricht
delay(100);
mySerial.print((char)26); // der ASCII-Code von STRG+Z ist 26
delay(100);
mySerial.println();
}
Batteriespannung:
/*Wer seinen Arduino oder einen ATmega bzw. ATtiny über eine Batterie mit Spannung versorgt muss immer damit rechnen, dass die irgendwann einmal leer ist und dann der Mikrocontroller ohne Vorwarnung den Dienst einstellt. Hier ist es hilfreich, die Versorgungsspannung zu überwachen. Sollte sie unter einen bestimmten kritischen Wert fallen, kann man sich zum Beispiel durch anschalten einer LED warnen lassen.
Die Überwachung der Spannung kann ohne zusätzliche Hardware erfolgen. Möglich macht es der AD-Wandler. Dieser arbeitet ja bekannterweise nach folgender Formel:
WERT_ADC = V_EINGANG * 1023/V_REFERENZ
Nun könnte man natürlich meinen: "Ich lege einfach meine Versorgungsspannung an den Eingang des AD-Wandlers und kann diese so messen". Das funktioniert leider nicht, da die Referenzspannung des AD-Wandler ebenfalls die Versorgungsspannung ist. Der Wert des AD-Wandlers wäre als immer 1023.
Doch es gibt einen Trick: jeder Mikrocontroller erzeugt eine interne Referenzspannung, die so genannte "Bandgap Voltage" V_BG. Diese beträgt beim ATmega328, der im Arduino Uno zum Einsatz kommt, 1.1V. Diese Spannung lässt sich auf den Eingang des AD-Wandlers legen. mit V_EINGANG = V_BG und V_REFERENZ = V_CC ergibt sich dann:
WERT_ADC = V_BG * 1023/V_CC
oder umgeformt:
V_CC = V_BG * 1023/WERT_ADC
Setzt man nun ein V_BG = 1100 (in mV) ergibt sich:
V_CC = 1100 * 1023/WERT_ADC
V_CC ist nun der Wert der Spannungsversorgung in mV
In der setup()-Funktion wird zuerst der AD-Wandler so eingestellt, dass zum einen die Versorgungsspannung V_CC als Referenz und zum anderen die Bandgap-Spannung V_BG als Eingang für den AD-Wandler dienen. Nach einer kurzen Wartezeit wird der AD-Wandler dann aktiviert.
In der loop() wird dann die Messung durch setzen des Bits ADSC gestartet. Ist die Messung beendet (ADSC ist wieder 0) wird das Ergebnis der Wandlung aus den Registern ADCL (die unteren 8 Bit) und ADCH (die oberen 2 Bit) ausgelesen und zu einem 10-Bit-Ergebnis zusammengesetzt. Aus diesem wird dann nach der obigen Formel die Versorgungsspannung bestimmt. Liegt sie unter 5V, wird eine LED eingeschaltet.
Diese Methode funktioniert prinzipiell mit allen ATmegas oder ATtinys. Je nach verwendetem µC müssen allerdings in den Registern des AD-Wandlers andere Bits gesetzt werden. Welche das genau sind, kann dem Datenblatt entnommen werden.
*/
int led = 13; // Pin der LED
int refresh = 300000; // Messung alle 30min wiederholen
int adc_low, adc_high; // Zwischenspeicher für die Ergebnisse des ADC
long adc_result; // Gesamtergebnis der Messung des ADC
long vcc; // Versorgungsspannung
void setup() {
pinMode(led, OUTPUT);
ADMUX |= (1<<REFS0); // VCC als Referenzspannung für den AD-Wandler
ADMUX |= (1<<MUX3) | (1<<MUX2) | (1<<MUX1); // 1.1V Referenzspannung als Eingang für ADC
delay(10); // warten bis sich die Referenzspannung eingestellt hat
ADCSRA |= (1<<ADEN); // ADC aktivieren
}
// Dauerschleife der Messung
void loop() {
ADCSRA |= (1<<ADSC); // Messung starten
while (bitRead(ADCSRA, ADSC)); // warten bis Messung beendet ist
// Ergebnisse des ADC zwischenspeichern. Wichtig: zuerst ADCL auslesen, dann ADCH
adc_low = ADCL;
adc_high = ADCH;
adc_result = (adc_high<<8) | adc_low; // Gesamtergebnis der ADC-Messung
vcc = 1125300L / adc_result; // Versorgungsspannung in mV berechnen (1100mV * 1023 = 1125300)
/* Ab hier folgt dann die Übergabe an den Hauptcode um die SMS abzusetzen, sobald der Wert "vcc < xxxx" unterschritten wird */
//wenn Spannung kleiner als 5V
if (vcc < 5000)
{
digitalWrite(led, HIGH); // dann schalte LED an; Hier statt der LED on/off die Übergabe an die SMS-Ausgabe
}
//wenn größer oder gleich 5V
else
{
digitalWrite(led, LOW); // dann schalte LED aus; Hier statt der LED on/off die Übergabe an die SMS-Ausgabe
}
delay(500);
}
und der Code für den REED-Schalter:
/* A magnetic reed switch is a switch that change it's state whenever a magnetic field is present.
Magnetic reeds are cheap and really easy to find online.
They have a lot of practical uses like checking if a window/door is open or not.
We will use them in our A-H-A project.
There are two options of these magnetic switches.
The N.O. (normally open) and the N.C. (Normally Closed) ones.
Normally Closed (NC) is a reed switch that the current passes when the magnet is not present.
The same type of reed is also called Normally Open with magnet.
On the other hand a reed switch is called NO, when without the presence of a magnetic field the current does not pass (open circuit).
The same type of reed switch can be also called Normally Closed with magnet.
In alarms it is most common to use a NO or alternatively called NC with magnet reed switch since the alarm when is broken or being cut by thieves then the circuit results open/broken even if the magnet (door) is in place. */
int Led_Pin = 13; // Pin für LED-Status (Digital-Pin 13)
int Schalter_Pin = 6; // Sensorpin am Arduino (Digital-Pin 6)
int val = 0; // Variable Sensor_Pin Status
void setup() {
pinMode(Led_Pin, OUTPUT); // Led_Pin am Ausgang festlegen
pinMode(Schalter_Pin, INPUT); // Sensor_Pin am Eingang festlegen
}
void loop(){
val = digitalRead(Schalter_Pin); // Sensor_Pin lesen
if (val == LOW) { // Wenn es ein Öffner-Sensor ist (N.C. = normaly closed) -> HIGH : Klappe ist offen / LOW : Klappe ist geschlossen
// Wenn es ein Schließer-Sensor ist (N.0. = normally open) -> HIGH : Klappe ist geschlossen / LOW : Klappe ist offen
digitalWrite(Led_Pin, LOW); // LED-Status-Ausgabe -> LOW
} else {
digitalWrite(Led_Pin, HIGH); // LED-Status-Ausgabe -> HIGH
}
}
Ich hoffe, dass das mir nun vielleicht jemand helfen kann =)
Ich gehe mal davon aus, dass jeder Sketch für sich funktioniert.
Alle beinhalten ein Setup und eine Loop.
Damit kann man diese nicht einfach zusammensetzen, sondern du solltest im Hauptsketch die notwendigen Teile in der Deklaration, im Setup zusammenfügen und die jeweiligen Teile der Loop in eine Funktion packen und diese aus der Loop des Sketches aufrufen.
Was ganz "gefährlich ist, ist dein sehr langes delay von 100 Sek., das wird dir Probleme bereiten, da in diesen 100 Sek. nicht weiter passiert, außer der Atmega macht eine Pause. Andere Dinge sind während dieser Wartezeit nicht möglich.
Hier solltest du dich mit den millis beschäftigen. Beispiel "BlinkWithoutDelay".
So könntest du deinen Sketch aufbauen (Beispiel):
// Hier die Deklaration aller Sketche zusammenfassen
void setup() {
// Hier die Teile deiner Setups zusammenfassen
}
void loop() {
// Hier deine Hauptschleife einfügen und die Aufrufe der Funktionen einsetzen
Spannung();
ReedKontakt();
}
// Hier folgen die Funktionen
void Spannung() {
// Hier deinen Sketch zum Spannung messen
}
void ReedKontakt() {
// Hier deinen Sketch zum Kontakt abfragen
}
Achte bitte darauf, dass Variable, die in der Loop sowie in einer Funktion gebraucht wird, auch entsprechend global deklariert wird.
Ich habe das jetzt mal (so wie ich es mir denke, dass es korrekt sein müsste) zusammengefasst.
BITTE verdonnert mich nicht, ich glaube da stimmt das ein oder andere - oder sagen wir besser etwas mehr nicht ganz?
Die Deklaration habe ich mir an dieser Stelle mal gespart...
Die Libraries sind zeitweilig bislang überflüssig, kommen aber bald zum Tragen, wenn der "Sleepmodus" für das GSM-Shield eingebunden ist, aber ich will es mir für den Anfang nicht all zu schwer machen.
Also hier mein erster eigener (zusammengesuchter) Code in der Zusammenfassung:
// Libraries importieren
#include <SoftwareSerial.h>
#include <String.h>
#include <Reed_Sensor.h)
#include <Batteriespannung.h)
#include <GSM.h>
#include <HttpClient.h>
#include <Xively.h>
#include <OneWire.h>
#include <Temperature.h>
#include <LowPower.h>
SoftwareSerial mySerial(7,8);
int led = 13; // Pin der LED
int refresh = 300000; // Messung alle 30min wiederholen
int adc_low, adc_high; // Zwischenspeicher für die Ergebnisse des ADC
long adc_result; // Gesamtergebnis der Messung des ADC
long vcc; // Versorgungsspannung
int Led_Pin = 13; // Pin für LED-Status (Digital-Pin 13)
int Schalter_Pin = 6; // Sensorpin am Arduino (Digital-Pin 6)
int val = 0; // Variable Sensor_Pin Status
int SchalterPin = 3; // REED-Schalter PIN
boolean KlappeGeschlossen = 0; // REED-Status
int SchwellwertBatteriespannung = 5000; // Schwellwert der Batteriespannung unter 5,0V
void setup() {
// Baudrate für GSM-Shield festlegen
mySerial.begin(19200); // GPRS Baudrate
Serial.begin(19200); // GPRS Baudrate
delay(500);
// PINs für REED-Schalter festlegen
pinMode(Led_Pin, OUTPUT); // Led_Pin am Ausgang festlegen
pinMode(Schalter_Pin, INPUT); // Sensor_Pin am Eingang festlegen
// Setup zur Batteriespannungsmessung
ADMUX |= (1<<REFS0); // VCC als Referenzspannung für den AD-Wandler
ADMUX |= (1<<MUX3) | (1<<MUX2) | (1<<MUX1); // 1.1V Referenzspannung als Eingang für ADC
delay(10); // warten bis sich die Referenzspannung eingestellt hat
ADCSRA |= (1<<ADEN); // ADC aktivieren
}
void loop() {
//Teil 1 zur Spannungsmessung:
Spannung();
ADCSRA |= (1<<ADSC); // Messung starten
//Teil 2 für den REED-Schalter
ReedKontakt();
val = digitalRead(Schalter_Pin); // Sensor_Pin lesen
}
/* LowPower: erstmal ausgeklammert...
//Teil 3 -> Nun sollte der Code wenn entweder der REED-Schaltzustand geschlossen wird ODER die Batteriespannung unter 5,0V fällt eine SMS abgesetzt werden
int SchalterStatus = digitalRead(SchalterPin);
if(SchalterStatus == HIGH){
KlappeGeschlossen = 1;
delay(10000);
}
int Batteriespannung = analogRead(A1);
if(SchwellwertBatteriespannung < Batteriespannung & KlappeGeschlossen){ // Wenn die Klappe geschlossen ist ODER die Batteriespannung unter 5,0V fällt wird eine SMS versendet
SMSversenden();
KlappeGeschlossen = false;
delay(100000);
}
delay(500);
}
*/
//Spannung messen
void Spannung() {
while (bitRead(ADCSRA, ADSC)); // warten bis Messung beendet ist
// Ergebnisse des ADC zwischenspeichern. Wichtig: zuerst ADCL auslesen, dann ADCH
adc_low = ADCL;
adc_high = ADCH;
adc_result = (adc_high<<8) | adc_low; // Gesamtergebnis der ADC-Messung
vcc = 1125300L / adc_result; // Versorgungsspannung in mV berechnen (1100mV * 1023 = 1125300)
}
//Sensorstatus abfragen
void ReedKontakt() {
if (val == LOW) { // Wenn es ein Öffner-Sensor ist (N.C. = normaly closed) -> HIGH : Klappe ist offen / LOW : Klappe ist geschlossen
// Wenn es ein Schließer-Sensor ist (N.0. = normally open) -> HIGH : Klappe ist geschlossen / LOW : Klappe ist offen
digitalWrite(Led_Pin, LOW); // LED-Status-Ausgabe -> LOW
}
else {
digitalWrite(Led_Pin, HIGH); // LED-Status-Ausgabe -> HIGH
}
}
//----------------------------------------------------------------------------------------------------------------------------------------------//
// Textnachricht senden
void SMSversenden() {
mySerial.print(" AT+CMGF=1\r "); // Nachricht als Text versenden; -> Textmode = AT-Befehl "CMGF=1" (siehe: http://www.nobbi.com/atgsm.html)
delay(100);
mySerial.println(" AT+CMGS=\" +49123456789\" "); // Nachricht senden -> Telefonnummer IMMER mit internationaler Vorwahl!
delay(100);
mySerial.print(" Testnachricht 123456 "); //Inhalt der Nachricht
delay(100);
mySerial.print((char)26); // der ASCII-Code von STRG+Z ist 26
delay(100);
mySerial.println();
}
Danke
Lg
p.s. Der Sketch ist mit Notepad++ geschrieben und müsste damit besser darstellbar sein als hier.
Ich verstehe nicht ganz, wie deine Referenzspannungsmessung und dein analogRead(A1) zusammengehören und/oder ob die beiden sich nicht stören.
Kommentare sind gut, aber nur wenn sie stimmen.
Natürlich sollte man nicht zu oft SMS versenden, aber delay() ist auf Dauer (für 5 Minuten) doch etwas heftig. Zumindest wenn man zum Test häufiger sehen will, was das Ding macht.
Aber das kommt später.
Daher erstmal ein Vorschlag zur Verschönerung:
Variable, die man nicht verwendet, sollte man auch nicht definieren.
Globale Variable sind zwar nicht böse, aber wenn man sie nur verwendet wo es Sinn macht, wird manches übersichtlicher.
Ausserdem sollte zusammen, was zusammengehört
Als Beispiel:
int adc_low, adc_high; // Zwischenspeicher für die Ergebnisse des ADC long adc_result; // Gesamtergebnis der Messung des ADC
void initSpannung() {
// Setup zur Batteriespannungsmessung
// Nur für meine Hardware ;)
ADMUX |= (1<<REFS0); // VCC als Referenzspannung für den AD-Wandler
ADMUX |= (1<<MUX3) | (1<<MUX2) | (1<<MUX1); // 1.1V Referenzspannung als Eingang für ADC
delay(10); // warten bis sich die Referenzspannung eingestellt hat
ADCSRA |= (1<<ADEN); // ADC aktivieren
}
unsigned int Spannung() {
// liefert Versorgungsspannung in mV (0 = Fehler) .. ca. 5000
while (bitRead(ADCSRA, ADSC)); // warten bis Messung beendet ist
// Ergebnisse des ADC zwischenspeichern. Wichtig: zuerst ADCL auslesen, dann ADCH
byte adc_low = ADCL;
byte adc_high = ADCH;
ADCSRA |= (1<<ADSC); // neue Messung starten
unsigned int adc_result = (adc_high<<8) | adc_low; // Gesamtergebnis der ADC-Messung
// Versorgungsspannung in mV berechnen (1100mV * 1023 = 1125300)
if ( adc_result > 20)
return 1125300L / adc_result;
else
return 0; // ? Fehler
}
int refresh = 300000; // Messung alle 300 sec (5 Minuten) wiederholen
unsigned int vcc; // könnte auch lokal in loop definiert sein ( Batteriespannung ?)
void setup() {
Serial.begin(19200); // PC TestSchnittstelle
mySerial.begin(19200); // GPRS Baudrate
initSpannung(); // ADC für Versorgungsspannung-Messung initialisieren
...
}
void loop() {
vcc = Spannung();
...
// Wenn vcc zu klein, Wartezeit seit letzter SMS wieder abgelaufen, und Klappe ...
if( ... ) sendeSMS(vcc); // ( so würde keine globale Variable gebraucht )
delay(refresh); // Dafür wirst du natürlich verhauen, wenn du groß bist
}
Da ich aber - um wirklich ehrlich zu sein - die ganzen Begrifflichkeiten und Funktionen NICHT auswendig kenne und teils auch Schwierigkeiten habe die Zusammenhänge und "Ausführungen" der Befehle zu kennen, war ich nicht immer sicher, ob das was ich zusammengefügt habe auch so stimmt.
Aber ich bin ja fleissig am Lernen und all zu viel was ich mir bislang in C++ beibringen konnte, konnte ich - zwar nicht 1:1 widerspiegeln, aber zumindest der Grundaufbau ist wohl fast gleich (Setup (); Loop(); etc...)
Ich sehe mir Deine Ausführung - michael_x - später noch genauer an und vergleiche sie mit meinem Code, um zu verstehen was Du mir sagen willst.
Die "Kleinigkeiten", wie statt dem delay -> millis zu verwenden kommt noch im späteren Verlauf.
Noch habe ich das GSM-Shield nicht da, so kann ich es an der Hardware bislang leider nicht testen, aber dafür habe ich noch ein paar Tage Zeit zum Verstehen.
Besten Dank, für Anregungen/Verbesserungen bin ich weiterhin offen.
Noch habe ich das GSM-Shield nicht da, so kann ich es an der Hardware bislang leider nicht testen, aber dafür habe ich noch ein paar Tage Zeit zum Verstehen.
Zum Testen eignet sich auch die Serial Schnittstelle besser. (Nur wird die USB-Schnittstelle vermutlich deinen Uno besser mit Strom versorgen als eine Batterie)
tom1tom11:
Noch habe ich das GSM-Shield nicht da, so kann ich es an der Hardware bislang leider nicht testen, aber dafür habe ich noch ein paar Tage Zeit zum Verstehen.
Damit du dich nicht verzettelst, solltest du eh Funktion für Funktion aufbauen.
Da ist es dann nicht so wichtig, wenn das GSM-Modul noch nicht vorhanden ist.
Da du es sowieso in eine eigene Funktion einbauen willst, kann das ja später erfolgen.
Das mit dem GSM-Modul ist offensichtlich ein spezieller Schritt, wie man hier in reichlich Threads nachlesen kann. Das solltest du in einem eigenen Sketch vorher funktionsfähig aufbauen und danach übertragen.
Schade!
Irgendwas klappt da beim Kompilieren nicht so recht....
Es kommt jedesmal folgende Meldung und ich weiß wirklich nicht wieso:
C:\Users\tom1tom11\AppData\Local\Temp\buildaf0d6d4346d4a08a597aebc795edada4.tmp\libraries\GSM\GSM3SoftSerial.cpp.o: In function `__vector_3':
C:\Users\tom1tom11\Documents\Arduino\libraries\GSM\src/GSM3SoftSerial.cpp:499: multiple definition of `__vector_3'
C:\Users\tom1tom11\AppData\Local\Temp\buildaf0d6d4346d4a08a597aebc795edada4.tmp\libraries\SoftwareSerial\SoftwareSerial.cpp.o:C:\Program Files\Arduino\hardware\arduino\avr\libraries\SoftwareSerial\src/SoftwareSerial.cpp:229: first defined here
C:\Users\tom1tom11\AppData\Local\Temp\buildaf0d6d4346d4a08a597aebc795edada4.tmp\libraries\GSM\GSM3SoftSerial.cpp.o: In function `GSM3SoftSerial::spaceAvailable()':
C:\Users\tom1tom11\Documents\Arduino\libraries\GSM\src/GSM3SoftSerial.cpp:487: multiple definition of `__vector_4'
C:\Users\tom1tom11\AppData\Local\Temp\buildaf0d6d4346d4a08a597aebc795edada4.tmp\libraries\SoftwareSerial\SoftwareSerial.cpp.o:C:\Program Files\Arduino\hardware\arduino\avr\libraries\SoftwareSerial\src/SoftwareSerial.cpp:394: first defined here
C:\Users\tom1tom11\AppData\Local\Temp\buildaf0d6d4346d4a08a597aebc795edada4.tmp\libraries\GSM\GSM3SoftSerial.cpp.o: In function `GSM3SoftSerial::spaceAvailable()':
C:\Users\tom1tom11\Documents\Arduino\libraries\GSM\src/GSM3SoftSerial.cpp:487: multiple definition of `__vector_5'
C:\Users\tom1tom11\AppData\Local\Temp\buildaf0d6d4346d4a08a597aebc795edada4.tmp\libraries\SoftwareSerial\SoftwareSerial.cpp.o:C:\Program Files\Arduino\hardware\arduino\avr\libraries\SoftwareSerial\src/SoftwareSerial.cpp:394: first defined here
collect2.exe: error: ld returned 1 exit status
Bibliothek SoftwareSerial in Version 1.0 im Ordner: C:\Program Files\Arduino\hardware\arduino\avr\libraries\SoftwareSerial wird verwendet
Bibliothek GSM in Version 1.0.5 im Ordner: C:\Users\tom1tom11\Documents\Arduino\libraries\GSM wird verwendet
Bibliothek HttpClient-2.2.0 in Version 2.2.0 im Ordner: C:\Users\tom1tom11\Documents\Arduino\libraries\HttpClient-2.2.0 wird verwendet
exit status 1
Fehler beim Kompilieren.
Google half mir auch nicht recht weiter, deshalb hoffe ich nun leider wieder auf Eure zuverlässige Unterstützung.
tom1tom11:
Schade!
Irgendwas klappt da beim Kompilieren nicht so recht....
Google half mir auch nicht recht weiter, deshalb hoffe ich nun leider wieder auf Eure zuverlässige Unterstützung.
Du hast 2 Libraries installiert.
1 x SoftwareSerial.cpp, die ist auch richtig.
und
1 x GSM3SoftSerial.cpp, die ist falsch.
Die letzte musst du suchen und löschen.
Die ist hier:
C:\Users\tom1tom11\AppData\Local\Temp\buildaf0d6d4346d4a08a597aebc795edada4.tmp\libraries\GSM\GSM3SoftSerial.cpp
Das geht leider nicht, dann meckert er, dass ihm die Datei fehlt
C:\Users\tom1tom11\AppData\Local\Temp\buildaf0d6d4346d4a08a597aebc795edada4.tmp\libraries\GSM\GSM3ShieldV1ClientProvider.cpp.o: In function `GSM3ShieldV1ClientProvider::disconnectTCP(bool, int)':
C:\Users\tom1tom11\Documents\Arduino\libraries\GSM\src/GSM3ShieldV1ClientProvider.cpp:190: undefined reference to `GSM3SoftSerial::spaceAvailable()'
C:\Users\tom1tom11\AppData\Local\Temp\buildaf0d6d4346d4a08a597aebc795edada4.tmp\libraries\GSM\GSM3ShieldV1ClientProvider.cpp.o: In function `GSM3ShieldV1ClientProvider::readSocket()':
C:\Users\tom1tom11\Documents\Arduino\libraries\GSM\src/GSM3ShieldV1ClientProvider.cpp:254: undefined reference to `GSM3SoftSerial::spaceAvailable()'
C:\Users\tom1tom11\AppData\Local\Temp\buildaf0d6d4346d4a08a597aebc795edada4.tmp\libraries\GSM\GSM3ShieldV1ClientProvider.cpp.o: In function `GSM3ShieldV1ClientProvider::flushSocketContinue()':
C:\Users\tom1tom11\Documents\Arduino\libraries\GSM\src/GSM3ShieldV1ClientProvider.cpp:284: undefined reference to `GSM3SoftSerial::spaceAvailable()'
C:\Users\tom1tom11\AppData\Local\Temp\buildaf0d6d4346d4a08a597aebc795edada4.tmp\libraries\GSM\GSM3ShieldV1ModemCore.cpp.o: In function `GSM3ShieldV1ModemCore::GSM3ShieldV1ModemCore()':
C:\Users\tom1tom11\Documents\Arduino\libraries\GSM\src/GSM3ShieldV1ModemCore.cpp:41: undefined reference to `GSM3SoftSerial::GSM3SoftSerial()'
C:\Users\tom1tom11\AppData\Local\Temp\buildaf0d6d4346d4a08a597aebc795edada4.tmp\libraries\GSM\GSM3ShieldV1ModemCore.cpp.o: In function `GSM3ShieldV1ModemCore::write(unsigned char)':
C:\Users\tom1tom11\Documents\Arduino\libraries\GSM\src/GSM3ShieldV1ModemCore.cpp:215: undefined reference to `GSM3SoftSerial::write(unsigned char)'
C:\Users\tom1tom11\AppData\Local\Temp\buildaf0d6d4346d4a08a597aebc795edada4.tmp\libraries\GSM\GSM3ShieldV1SMSProvider.cpp.o: In function `GSM3ShieldV1SMSProvider::readSMS()':
C:\Users\tom1tom11\Documents\Arduino\libraries\GSM\src/GSM3ShieldV1SMSProvider.cpp:204: undefined reference to `GSM3SoftSerial::spaceAvailable()'
C:\Users\tom1tom11\Documents\Arduino\libraries\GSM\src/GSM3ShieldV1SMSProvider.cpp:220: undefined reference to `GSM3SoftSerial::spaceAvailable()'
C:\Users\tom1tom11\AppData\Local\Temp\buildaf0d6d4346d4a08a597aebc795edada4.tmp\libraries\GSM\GSM3ShieldV1SMSProvider.cpp.o: In function `GSM3ShieldV1SMSProvider::flushSMS()':
C:\Users\tom1tom11\Documents\Arduino\libraries\GSM\src/GSM3ShieldV1SMSProvider.cpp:268: undefined reference to `GSM3SoftSerial::spaceAvailable()'
C:\Users\tom1tom11\AppData\Local\Temp\buildaf0d6d4346d4a08a597aebc795edada4.tmp\libraries\GSM\GSM3ShieldV1ServerProvider.cpp.o: In function `GSM3ShieldV1ServerProvider::recognizeUnsolicitedEvent(unsigned char)':
C:\Users\tom1tom11\Documents\Arduino\libraries\GSM\src/GSM3ShieldV1ServerProvider.cpp:218: undefined reference to `GSM3SoftSerial::spaceAvailable()'
collect2.exe: error: ld returned 1 exit status
Bibliothek SoftwareSerial in Version 1.0 im Ordner: C:\Programme\Arduino\hardware\arduino\avr\libraries\SoftwareSerial wird verwendet
Bibliothek GSM in Version 1.0.5 im Ordner: C:\Users\tom1tom11\Documents\Arduino\libraries\GSM wird verwendet
Bibliothek HttpClient-2.2.0 in Version 2.2.0 im Ordner: C:\Users\tom1tom11\Documents\Arduino\libraries\HttpClient-2.2.0 wird verwendet
exit status 1
Fehler beim Kompilieren.
Ah...ich seh.
Du verwendest ja auch die GSM.h, diese brauchst du nicht.
Du solltest eh mall alle Libs auskommentieren, die aktuell nicht benötigt werden.
Bringt nur Probleme bzw. Unordnung rein.
Welches GSM-Modul setzt du ein? Bzw. hast du bestellt?
mit ausgeklammerter GSM.h funktioniert die Kompilierung einwandfrei, danke!
Mit dem Serial Monitor kann ich bislang nichts anfangen, da ich leider noch keine Erfahrung/Wissen zur Anwendung dessen habe.
Nun wäre das Ziel, das Arduino quasi digital den "Schalterzustand geschlossen" mitzuteilen und gleichzeitig eine Antwort in digitaler Form zu erhalten. Selbes auch mit der Spannungsabfrage.
Whandall:
P.S. dein "das Arduino" klingelt in meinen Ohren, für mich ist der (zumindestens gefühlt) männlich.
Für mich ist der auch männlich und es gibt auch "Indizien" die diese These stützen: Er ist Italiener und sein Name endet auf "o". Diese Kombination deutet zu 99,9% auf männlich hin.
sächlich oder männlich, sollte es in beiden Fällen "dem" heissen, oder ich verstehe den ganzen Satz nicht?
tom1tom11:
Nun wäre das Ziel, das dem (?) Arduino quasi digital den "Schalterzustand geschlossen" mitzuteilen und gleichzeitig eine Antwort in digitaler Form zu erhalten.