Ist mein Program-Code falsch?

Guten Morgen,

für ein Schulprojekt habe ich mir eine Schaltung aus Display und LED zur Temperatur Überwachung sowie eine Schaltung zum Steuern eines Servo Motors per Knopfdruck überlegt. Beide Programm Codes einzeln funktionieren. Sobald ich die Codes verbinde funktioniert allerdings nur noch das Display und die LEDs, der Servo Motor bewegt sich nur noch ganz minimal und extrem langsam. Könnte mein Problem am Code liegen?

Programm Code

Danke schonmal

Hi!

Ich glaube, dass sich so niemand den Code ansieht.

Bitte poste ihn hier im Forum!

Wie das geht?
Das ist hier nachzulesen: Wie man dieses Forum benutzt - bitte lesen

Hallo,
und warum stellst Du einen Sketch nicht wie jeder andere hier rein. Lese mal die Nutzungsbedingungen.
In der IDE gibt es eine Funktion "für Forum Kopieren" das kannst Du dann hier einfügen. Das kannst Du auch noch nachträglich machen.
(Auf was für Ideen kann man denn sonst noch kommen )
Heinz


#include <DallasTemperature.h>
#include <OneWire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
#define ONE_WIRE_BUS 5
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
int greenLedPin = 2;
int yellowLedPin = 3;
int redLedPin = 4;
int temp_sensor = 5;
float temperature = 0;
int lowerLimit = 20;
int higherLimit = 25;
#include <Servo.h>
Servo myservo;
#define servoPin 11
#define pushButtonPin 12
int angle =90;
int angleStep =10;
const int minAngle = 0;
const int maxAngle = 180;
const int type =1;
int buttonPushed =0;
void setup() {
 // put your setup code here, to run once:
lcd.init();
lcd.backlight();
sensors.begin();
Serial.begin(9600);
pinMode(redLedPin,OUTPUT);
pinMode(greenLedPin,OUTPUT);
pinMode(yellowLedPin,OUTPUT);
Serial.begin(9600);
myservo.attach(servoPin);
pinMode(pushButtonPin, INPUT_PULLUP);
Serial.println("Robojax Servo Button");
myservo.write(angle);
}
void loop() {
 // put your main code here, to run repeatedly:
lcd.setCursor(0,0);
lcd.print(" Gartenteich");
sensors.requestTemperatures();
lcd.setCursor(0,1);
lcd.print("Temp: ");
lcd.print(sensors.getTempCByIndex(0));
lcd.print("\337C");
delay(1000);
Serial.print("Requesting Temperatures from sensors: ");
 sensors.requestTemperatures(); 
 Serial.println("DONE");
 
 temperature = sensors.getTempCByIndex(0);
digitalWrite(redLedPin, LOW);
 digitalWrite(greenLedPin, LOW);
 digitalWrite(yellowLedPin, LOW);
 
 Serial.print("Temperature is ");
 Serial.print(temperature);
 if(temperature <= lowerLimit){ 
 Serial.println(", Yellow LED is Activated");
digitalWrite(yellowLedPin, HIGH); } 
 else if(temperature > lowerLimit && temperature < higherLimit){ 
 Serial.println(", Green LED is Activated"); 
 digitalWrite(greenLedPin, HIGH);
 } 
 else if(temperature >= higherLimit){
 Serial.println(", Red LED is Activated");
 digitalWrite(redLedPin, HIGH);
 }
 delay(500);
if(digitalRead(pushButtonPin) == LOW) {
 buttonPushed = 1;
}
 if(buttonPushed) {
 angle = angle + angleStep;
 if (angle >= maxAngle) {
 angleStep = -angleStep;
 if(type ==1) {
 buttonPushed =0;
 }
 }
 if(angle <= minAngle) {
 angleStep = -angleStep;
 if(type ==2)
 {
 buttonPushed =0;
 }
 }
 myservo.write(angle);
 Serial.print("Moved to: ");
 Serial.print(angle);
 Serial.println(" degree");
 delay(100);
}
}

Das macht dein Programm träge.

Mein Rat:

  1. Kooperatives Multitasking.
  2. Endliche Automaten bauen

Hallo,
du hast da zwei delay() drin , damit wird das so nix werden. Bei einem delay () macht der Contoler eine Pause. Schau Dir millis() an und wie man das verwendet, dazu kannst Du hier nach der Nachtwächter Erklärung suchen. Es gibt in der IDE ein Beispiel" BlinkWithoutDelay" wenn Du das verstanden und anwenden kannst wirst Du deinen Sketch ein wenig umbauen und dann klappt das auch. Nutze Functionen damit das übersichtlich bleibt.
Heinz

Und wenn Du mit dem Umbau einigermaßen durch bist:
Das Display muss nicht in jedem Durchlauf von loop() beschrieben werden; das sollte nur passieren, wenn sich was ändert.

Vielleicht befreist Du auch erstmal die Einzel-Sketche von den delay()-Aufrufen. Dann ist der Berg, den es zu überwinden gilt, nicht so hoch und danach geht das erneute Zusammensetzen fast wie von selbst.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.