Go Down

Topic: Anfänger braucht Starthilfe beim Code :) (Read 617 times) previous topic - next topic

stetastic712

Oct 20, 2019, 06:09 pm Last Edit: Oct 20, 2019, 06:42 pm by stetastic712
Moin,

ich bin grad bissl am basteln, und versuche aus mehreren Codes einen passenden für mich zu stricken. :)

Wenns fertig ist, soll folgende Funktion erfüllt werden :


1. Arduino 1 misst 3 Phasig Strom und errechnet die Gesamtleistung  (Funktioniert )

2. Arduino 1 soll per NRF24 die Gesamtleistung an Arduino 2 senden (( Da haperts leider schon, im TX    Code Zeile 51 wird der Fehler liegen, leider keine Ahnugn wie ich es beheben kann. ( Es soll der wert "gesamtpower" übertragen werden

3. Arduino 2 mappt die 0-10000W in einen 1024 Wer um, womit dann ein Digitalpoti angesteuert werden
  soll  ((( Zukunft, erstmal muß Problem eins behoben werden ))).. Der Arduino 2 ist bisher soweit das er
  bereit wäre Daten zu empfangen ( Siehe RX Code ))

Wäre für Hilfer jeglicher Art dankbar :)

(( Die Codes sind unten auch nochmal als Anhang dran ))



TX Code

Code: [Select]

#include <Wire.h>
#include <LiquidCrystal_I2C.h>

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

RF24 radio(9, 10); // CE, CSN       // Funkmoduk
const byte address[6] = "00001";    // Funkmodul


int currentPins[3] = {1,2,3};              //Assign phase CT inputs to analog pins
double calib[3] = {11.8337,11.8234,12.0325};
double kilos[3];
unsigned long startMillis[3];
unsigned long endMillis[3];
double RMSCurrent[3];
int RMSPower[3];
int peakPower[3];
int gesamtpower;


LiquidCrystal_I2C lcd(0x27,20,4);  // set the LCD address to 0x27 for a 16 chars and 2 line display


void setup()
{
Serial.begin(9600);
 radio.begin();
 radio.openWritingPipe(address);
 radio.setPALevel(RF24_PA_MIN);
 radio.stopListening();

 
 lcd.init();
 lcd.begin(20,4);              // columns, rows.  use 16,2 for a 16x2 LCD, etc.
 lcd.backlight();
 lcd.clear();
 lcd.setCursor(4,1);           // set cursor to column 0, row 0 (the first row)
 lcd.print("Stefans");
 lcd.setCursor(5,2);
 lcd.print("Powermeter");
 delay(3000);
}

void readPhase ()      //Method to read information from CTs
{

 Serial.println(gesamtpower);

 unsigned char text[] = "Testversuch";
 radio.write(&text, sizeof(text));

 
 for(int i=0;i<=2;i++)
 {
   int current = 0;
   int maxCurrent = 0;
   int minCurrent = 1000;
   for (int j=0 ; j<=200 ; j++)  //Monitors and logs the current input for 200 cycles to determine max and min current
   {
     current =  analogRead(currentPins[i]);    //Reads current input and records maximum and minimum current
     if(current >= maxCurrent)
       maxCurrent = current;
     else if(current <= minCurrent)
       minCurrent = current;
   }
   if (maxCurrent <= 517)
   {
     maxCurrent = 516;
   }
   RMSCurrent[i] = ((maxCurrent - 516)*0.707)/calib[i];    //Calculates RMS current based on maximum value and scales according to calibration
   RMSPower[i] = 220*RMSCurrent[i];    //Calculates RMS Power Assuming Voltage 220VAC, change to 110VAC accordingly
   if (RMSPower[i] > peakPower[i])
   {
     peakPower[i] = RMSPower[i];
   }
   endMillis[i]= millis();
   unsigned long time = (endMillis[i] - startMillis[i]);
   kilos[i] = kilos[i] + (RMSPower[i] * (time/60/60/1000000));    //Calculate kilowatt hours used
   startMillis[i]= millis();

   
 }
}

void loop()   //Calls the methods to read values from CTs and changes display
{
 gesamtpower = RMSPower[0]+RMSPower[1]+RMSPower[2];

 
 
 readPhase();
 displayKilowattHours ();
 delay(1000);
 readPhase();
 displayCurrent ();
 delay(1000);
 readPhase();
 displayRMSPower ();
 delay(1000);

}

void displayKilowattHours () //Displays all kilowatt hours data
{
 lcd.clear();
 lcd.setCursor(0,0);
 lcd.print("Energie");
 lcd.setCursor(0,1);
 lcd.print("L1 : ");
 lcd.print(kilos[0]);
 lcd.print(" kWh");
 lcd.setCursor(0,2);
 lcd.print("L2 : ");
 lcd.print(kilos[1]);
 lcd.print(" kWh");
 lcd.setCursor(0,3);
 lcd.print("L3 : ");
 lcd.print(kilos[2]);
 lcd.print(" kWh");

}

void displayCurrent () //Displays all current data
{
 lcd.clear();
 lcd.setCursor(0,0);
 lcd.print("Ampere");
 lcd.setCursor(0,1);
 lcd.print("L1 : ");
 lcd.print(RMSCurrent[0]);
 lcd.print(" A");
 lcd.setCursor(0,2);
 lcd.print("L2 : ");
 lcd.print(RMSCurrent[1]);
 lcd.print(" A");
 lcd.setCursor(0,3);
 lcd.print("L3 : ");
 lcd.print(RMSCurrent[2]);
 lcd.print(" A");

}

void displayRMSPower () //Displays all RMS power data
{
 lcd.clear();
 lcd.setCursor(0,0);
 lcd.print("Leistung");
 lcd.setCursor(0,1);
 lcd.print("L1 : ");
 lcd.print(RMSPower[0]);
 lcd.print(" Watt");
 lcd.setCursor(0,2);
 lcd.print("L2 : ");
 lcd.print(RMSPower[1]);
 lcd.print(" Watt");
 lcd.setCursor(0,3);
 lcd.print("L3 : ");
 lcd.print(RMSPower[2]);
 lcd.print(" Watt");

}






RX Code

Code: [Select]

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);


