Show Posts
Pages: [1] 2 3 ... 34
1  International / Deutsch / Re: Poti mit einem DAC ersetzen on: July 23, 2014, 03:06:12 am
Ich habe das Poti schon mal gegen ein SPI steuerbares Poti ersetzt (z.B. MCP4151): Hat prinzipiell funktioniert, man muss nur darauf achten, dass das SPI Poti nur max 5V verträgt.
Auf jeden Fall muss man darauf achten, dass der Baustein ohne Poti kaputt geht.

Gruß
Reinhard
2  International / Deutsch / Re: TTL auslesen (Quad 2-input NAND Schmitt trigger) on: July 10, 2014, 10:57:01 am
Hallo Stefan,

du kannst den Ausgang des NAND Gates direkt auf deinen Eingang des UNO legen.

Gruß
Reinhard
3  International / Deutsch / Re: RFM12B Arduino on: June 13, 2014, 05:18:29 pm
Hallo Jörg,
ist schon etwas her, aber das müsste der Sketch sein
Code:
/// Receive / decode OOK signals using a RFM12B as 434 MHz OOK receiver for K9010 temp/humidity sensor
//
// Adapted from the experiments and code by JGJ Veken, as posted on the wiki at:
// http://jeelabs.net/projects/cafe/wiki/Receiving_OOKASK_with_a_modified_RFM12B 
// and  Arduino sketch to receive KW9010 temperature/humidity RF sensor telegrams
// Written by 'jurs' for German Arduino Forum

#include <JeeLib.h>


#define RX433DATA 3       // receive pin for hardware interrupts
#define RX433INTERRUPT 1  // interrupt number for receive pin

#define KW9010_SYNC 8900  // length in µs of starting pulse
#define KW9010_ONE 4020   // length in µs of ONE pulse
#define KW9010_ZERO 1950  // length in µs of ZERO pulse
#define KW9010_GLITCH 350 // pulse length variation for ONE and ZERO pulses
#define KW9010_MESSAGELEN 36  // number of bits in one message



static void rf12_init_OOK ()
{
  /*0x8017,   http://www.mikrocontroller.net/attachment/80918/main.c
   0xC431,
   0xa608,
   0x94c2,
   0xC220,
   0x82D8,
   0xCA00,
   0xCC67,
   0xC623,
   0,
   0*/
  rf12_control(0x8017); // 8027    Configuration Settings: 433 Mhz; !TX; !RX FIFO; 12pF
  rf12_control(0x82D8); // 82C0    Power Management: enable receiver; enable basebandblock; enable synth; en cryst osc
  rf12_control(0xA608); // A68A    Frequency Setting: Fc =430+ F x0.0025MHz; F = 1544; 433,86 MHz
  rf12_control(0xC623); // C691    Data Rate: 9579 kbps 
  rf12_control(0x94c2); // 9489    Receiver Control: LNA Gain max; Pin VDI; RX BW 67kHz; VDI fast; DRSSI -91 db
  rf12_control(0xC220); // C220    Data Filter & Clock Recovery:  ** not documented cmd
  rf12_control(0xCA00); // CA00    FIFO and Reset Mode: FIFO full disabled
  rf12_control(0xC431); // C473    Automatic Frequency Control: AFC Auto OFF; enable AFC; offset register; +3 -4
  rf12_control(0xCC67); // CC67    PLL Settings: Clock rise low; PLL Band 256 kbps; !Dither;
  // rf12_control(0xB800); // TX register write command not used
  // rf12_control(0xC800); // Low Duty-Cycle: disable low dutycycle
  // rf12_control(0xC040); // Low Battery Detect and µC Clock: 1.66MHz, 2.2V not used see 82c0 
  // register calculator: http://tools.jeelabs.org/rfm12b.html
}


void setup () {
  Serial.begin(115200);
  pinMode(RX433DATA, INPUT);
  Serial.println(F("Sec\tCRC\tPak\tID\tChan\tTemp C\tTrend\trH %\tLowBat\tForced send"));
  rf12_initialize(0, RF12_868MHZ);
  rf12_init_OOK();
  attachInterrupt(RX433INTERRUPT, rx433Handler, CHANGE);
}

unsigned long lastread;
boolean pending=false;
unsigned long lastData;
int dataCounter=0;

