Hallo ist es möglich im Loop die Pin Belegung zu ändern? Das wäre für mich am einfachsten den am Pin 12/13 und an 10/11 ist der gleiche Sensor. Oder hat jemand eine andere Lösungs Idee ?
#include <SoftwareSerial.h>
#include "cozir.h"
SoftwareSerial nss(12,13); // Pin 2 = Arduino receiver pin (Rx), connect to sensor transmitter pin (Tx). Pin 3 = Arduino Tx, connect it to sensor Rx.
COZIR czr(nss);
void setup()
{
Serial.begin(9600);
delay(5000); // The sensor needs a few seconds to calibrate.
}
void loop()
{
delay(5000); // The number of milliseconds between each readout sent to the serial port. The sensor samples every 1200 ms.
int c = czr.CO2();
int digi = czr.GetDigiFilter();
Serial.print("CO2 : ");Serial.println(c);
//Serial.print("Digital Filter : ");Serial.println(digi);
Serial.println("");
}
Ideen gibt es sicher viele. Nur muss man dazu genau wissen, was du machen möchtest.
Ich verstehe deine Frage leider nicht richtig.
Du kannst die Pinnummer von SoftSerial im Setup schon anpassen und es in eine Variable schreiben.
Den Inhalt dieser Variablen kannst du jederzeit in der Loop ändern.
Schau dir mal an was die Klasse machst. Da sieht man das sofort.
HotSystems:
Du kannst die Pinnummer von SoftSerial im Setup schon anpassen und es in eine Variable schreiben.
Den Inhalt dieser Variablen kannst du jederzeit in der Loop ändern.
Und was soll das bringen? Es ist doch offensichtlich, dass die Pins im Konstruktor der Klasse in andere Variablen kopiert werden (genauer werden die Bitmasken entsprechend gesetzt)
Serenifly:
Schau dir mal an was die Klasse machst. Da sieht man das sofort.Und was soll das bringen? Es ist doch offensichtlich, dass die Pins im Konstruktor der Klasse in andere Variablen kopiert werden (genauer werden die Bitmasken entsprechend gesetzt)
SoftwareSerial(formerly "NewSoftSerial") - Can have multiple instances on almost any pins, but only 1 can be active at a time. Can not simultaneously transmit and receive. Can interfere with other libraries or HardwareSerial if used at slower baud rates. Can be sensitive to interrupt usage by other libraries.
Die möglichen mehreren Instanzen wären wohl ein Lösungsansatz, wenn man sich um die Randbedingungen kümmert.
Da der TO mit Infos geizt, kann man nur spekulieren.
Tommy56:
Zitat aus dem verlinkten Beitrag:Die möglichen mehreren Instanzen wären wohl ein Lösungsansatz, wenn man sich um die Randbedingungen kümmert.
Da der TO mit Infos geizt, kann man nur spekulieren.
Gruß Tommy
Ja, das stimmt auch, aber dein Link oben zeigt auf "AltSoftSerial".
Deswegen auch mein Post, dass die Pinnummern (SoftwareSerial) angepasst werden können.
Ich habe selbst in einem Projekt auf dem Atmega328 2 der "SoftwareSerial" laufen.
Das Erzeugen mehrerer SoftwareSerial Objekte (mit verschiedenen Pins) ist erlaubt.
Wenn das nicht wirklich funktioniert, hat man keine Chance. Ansonsten wäre das der richtige Ansatz.
HotSystems:
Ja, das stimmt auch, aber dein Link oben zeigt auf "AltSoftSerial".
Deswegen auch mein Post, dass die Pinnummern (SoftwareSerial) angepasst werden können.
Ich habe selbst in einem Projekt auf dem Atmega328 2 der "SoftwareSerial" laufen.
Ich habe mich auf die Info zu den verschiedenen seriellen SST am Anfang bezogen und dort besonders auf die mehreren Instanzen in SoftSerial. (war der erste Link, der dazu was brachte)
michael_x:
Das Erzeugen mehrerer SoftwareSerial Objekte (mit verschiedenen Pins) ist erlaubt.
Wenn das nicht wirklich funktioniert, hat man keine Chance. Ansonsten wäre das der richtige Ansatz.
Nichts anderes habe ich geschrieben.
In loop() PinBelegung zu ändern erscheint mir genauso abwegig wie im laufenden Betrieb Kabel umstecken.
Bedingt durch die obige Möglichkeit, gebe ich dir Recht.
Dennoch ist es technisch sicher möglich. Ob der TO das so gemeint hat, geht leider nicht aus seinem Thread hervor. War nur eine Vermutung.
HotSystems:
Dennoch ist es technisch sicher möglich.
Nur wenn man die Klasse anpasst und ein, zwei Methoden public macht. Und auch dann ist es nicht ganz sauber, da der alte Pin nicht wieder in den Ausgangszustand zurückgesetzt wird. Wobei man das leicht machen könnte.
ElEspanol:
Kann man das Objekt nicht jeweils verwerfen/zerstören und ein neues mit den neuen Pins machen?
Mit dynamischen Speicher, ja natürlich. Wenn man nur zwei Instanzen braucht, kann man aber auch beide permanent haben und abwechselnd verwenden. Es gibt schließlich begin() und end()
Wenn ich das beim Überfliegen der Lib richtig gesehen habe, gibt es intern ein activeObject, womit sie sich bei listen() gegenseitig verriegeln sollten.
Tommy56:
Wenn ich das beim Überfliegen der Lib richtig gesehen habe, gibt es intern ein activeObject, womit sie sich bei listen() gegenseitig verriegeln sollten.
Wenn man dem Objekt sagt dass es gerade nicht aktiv sein soll. Man sollte wahrscheinlich listen() und stopListening() verwenden. Letzteres wird direkt von end() aufgerufen, aber begin() macht auch noch ein paar andere Dinge die man nicht ständig wiederholen müsste
Der Lösungsansatz mit mehreren Softwareserials ist mir auch schon gekommen macht aber bei
int c = czrb.CO2();
int digi = czrb.GetDigiFilter();
Probleme Zwecks redeclaration
/* This sketch sents values temperature, humidity, CO2 and the digital filter setting to the serial port. After uploading, open the serial monitor (ctrl+shift+m) to see those.
created 13 Feb 2015
by Koos Looijesteijn
This code is in the public domain.
Upon first use, the sensor must be calibrated. If you don't get proper readings, do this:
1) Upload the SetToPolling sketch - Because the library is made for polling.
2) Move the sensor to an area with fresh air
3) Upload the Calibrate sketch
4) Upload this sketch again.
For logging in Fahrenheit, just replace all instances of 'Celsius'.
*/
#include <SoftwareSerial.h>
#include "cozir.h"
SoftwareSerial nssa(12,13); // Pin 2 = Arduino receiver pin (Rx), connect to sensor transmitter pin (Tx). Pin 3 = Arduino Tx, connect it to sensor Rx.
COZIR czra(nssa);
SoftwareSerial nssb(10,11); // Pin 2 = Arduino receiver pin (Rx), connect to sensor transmitter pin (Tx). Pin 3 = Arduino Tx, connect it to sensor Rx.
COZIR czrb(nssb);
void setup()
{
Serial.begin(9600);
delay(5000); // The sensor needs a few seconds to calibrate.
}
void loop()
{
delay(5000); // The number of milliseconds between each readout sent to the serial port. The sensor samples every 1200 ms.
nssa.listen();
if (nssa.isListening()) {
Serial.println("nssa läuft!");
}
int c = czra.CO2();
int digi = czra.GetDigiFilter();
Serial.print("COa2 : ");Serial.println(c);
Serial.println("");
nssb.listen();
if (nssb.isListening()) {
Serial.println("nssb läuft!");
}
int c = czrb.CO2();
int digi = czrb.GetDigiFilter();
Serial.print("COb2 : ");Serial.println(c);
Serial.println("");
}
Hier noch der Code aus der Libarie ( für denn Multiserial Test oben wurde CZR_Serial(nss) in nssa geändert)
//
// FILE: Cozir.h
// AUTHOR: Rob Tillaart & Michael Hawthorne
// VERSION: 0.1.01
// PURPOSE: library for COZIR range of sensors for Arduino
// URL: http://www.cozir.com/
// DATASHEET: http://www.co2meters.com/Documentation/Datasheets/COZIR-Data-Sheet-RevC.pdf
// USER GUIDE: http://www.co2meters.com/Documentation/Manuals/COZIR-Software-User-Guide-AL12-RevA.pdf
// READ DATASHEET BEFORE USE OF THIS LIB !
//
// Released to the public domain
//
#ifndef Cozir_h
#define Cozir_h
#include "SoftwareSerial.h"
#if defined(ARDUINO) && ARDUINO >= 100
#include "Arduino.h"
#else
#include "WProgram.h"
#endif
#define COZIR_LIB_VERSION 0.1.01
// OUTPUTFIELDS
// See datasheet for details.
// These defines can be OR-ed for the SetOutputFields command
#define CZR_LIGHT 0x2000
#define CZR_HUMIDITY 0x1000
#define CZR_FILTLED 0x0800
#define CZR_RAWLED 0x0400
#define CZR_MAXLED 0x0200
#define CZR_ZEROPOINT 0x0100
#define CZR_RAWTEMP 0x0080
#define CZR_FILTTEMP 0x0040
#define CZR_FILTLEDSIGNAL 0x0020
#define CZR_RAWLEDSIGNAL 0x0010
#define CZR_SENSTEMP 0x0008
#define CZR_FILTCO2 0x0004
#define CZR_RAWCO2 0x0002
#define CZR_NONE 0x0001
// easy default setting for streaming
#define CZR_HTC (CZR_HUMIDITY | CZR_RAWTEMP | CZR_RAWCO2)
// not in datasheet for debug only
#define CZR_ALL 0x3FFF
// OPERATING MODES
#define CZR_COMMAND 0x00
#define CZR_STREAMING 0x01
#define CZR_POLLING 0x02
class COZIR
{
public:
COZIR(SoftwareSerial&);//: CZR_Serial(nss)
void SetOperatingMode(uint8_t mode);
float Celsius();
float Fahrenheit();
float Humidity();
float Light();
uint16_t CO2();
uint16_t FineTuneZeroPoint(uint16_t , uint16_t);
uint16_t CalibrateFreshAir();
uint16_t CalibrateNitrogen();
uint16_t CalibrateKnownGas(uint16_t );
uint16_t CalibrateManual(uint16_t );
uint16_t SetSpanCalibrate(uint16_t );
uint16_t GetSpanCalibrate();
void SetDigiFilter(uint8_t );
uint8_t GetDigiFilter();
void SetOutputFields(uint16_t );
void GetRecentFields();
void SetEEPROM(uint8_t , uint8_t );
uint8_t GetEEPROM(uint8_t );
void GetVersionSerial();
void GetConfiguration();
private:
SoftwareSerial& CZR_Serial;
char buffer[20];
void Command(char* );
uint16_t Request(char* );
};
#endif
hat jemand ne Idee was ich machen könnte oder wo mein Fehler liegt ?