Zitat Zitat von spunky9003 Beitrag anzeigen
ich habe den Code nochmal überarbeitet, ich konnte ihn noch ein wenig optimieren. Leider noch immer ca. 100 Byte zu viel für den ATtiny85. Ich bin leider nicht so der Profi, sieht jemand eine Möglichkeit den Code noch weiter zu optimieren, bei den wenigen Zeilen wahrscheinlich nicht so einfach.

Code:
/*
Name:		Sketch1.ino (speziell für IR Reflexlichtschranke, TCRT 5000)
Created:	06.12.2017 14:10:36
*/

#include <SoftSerial.h>

SoftSerial mySerial(4, 0);     // RX, TX
const int LED_out = 1;         // onboard LED auf Model A
//const int DIST_in = 2;         // Sharp Distance Sensor
const int IR_in = 2;           // IR Modul, Empfänger
const int IR_out = 3;          // IR Modul, Sender
long lasttime;
//String err = "";
String out_l = "";
String out_r = "1";
//String outString = "1";
String inString = "";

void setup() {
	mySerial.begin(9600);
	//pinMode(DIST_in, INPUT); // Sharp Distance Sensor
	pinMode(LED_out, OUTPUT); // LED Fehlermeldung
	pinMode(IR_out, OUTPUT); // IR Modul, Sender
	pinMode(IR_in, INPUT); // IR Modul, Empfänger
}

void loop() {

	if (millis() - lasttime > 500) {

		digitalWrite(IR_out, HIGH); // IR Modul, Sender ein
		digitalWrite(LED_out, LOW); // LED Fehlermeldung aus

		while (mySerial.available() > 0) { // sind Daten vorhanden, dann
			inString += (char)mySerial.read(); // Daten von anderen Modul einlesen
		}

		if (inString != "") { // wurden Daten eingelesen, dann
			out_r = inString.substring(inString.indexOf("!") + 1, inString.indexOf("\n") - 1).toInt() + 1; // eigene Modul-Nummer berechnen
		}


		if (analogRead(1) < 300 || analogRead(1) > 900) { // IR Modul, Empfänger abfragen, dann
			digitalWrite(LED_out, HIGH); // LED Fehlermeldung ein
			out_l = out_r; // eigene Modul-Nummer für Fehlermeldung merken
		}
		else { // keine Fehlermeldung
			out_l = "";
		}

		if (inString.indexOf("!") > 0 && out_l == "") { // Fehlermeldung von anderen Modul und keine Fehlermeldung vom eigenen Modul, dann
			out_l = inString.substring(0, inString.indexOf("!")); // Fehlermeldung von anderen Modul weiterleiten
		}
		else if (inString.indexOf("!") > 0 && out_l != "") { // Fehlermeldung von anderen Modul und Fehlermeldung vom eigenen Modul, dann
			out_l = inString.substring(0, inString.indexOf("!")) + "," + out_r; // Fehlermeldung von anderen Modul und Fehlermeldung vom eigenen Modul weiterleiten
		}


		mySerial.println(out_l + "!" + out_r); // Daten zum nächsten Modul schicken, Fehlermeldung(en) + "!" + eigene Modul-Nummer

		inString = ""; // Eingangsdaten löschen

		digitalWrite(IR_out, LOW); // IR Modul, Sender aus

		lasttime = millis();
	}

}
mein Tipp ging in die Richtung, die String Klasse so weit wie möglich weg zu lassen.
Also:
statt String out_l = ""; // <<< das ist dei Arduinoo String Class String. Braucht viel Speicher mit seinen ganzen String Class Methoden im Programmspeicher
also jetzt stattdessen:
char out_l[50]=""; // <<< das ist ein C string, also ein char array mit deutlich weniger Memory-Bedarf im Programmspeicher.

ich habe hier willkürlich 50 char Länge gewählt, du musst es ntl auf deinen Bedarf hin optimieren.
Entsprechend sind dann auch die anderen Arduino Strings durch C strings zu ersetzen.

C strings kann man nicht addieren, dazu werden hingegen die folgenden weniger Speicher-hungrigen C Funktionen verwendet:
strcpy()
strncpy()
strcat()
strncat()
memcpy()

char out_l[50]="";
geht auch nur beim 1. Initialisieren, danach muss es heißen
strcpy(out_l[50], "");

Achte darauf, dass deine C strings immer mit einer Null terminiert sind (Zahl Null = '\0', nicht Zeichen '0'). Manche C-Funktionen ergänzen den automatisch, manche nicht.
http://www.cplusplus.com/reference/cstring/strcat/
http://www.cplusplus.com/reference/cstring/strcpy/