RF24 radio(10, 9); // CE, CSN
const byte address[6] = "00001";
void setup() {
 Serial.begin(9600);
 radio.begin();
 radio.openReadingPipe(0, address);
 radio.setPALevel(RF24_PA_MIN);
 radio.startListening();

 if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3D for 128x64
   Serial.println(F("SSD1306 allocation failed"));
   for(;;);
 }
 delay(2000);
 
 
}
void loop() {
 if (radio.available()) {
   char text[32] = "";
   radio.read(&text, sizeof(text));
 

display.clearDisplay();

 display.setTextSize(2);
 display.setTextColor(WHITE);
 display.setCursor(1, 10);
 // Display static text
  display.println(text);
  Serial.println(text);
 display.display();


   
 }
}


Tommy56

Setze Deinen Code bitte in Codetags (</>-Button oben links im Forumseditor oder [*code] davor und [*/code] dahinter ohne *).
So ist er auch auf portablen Geräten lesbar. Das kannst Du auch noch nachträglich ändern.

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

agmue

Möglicherweise suchst Du etwas wie sprintf, hier ein praktisches Beispiel.
Wahnsinn und Verstand trennt nur eine dünne Wand. (Daniel Düsentrieb)

stetastic712

Dank Tommy, wusste nicht ganz wie´s funkioniert :)

agmue, die Richtung mit dem sprintf wird bestimmt die Richtige sein, ich glaube aber, das ich mit den Infos nicht viel weiter kommen werde  :smiley-confuse:  :smiley-confuse:

Tommy56

Die Infos zum Format stehen beim in der Seite verlinktem printf.

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

postmaster-ino