void loop () {
  if (pending && millis()-lastread > 500) {   // es ist noch was zu drucken
    if (lastData!=0)         // letzten Datensatz drucken
    {
      Serial.print(millis()/1000);
      Serial.print(F("\tOK"));
      Serial.print(F("\t"));
      Serial.print(dataCounter);
      printResults(lastData);
      Serial.println(); 
      dataCounter=0;
      lastData=0;
    } 
    else
    { 
      Serial.print(F("F"));
      Serial.println(); 
    } 
    pending = false;
    lastData=0;
  }   
  if (fifoAvailable())  // es sind neue Daten da
  {
    unsigned long dataReceived=fifoRead();
    lastread=millis();              // Zeitpunkt des letzten Datensatzes
    if (dataReceived==lastData) {   // gleicher Datensatz
      dataCounter++;             // Anzahl gleicher Pakete
      pending=true;
    }
    else {                        //                           
      if (pending) {             // ungleicher Datensatz kam innerhalb 500ms und da war noch was zum printen
        if (lastData!=0)
        {
          Serial.print(millis()/1000);
          Serial.print(F("\tOK"));
          Serial.print(F("\t"));
          Serial.print(dataCounter);
          printResults(lastData);
          Serial.println(); 
          dataCounter=0;
          lastData=0;
        } 
        else
        { 
          Serial.print(F("F"));
          Serial.println(); 
        } 
        pending = false;
      }
      lastData=dataReceived;
      dataCounter++;
      pending=true;
    }
  }
}

void printResults(unsigned long value)
{
  // Sensor ID
  byte id = value & 0b11001111; // bit 0, 1, 2, 3, 6, 7, random change bits when battery is changed
  Serial.print('\t');
  Serial.print(id);
  // Channel (as set on sensor)
  byte channel = 2*bitRead(value,4)+bitRead(value,5); // bit 4, 5 are channel number
  Serial.print('\t');
  Serial.print(channel);
  // Temperature
  int temperature = value>>12 & 0b111111111111;  // bit 12..23
  // if sign bit is set, adjust two's complement to fit a 16-bit number
  if (bitRead(temperature,11)) temperature= temperature | 0b1111000000000000;
  Serial.print('\t');
  Serial.print(temperature/10.0,1);
  // temperature tendency
  byte trend = value>>9 &0b11; // bit 9, 10
  Serial.print('\t');
  if (trend==0) Serial.print('=');       // temp tendency steady
  else if (trend==1) Serial.print('-');  // temp tendency falling
  else if (trend==2) Serial.print('+');  // temp tendency rising
  // Humidity
  byte humidity = (value>>24 & 0b11111111) - 156; // bit 24..31
  Serial.print('\t');
  Serial.print(humidity);
  // Battery State
  bool lowBat = value>>8 & 0b1;      // bit 8 is set if battery voltage is low
  Serial.print('\t');
  Serial.print(lowBat);
  // Trigger
  bool forcedSend = value>>11 &0b1;  // bit 11 is set if manual send button was pressed
  Serial.print('\t');
  Serial.print(forcedSend);
}

boolean crcValid(unsigned long value, byte checksum)
// check if received crc is correct for received value
{
  byte calculatedChecksum = 0;
  for (int i = 0 ; i < 8 ; i++) calculatedChecksum +=(byte)(value >> (i*4));
  calculatedChecksum &= 0xF;
  return calculatedChecksum == checksum;
}

void rx433Handler()
{
  static long rx433LineUp, rx433LineDown;
  static unsigned long rxBits=0;
  static byte crcBits=0;
  static byte bitsCounted=0;
  long LowVal, HighVal;
  byte rx433State = digitalRead(RX433DATA); // current pin state
  if (rx433State) // pin is now HIGH
  {
    rx433LineUp=micros(); // line went HIGH after being LOW at this time
    LowVal=rx433LineUp - rx433LineDown; // calculate the LOW pulse time
    if (LowVal>KW9010_SYNC-2*KW9010_GLITCH && LowVal<KW9010_SYNC+2*KW9010_GLITCH)
    {
      rxBits=0;
      crcBits=0;
      bitsCounted=0;
    }
    else if (LowVal>KW9010_ONE-KW9010_GLITCH && LowVal<KW9010_ONE+KW9010_GLITCH)
    { // set the one bits
      if (bitsCounted<32)
        bitSet(rxBits,bitsCounted);
      else 
        bitSet(crcBits,bitsCounted-32);
      bitsCounted++;
    }
    else if (LowVal>KW9010_ZERO-KW9010_GLITCH && LowVal<KW9010_ZERO+KW9010_GLITCH)
    { // setting zero bits is not necessary, but count them
      bitsCounted++;
    }
    else // received bit is not a SYNC, ONE or ZERO bit, so restart
    {
      rxBits=0;
      crcBits=0;
      bitsCounted=0;
    }
    if (bitsCounted>=KW9010_MESSAGELEN) // all bits received
    {
      if (crcValid(rxBits,crcBits)) fifoWrite(rxBits); // write valid value to FIFO buffer
      else fifoWrite(0);  // write 0 to FIFO buffer (0 = invalid value received)
      rxBits=0;
      crcBits=0;
      bitsCounted=0;
    }
  }
  else
  { // High values have no information with them
    rx433LineDown=micros(); // line went LOW after being HIGH
    HighVal=rx433LineDown - rx433LineUp; // calculate the HIGH pulse time
  }
}


