FESTINA LENTE 

Sur le Pont d’Avignon L'on y danse, l'on y danse Sur le Pont d’Avignon L'on y danse tous en rond  Festina Lente auf ihrem alten Liegeplatz in Bahia  ESP32 C3 ESP32 C3 Pinout
REISEBLOG
TIPS UND TRICKS
WERKZEUG TIPS
ELEKTRISCHE TIPS
ARDUINO
AUTOPILOT
RUDERLAGEANZEIGE
PWM-AUTOMAT
VERBINDUNGSTECHNIK
EMP-SCHUTZ
REFIT-TIPS
WETTER-TIPS
SECOND LIFE
FUNDUS-TIPS
SOUS VIDE
PANTRY-TIPS
HEIZUNGS-TIPS
UNSORTIERTE TIPS
DAS SCHIFF
INVENTAR
TECHN. ANLEITUNGEN
FÜR GÄSTE
VIDEOS
LINKS
IMPRESSUM
STARTSEITE



Elektrische Tips - Ruderlageanzeige mit Arduino

Bei einer Pinnensteuerung finden es viele Skipper als besonders angenehm, die Ruderlage stets "Im Griff" zu haben, also ohne Hinzusehen stets perfekt über die Ruderlage informiert zu sein.
Mit der bei größeren Schiffen (>10m) üblichen Radsteuerung ist das nicht so einfach. Meist behilft man sich mit einer Markierung auf dem ansonsten symmetrischen Rad. Weil es von einer Seite zur anderen meist mehr als 3 Umdrehungen sind, kann das durchaus mißverständlich sein.
Da hilft ein Ruderlageanzeiger, der gewöhnlich bei einem Autopiloten automatisch mit dabei ist. Meist besteht dieser Anzeiger aus einem Anzeigeinstrument, das die Ausgangsspannung des Ruderlagepotentiometers darstellt, das gewöhnlich Bestandteil eines Autopiloten ist.
Nachteilig ist dabei, daß dieses Instrument meist nicht optimal plaziert werden kann, und zum Ablesen direkt angesehen werden muß, man kann es nicht "aus den Augenwinkeln" ablesen, sondern muß hierfür den Blick vom eigentlichen Geschehen abwenden. Dann muß das Auge auf kurze Entfernung adaptieren, um das Instrument überhaupt ablesen zu können. Das braucht seine Zeit. Da kann es passieren, daß man eine volle Sekunde "blind" fährt, bis man das wirkliche Geschehen wieder mit dem Auge erfassen kann. Als Lösung für dieses Problem könnte eine LED-Zeile dienen, deren Basisbreite wirklich groß ist (~50cm). deren LED's so hell sind. daß man sie auch im Sonnenschein erkennt. ohne sie direkt anzusehen.

// Mit BLE Server
//Mit Farbe
// Mit Beruhigung der LED-Nummer per Array

#include <BLEDevice.h> 
#include <BLEUtils.h>
#include <BLEServer.h>

#include "Adafruit_NeoPixel.h"

#define SERVICE_UUID        "4fafc201-1fb5-459e-8fcc-c5c9c331914b"
#define CHARACTERISTIC_UUID "beb5483e-36e1-4688-b7f5-ea07361b26a8"