Hi

<OT>
Anmerkung:
Sofern Du NUR die Ströme misst, werden die Ergebnisse nicht viel mit der Realität gemein haben, da der Strom und die Spannung wahrscheinlich nicht phasengleich sind.
</OT>

Da Du nur zwei Teilnehmer hast, sollten die Beispiele dafür eigentlich genügend Ansätze für liefern.

Kannst Du - ganz ohne den Strom-Kram - ein einzelnes Byte/einen festen Text sicher versenden?

MfG
anscheinend ist Es nicht erwünscht, einen Foren-internen Link als 'Homepage' einzubinden, damit JEDER nur einen Klick von combie's Liste zum Thema State-Maschine entfernt ist.
... dann eben nicht ...

stetastic712

Mein Cos im Haushalt ist nicth ganz versaut, die Phasengleicheit der Ströme/Spannungen möchte ich erstmal vernachlässigen, das Projekt dient dazu einen Einspeisewechselrichter die aktuell gezogene leistung vom Netz mitzuteilen,... da dieser nur einen Eingang für einen CT hat,..werde ich dem mit 5VAC und einem Poti ein passendes Signal vorgaukeln ;)......

Bin froh wenn die Grundpfeiler vom Code stehen, den Rest kann man dann beschnöigen wenn Zeit ist,.... Spannugnsmessung kommt evtl später noch dazu,...vorher wird mit Festwerten gerechnet.

Übertragung von Arduino 1 auf zwei funktioniert,... also.. zumindest ein "Text" ..aber ich bekomme meinen "gesamtpower" wert nicht rüber

postmaster-ino

Hi

Senden von z.B. Strukturen zwischen zwei NRF24L01 geht z.B. so:
Code: [Select]

//Sender 0

// http://www.bajdi.com
// Sending a struct with the nRF24L01 module
// Data to be sent is the reading of 2 analog pins
// Data received is the analog reading of 2 pins on the other Arduino

#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"

typedef struct {
  int A;
  int B;
  float C;
  float D;
}
A_t;

typedef struct {
  int W;
  int X;
  float Y;
  float Z;
}
B_t;

A_t duino1;
B_t duino2;

//9,10 beim Uno/Nano und 9,53 beim Mega müsste passen
//RF24 <erzeugte Instanz>(CE-Pin,CS-Pin);
//RF24 <erzeugte Instanz>(CE-Pin,CS-Pin,SPI_Speed);
RF24 radio(9, 10); // make sure this corresponds to the pins you are using

const uint64_t pipes[2] = {
  0xF0F0F0F0E1LL, 0xF0F0F0F0D2LL
};

void setup()
{
  Serial.begin(57600);
  delay(10);
  radio.begin();
  radio.openWritingPipe(pipes[1]);
  radio.openReadingPipe(1, pipes[0]);
  radio.printDetails();
  radio.startListening();
}

void loop(void)
{
  // we need data to sent...
  duino1.A = analogRead(A0);
  duino1.B = analogRead(A1);
  duino1.C = analogRead(A0) / 102.3;
  duino1.D = analogRead(A1) / 102.3;
  // end of analog reading

  // radio stuff
  if ( radio.available() )
  {
    bool done = false;
    while (!done)
    {
      done = radio.available();
      radio.read( &duino2, sizeof(duino2) );
    }
    radio.stopListening();
    radio.write( &duino1, sizeof(duino1) );
    radio.startListening();
  }
  // end of radio stuff

  // serial print received data
  Serial.print("duino2.W = ");
  Serial.println(duino2.W);
  Serial.print("duino2.X = ");
  Serial.println(duino2.X);
  Serial.print("duino2.Y = ");
  Serial.println(duino2.Y);
  Serial.print("duino2.Z = ");
  Serial.println(duino2.Z);
  // end of serial printing
}

Code: [Select]

//Sender 1

// http://www.bajdi.com
// Sending a struct with the nRF24L01 module
// Data to be sent is the reading of 2 analog pins
// Data received is the analog reading of 2 pins on the other Arduino