#define FIFOSIZE 8  // Fifo Buffer size 8 can hold up to 7 items
volatile long fifoBuf[FIFOSIZE]; // ring buffer
volatile byte fifoReadIndex,fifoWriteIndex;  // read and write index into ring buffer

void fifoWrite(long item)
// write item into ring buffer
{
  fifoBuf[fifoWriteIndex]=item; // store the item
  if (!(fifoWriteIndex+1==fifoReadIndex || (fifoWriteIndex+1>=FIFOSIZE && fifoReadIndex==0)))
    fifoWriteIndex++;  // advance write pointer in ringbuffer
  if (fifoWriteIndex>=FIFOSIZE) fifoWriteIndex=0; // ring buffer is at its end
}


unsigned long fifoRead()
// always check first if item is available with fifoAvailable()
// before reading the ring buffer using this function
{
  unsigned long item;
  item=fifoBuf[fifoReadIndex];
  cli(); // Interrupts off while changing the read pointer for the ringbuffer
  fifoReadIndex++;
  if (fifoReadIndex>=FIFOSIZE) fifoReadIndex=0;
  sei(); // Interrupts on again
  return(item);


boolean fifoAvailable()
// item is available for reading if (fifoReadIndex!=fifoWriteIndex)
{
  return (fifoReadIndex!=fifoWriteIndex);
}

Gruß
Reinhard
4  International / Deutsch / Re: RFM12b und Arduno Mega 2560 wie? :( on: May 28, 2014, 03:12:53 pm
Hallo,
wenn du den Spannungsteiler nicht korrekt auf 3,3V einstellst, kann es sein, dass du den RFM12B zerstörst. Wenn du nur einen 15k auf GND hast und keinen 4,7k ist das nur ein PullDown und kein Spannungsteiler, und du gibst 5V auf die Eingänge des RFM12B. Funktionieren tut der, frag sich nur wie lange ....
5  International / Deutsch / Re: RFM12b und Arduno Mega 2560 wie? :( on: May 27, 2014, 04:59:48 pm
Quote
Aber anstelle der 10k+4.7K wiederstände habe ich 15k genommen (habe momentan keine 4.7k)
Was heißt das: anstelle des 4,7k hast du 15k genommen? Oder nur einen einzelnen 15k?
Ansonsten ist die Verschaltung der Signalleitungen korrekt.
IRQ hast du auch auf  PIN2 gelegt?
6  International / Deutsch / Re: Tutorial - Messdaten auf Webspace ablegen und grafisch darstellen on: May 25, 2014, 11:10:20 am
Hallo,
nach den fehlgeschlagenen Versuchen von Ingo und Scherheinz, habe ich den Code nochmal kontrolliert. Es fehlte eine Zeile. Im Blog habe ich es korrigiert. Die mittlere Zeile fehlte
Code:
$mysql_pw = "<hier MySQL Passwort eintragen>";
$connection = mysql_connect($mysql_host, $mysql_user, $mysql_pw) or die("Verbindung zur Datenbank fehlgeschlagen.");
mysql_select_db($mysql_db, $connection) or die("Datenbank konnte nicht ausgewaehlt werden.");

@jomelo
ist mir schon klar, dass es hier Nachholbedarf gibt. Mit dem Thema muss ich mich noch beschäftigen. Wird dann vielleicht der nächste Blogpost.

Gruß
Reinhard
7  International / Deutsch / Re: Tutorial - Messdaten auf Webspace ablegen und grafisch darstellen on: May 25, 2014, 10:30:02 am
Hallo Ingo,

nein, da muss nichts umgestellt werden. Die Daten werden beim Einlesen in die korrekte Form gebracht.
Hast du die Datenbankabfrage 1:1 übernommen?
Hast du du den dygraph-combined.js File auf den Webspace abgelegt?
Zugangsdaten zur Datenbank korrekt gesetzt?
Gibt es eine Fehlermeldung? Wird der Grafikbereich leer angezeigt?
Welcher Browser?

Es gibt eine Möglichkeit, den Fehler einzugrenzen. Wenn du im Firefox die Entwicklerwerkzeuge einschaltest, kannst du sehen, was an die dygraphs Funktion übergeben wird. Ich hänge mal einen Screenshot Ausschnitt an, wie das aussieht.
Du kannst mir auch den Link mal per pn senden, wenn der Webspace öffentlich zugänglich ist. Vielleicht sehe ich was.

Gruß
Reinhard
8  International / Deutsch / Re: Arduino über Raspberry PI steuern und programmieren on: May 25, 2014, 01:34:53 am
Hallo sschultewolter,

vielleicht ist es das, was du suchst, habe ich für mein Funksensor Netzwerk designt.
-> http://glaskugelsehen.wordpress.com/2014/05/01/raspberry-pi-empfangt-auf-868-mhz/
Levelshifter braucht es hier nicht, das das Board auf 3,3V läuft. Den Funkchip kannst du ja weglassen.
Programmieren kannst du dann auch über den ISP-Connector.
Die Programmierung des Arduino über den RasPi ist hier beschrieben. Du musst die Umstellung von avrdude für Auto-Reset beachten. In meinem Design liegt Autoreset auf GPIO4.
Ich würde allerdings die Programmierung nicht über die IDE sondern direkt über avrdude durchführen. Den hex-file erzeuge ich vorher auf einem anderen Rechner.

Gruß
Reinhard
9  International / Deutsch / Re: Tutorial - Messdaten auf Webspace ablegen und grafisch darstellen on: May 24, 2014, 04:29:28 pm
Hallo,

ich möchte euch nicht mehr länger auf die Grafik warten lassen ...
Hier ist der letzte Teil meines Tutorials zur Speicherung und grafischen Darstellung von Arduino Daten.
Ich hoffe ihr habt Verwendung für meine Anregungen. Über Feedback und Beispiele freue ich mich.

Viel Spass in der Umsetzung
Reinhard
10  International / Deutsch / Re: Tutorial - Messdaten auf Webspace ablegen und grafisch darstellen on: May 23, 2014, 05:45:26 pm
Hallo,

und schon geht's weiter mit dem 4. Teil meines Tutorials. In diesem Teil zeige ich, wie man eine MySQL Datenbank anlegt und wie man Messwerte vom Arduino über Ethernet (bzw über das Internet) in diese Datenbank schreibt.
Hier gehts zum Tutorial

In meiner Datenbank liegen z.Zt. schon über 20.000 Datensätze.
Die grafische Darstellung beschreibe ich dann im nächsten Teil des Tutorials.

Gruß
Reinhard
11  International / Deutsch / Re: linvor Bluetooth Name ändern ohne USB-to-RS232 convert on: May 23, 2014, 03:11:01 am
Na ja, da wird beschrieben wie es gemacht wird unter Verwendung eines USB-UART Wandlers. JulHa wollte ja gerade wissen, ob und wie es geht ohne eben diesen.

Vielleicht könnte man einen Arduino so programmieren, dass alle Ein- und Ausgaben über seriell auf eine SoftSerial Schnittstelle weitergeleitet werden. So würde sozusagen der Arduino zum USB-UART Wandler.
12  International / Deutsch / Re: attiny85 über ArduinoISP mit Atmel Studio Programmieren? on: May 22, 2014, 02:02:40 pm
Quote
Dann habe ich reset mit ground über ein 10nf verbunden
Sollte es nicht ein 10µF Kondensator sein (auf Polung achten) siehe http://arduino.cc/en/Tutorial/ArduinoISP
13  International / Deutsch / Re: Tutorial - Messdaten auf Webspace ablegen und grafisch darstellen on: May 15, 2014, 03:24:21 pm
Hallo,

ich war wieder fleißig und habe den dritten Teil meines Tutorials fertig gestellt.
In diesem Teil zeige ich euch, wie man nur mit einem Arduino mit Ethernetshield sehr einfach Daten auf einem Webspace ablegen kann.
Hier gehts zum Tutorial

Viel Spass beim Durcharbeiten und verlinkt an dieser Stelle mal eure Ergebnisse

Happy Arduino'ing
Reinhard


14  International / Deutsch / Tutorial - Messdaten auf Webspace ablegen und grafisch darstellen on: May 11, 2014, 01:17:13 pm
Hallo,
ich bin dabei ein Tutorial zu erstellen, wie man Messdaten vom Arduino über Ethernet auf einem Webspace ablegt und grafisch darstellt.
Die ersten beiden Teile des Tutorials sind online:
Teil 1 - Verbindung Arduino zum Webspace und Daten abrufen
Teil 2 - Anlage eines Webspaces bei einem kostenlosen Anbieter.
->  http://glaskugelsehen.wordpress.com/

Jeder Kommentar ist herzlich willkommen. Die weiteren Teile des Tutorial kommen dann bald.
Gruß und schönen Abend noch
Reinhard
15  International / Deutsch / Re: Autonome Stromversorgung mit LiPo und Solarzelle on: May 02, 2014, 05:12:30 pm
Hallo,
das Problem wird sein, dass die Spannung über der Solarzelle zusammenbricht, wenn der Li-Ion Lader Strom zieht. Wahrscheinlich muss du den Ladestrom einstellbar machen
Pages: [1] 2 3 ... 34