softwareserial pin änderung im programm möglich ??

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("");
}

Weiß ich nicht, aber ich habe eine Idee: probier's doch mal aus.

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.

Hier sind die möglichen Varianten für serielle SST dargestellt.

Gruß Tommy

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)

Tommy56:
Hier sind die möglichen Varianten für serielle SST dargestellt.

Hallo Tommy,

bitte irritier den TO nicht mit der "AltSoftSerial" die sicher eine gute alternative bietet, aber die Pinnummer festgelegt hat.

@Hotsystems: Hast Du den verlinkten Beitrag gelesen?

Gruß Tommy

HotSystems:
bitte irritier den TO nicht mit der "AltSoftSerial" die sicher eine gute alternative bietet, aber die Pinnummer festgelegt hat.

SoftwareSerial genauso. Nur...in Software

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)

Ok, das soll heißen, es geht nicht ?

Zitat aus dem verlinkten Beitrag:

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.

Gruß Tommy

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.

SoftwareSerial nssA(2,3); 
SoftwareSerial nssB(12,13); 

COZIR czr1(nssA);
COZIR czr2(nssB);
...

In loop() PinBelegung zu ändern erscheint mir genauso abwegig wie im laufenden Betrieb Kabel umstecken.

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)

Gruß Tommy

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.

Kann man das Objekt nicht jeweils verwerfen/zerstören und ein neues mit den neuen Pins machen?

Oder besser das ganze in Hardware mit cd4066

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.

Gruß Tommy

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 ?