#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"

//9,10 beim Uno/Nano und 9,53 beim Mega müsste passen
//RF24 <erzeugte Instanz>(CE-Pin,CS-Pin);
//RF24 <erzeugte Instanz>(CE-Pin,CS-Pin,SPI_Speed);
RF24 radio(9, 10); // make sure this corresponds to the pins you are using
const uint64_t pipes[2] = {
  0xF0F0F0F0E1LL, 0xF0F0F0F0D2LL
};

const int led = 13;

typedef struct {
  int A;
  int B;
  float C;
  float D;
}
A_t;

typedef struct {
  int W;
  int X;
  float Y;
  float Z;
}
B_t;

A_t duino1;
B_t duino2;

void setup()
{
  Serial.begin(57600);
  pinMode(led, OUTPUT);
  radio.begin();
  radio.openWritingPipe(pipes[0]);
  radio.openReadingPipe(1, pipes[1]);
  radio.setPALevel(RF24_PA_MIN);
}

void loop(void)
{
  // we need data to sent...
  duino2.W = analogRead(A0);
  duino2.X = analogRead(A1);
  duino2.Y = analogRead(A0) / 102.3;
  duino2.Z = analogRead(A1) / 102.3;
  // end of analog reading

  // radio stuff
  radio.stopListening();
  bool ok = radio.write( &duino2, sizeof(duino2) );
  radio.startListening();
  if (!ok) Serial.println("Send fail");
  unsigned long started_waiting_at = millis();
  bool timeout = false;
  while ( ! radio.available() && ! timeout )
    if (millis() - started_waiting_at > 250 )
      timeout = true;

  if ( timeout )
  {
    Serial.println("Failed, response timed out.");
    digitalWrite(led, HIGH);
  }
  else
  {
    radio.read( &duino1, sizeof(duino1) );
    digitalWrite(led, LOW);
  }
  // end of radio stuff

  // serial print received data
  Serial.print("duino1.A = ");
  Serial.println(duino1.A);
  Serial.print("duino1.B = ");
  Serial.println(duino1.B);
  Serial.print("duino1.C = ");
  Serial.println(duino1.C);
  Serial.print("duino1.D = ");
  Serial.println(duino1.D);
  // end of serial printing
}

Die im Sketch genannte Quelle gibt's zwar, dort finde ich aber bei nrf24L01 dieses Beispiel nicht mehr.

MfG
anscheinend ist Es nicht erwünscht, einen Foren-internen Link als 'Homepage' einzubinden, damit JEDER nur einen Klick von combie's Liste zum Thema State-Maschine entfernt ist.
... dann eben nicht ...

stetastic712

Danke , läuft,.... SPRINTF war der ausschlaggebene Hinweis ;)

Whandall

Code: [Select]
    while (!done)
    {
      done = radio.available();
      radio.read( &duino2, sizeof(duino2) );
    }

Völliger Quatsch.

Quote
// http://www.bajdi.com
Scheint qualitativ in der Nähe von Instructables zu liegen.
Ah, this is obviously some strange usage of the word 'safe' that I wasn't previously aware of. (D.Adams)

postmaster-ino

Hi

Etwas mehr an Erklärung als 'Quatsch' hätte ich mir nun dann doch erbeten.
done=radio.available(); wird wohl false zurück geben, wenn nix vorhanden ist.
Das anschließende Read wird somit einen ungültigen Buffer auslesen - da die Schleife wiederholt wird, sehe ich hier noch kein Problem.

Lasse auch mich den Quatsch in dem Beispiel erkennen.

MfG
anscheinend ist Es nicht erwünscht, einen Foren-internen Link als 'Homepage' einzubinden, damit JEDER nur einen Klick von combie's Liste zum Thema State-Maschine entfernt ist.
... dann eben nicht ...

Whandall