#define PIN 4  // den Stift für den Anschluss des Farbbands angeben
#define NUMPIXELS 96  // die Anzahl der LEDs auf dem Streifen angeben
Adafruit_NeoPixel strip (NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
int r = 0;           //Rotanteil,  Wertebereich 0-255
int g = 0;           //Grünanteil, Wertebereich 0-255
int b = 0;           //Blauanteil, Wertebereich 0-255
int i=0;             //Zählvariable
int position = 0; //Variable für Position des Lichtpunkts Wertebereich 0 - 99
int leuchtstaerke = 0; //Variable für Leuchtstärke Wertebereich 0 - 255
int rudergeber = 0;  // Nummer des Ports (GPOI0), von dem der Ruderwinkel gelesen wird.
int LDR = 1;         // Nummer des Ports (GPIO1), von dem die Helligkeit gelesen wird.
int ruderwinkel = 0; // Ruderwinkel, wie er vom Geber gelesen wird.
int helligkeit = 0;  // Vom ADC gelesener Helligkeitswert
int lednummer = 0;  // Nummer der aktuell leuchtenden LED. Wertebereich 0-49
int ledarray [10];   //Array zur Beruhigung von lednummer,  10 Elemente 0-9
int ilednummer = 0;  // Zählvariable für das Array


void setup() {
  strip.begin(); // Aktivieren von Neopixel
  Serial.begin(115200);
  Serial.println("Starting BLE work!");
  
  BLEDevice::init("Ruderlagegeber mit Server"); // Das ist der Device-Name
  BLEServer *pServer = BLEDevice::createServer();
  BLEService *pService = pServer->createService(SERVICE_UUID);  
  BLECharacteristic *pCharacteristic = pService->createCharacteristic(
                                         CHARACTERISTIC_UUID,
                                         BLECharacteristic::PROPERTY_READ |
                                         BLECharacteristic::PROPERTY_WRITE
                                       );

  pCharacteristic->setValue("Zu übertragende Daten"); // zu übertragende Daten*******************************
  pService->start();
  // BLEAdvertising *pAdvertising = pServer->getAdvertising();  // this still is working for backward compatibility
  BLEAdvertising *pAdvertising = BLEDevice::getAdvertising();
  pAdvertising->addServiceUUID(SERVICE_UUID);
  pAdvertising->setScanResponse(true);
  pAdvertising->setMinPreferred(0x06);  // functions that help with iPhone connections issue
  pAdvertising->setMinPreferred(0x12);
  BLEDevice::startAdvertising(); 
  Serial.println("Characteristic defined! Now you can read it in your phone!");
  }
void loop() {
  //Serial.print(" Leuchtstärke: "); //Testausgabe für Serial Monitor 
  //Serial.print(leuchtstaerke); // Testausgabe für Serial Monitor
  ruderwinkel = analogRead(rudergeber);  // Rudergeber lesen.
  helligkeit = analogRead(LDR);          // Helligkeit vom LDR gelesen
  leuchtstaerke = helligkeit * -0.5 ;       // Leuchtstärke der LED abhängig vom Umgebungslicht
  //Serial.print(" Ruderwinkel: ");
  //Serial.print(ruderwinkel); //gelesenen Ruderwinkel über Serial Monitor ausgeben
  lednummer = ruderwinkel / 35 ; // LEDNummer aus Ruderwinkel berechnen 
  if (lednummer < 0) lednummer = 0; // negative LED-Nummern ausschließen
  if (lednummer > 95) lednummer = 95; // LED-Nummern > 99 ausschließen
  Serial.print(" LED-Nummer: ");
  Serial.print(lednummer);       // Akuelle LED-Nummer anzeigen.
  Serial.println(" "); //Im Serial Monitor eine neue Zeile
  strip.clear();   // alle LEDs ausschalten 
  beruhigeLEDnummer(); //LEDnummer beruhigen
  bestimmeFarbe();     // Je nach LEDnummer Farbe einstellen
  
  
  
  
  
  strip.setBrightness(leuchtstaerke); //Leuchtstärke einstellen
 
  strip.setPixelColor(lednummer, strip.Color(r,g,b)); // LED vorbereiten
   if (lednummer == 47)  strip.setPixelColor(48, strip.Color(0,255,0)); //Bei 24 Nummer 25 (grün) zusätzlich wenn Mitte 
   if (lednummer == 48)  strip.setPixelColor(47, strip.Color(255,0,0)); //Bei 25 Nummer 24 (rot) zusätzlich wenn Mitte 
  strip.show();                                               // LED einschalten
  
      
      strip.clear();   // alle LEDs ausschalten, zum Neuanfang des Programms

      
     delay (1000);
} 

//********************Subroutineoutine zur Farbbestimmung********************************************
 void bestimmeFarbe(){ if(lednummer<=47){ r = 255; g = 0; b = 0; }//LEDnummer 0-24 ROT
                      if(lednummer>=48){ r = 0; g = 255; b = 0; }//LEDnummer 25-49 GRÜN
                      
                     }
//*******************************************************************************************
//******************** Subroutine zur Beruhigung von LEDnummer****************************
void beruhigeLEDnummer() { // Routine zur Beruhigung des Wertes für die LEDnummer
    if (ilednummer <14) {  // wenn das Array noch nicht voll beschrieben ist
      ledarray[ilednummer]==lednummer; // Arrayzelle mit zuletzt gelesenen und berechneten LEDnummer beschreiben
      lednummer = (ledarray[0]+ledarray[1]+ledarray[2]+ledarray[3]+ledarray[4]+ledarray[5]+
      ledarray[6]+ledarray[7]+ledarray[8]+ledarray[9]+ledarray[10]+ledarray[11]+ledarray[12]+ledarray[13]+
      ledarray[14]+ledarray[15]) / 16 ;
      // Beruhigten Wert für lednummer berechnen. 
      ilednummer = ilednummer +1;// LEDnummer für den nächsten Durchlauf vorbereiten.           
      }     
      else if (ilednummer >15) {        // Falls  Zähler für LEDnummer schon zu hoch, auf 0 zurücksetzen.
        ilednummer =0;
        } 
        
  }
//******************************************************************************************      
  
 

SEITENANFANG

©