#11
Oct 21, 2019, 01:19 am Last Edit: Oct 21, 2019, 08:25 am by Whandall
Etwas mehr an Erklärung als 'Quatsch' hätte ich mir nun dann doch erbeten.
done=radio.available(); wird wohl false zurück geben, wenn nix vorhanden ist.
Das anschließende Read wird somit einen ungültigen Buffer auslesen - da die Schleife wiederholt wird, sehe ich hier noch kein Problem.

Lasse auch mich den Quatsch in dem Beispiel erkennen.
Blockierender Kode ist in einer Kommunikation per se Quatsch,
so wie das geschrieben ist hängt der Receiver wenn kein Paket empfangen werden kann.

Ermitteln ob ein Paket gelesen werden kann und dann ohne Beachtung dieses Ergebnisses den Puffer zu lesen,
ist auch Quatsch, weil

  • es in der Regel völlig überfüssig ist, da eigentlich fast nie ein Paket vorhanden ist,
    und immerhin ist es eine ausgewachsene SPI Transaktion
  • das Datenblatt eine solche Vorgehensweise nicht explizit erlaubt, man damit dokumentierten Bereich verlässt
    und man sich darauf verlässt dass der Chip auch noch funktioniert wenn man ihn hemmungslos mishandelt
Traurig, dass sich dir die Qualität deines Vorschlags nicht erschließt.
Ah, this is obviously some strange usage of the word 'safe' that I wasn't previously aware of. (D.Adams)

agmue

Traurig, dass sich dir die Qualität deines Vorschlags nicht erschließt.
So ein Satz erstickt jeglichen Mut, eine Frage zu stellen. Aber um Fragen zu stellen, weil wir Dinge nicht verstehen, sind wir hier doch aktiv. Zumindest trifft das auf mich zu.

Die im Sketch genannte Quelle gibt's zwar, dort finde ich aber bei nrf24L01 dieses Beispiel nicht mehr.
Möglicherweise ist die blockierende Art der Programmierung der Grund dafür.
Wahnsinn und Verstand trennt nur eine dünne Wand. (Daniel Düsentrieb)

Tommy56

So ein Satz erstickt jeglichen Mut, eine Frage zu stellen. Aber um Fragen zu stellen, weil wir Dinge nicht verstehen, sind wir hier doch aktiv. Zumindest trifft das auf mich zu.
Da wurde aber keine Frasge gestellt, sondern die blockierende Art der Programmierung als "ohne Probleme" hingestellt. Mit > 5000 Postings sollte man solche Grundlagen eigentlich schon wissen, dass blockierung in der Kommunikation kein guter Weg ist.

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

stetastic712

Dann mal eine nächste Frage um die wirklichen Probleme meines Lebens zu lösen ;););)


Wie bekomme ich den "empfangenen Text" "gesichert" so das ich ihn weiterverarbeiten kann zb.
für die Ausgabe an ein Digipot ???

Die Funkverbindung ist natürlich nicht perfekt, da nur einseitige Kommunikation herrscht,... mir war es nur wichtig einen kurzen Code zu finden,... den ich grad am Anfang noch überblicken kann,..




Code: [Select]

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);

RF24 radio(10, 9); // CE, CSN
const byte address[6] = "00001";
void setup() {
  Serial.begin(9600);
  radio.begin();
  radio.openReadingPipe(0, address);
  radio.setPALevel(RF24_PA_MIN);
  radio.startListening();

  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3D for 128x64
    Serial.println(F("SSD1306 allocation failed"));
    for(;;);
  }
  delay(1000);
 
}
void loop() {
  if (radio.available()) {
    char text[10] = "";
    radio.read(&text, sizeof(text));
 

  display.clearDisplay();
  display.setTextSize(3);
  display.setTextColor(WHITE);
  display.setCursor(25, 10);
  // Display static text
   display.println(text);
   display.setCursor(25, 40);
  display.println("Watt");
  display.display(); 
  Serial.println(text);

 
  }
}

Go Up