Quick Guide: Arduino Driver libraries

Atmel, PIC, VEX, Fischertechnik

Moderator: Moderatoren

Benutzeravatar
HaWe
Administrator
Administrator
Beiträge: 5404
Registriert: 11. Jan 2006 21:01
Wohnort: ein kleiner Planet in der Nähe von Beteigeuze

Re: Arduino Driver libraries (Baustelle): Displays, SD, I2C, UART,...

Beitragvon HaWe » 24. Feb 2016 15:23


DONATE / SPENDE:
Gefällt dir dieses Kompendium und möchtest du dafür einen kleinen Betrag über PAYPAL spenden ?
Dann klicke einfach auf diesen Link -
Ab einer Spende ab EUR 5,- kannst du auf Wunsch dieses Kompendium auch als kostenloses WORD.doc erhalten (per Email oder Download als .zip):

-> Ja, ich möchte etwas als Anerkennung spenden <-


Ein ganz herzliches Dankeschön! :prima:

Benutzeravatar
HaWe
Administrator
Administrator
Beiträge: 5404
Registriert: 11. Jan 2006 21:01
Wohnort: ein kleiner Planet in der Nähe von Beteigeuze

Re: Arduino Driver libraries (Baustelle): Displays, SD, I2C, UART,...

Beitragvon HaWe » 24. Feb 2016 15:23

Keypad 4x5

keypad4x5.jpeg


Preis: ca. 2-3 EUR (Ebay)

Lib: Keypad
http://playground.arduino.cc/Code/Keypad#Download
http://playground.arduino.cc/uploads/Code/keypad.zip

Test-Sketch:
(Achtung! Reihen / Spalten hier bei diesem Verkabelungsplan zu diesem Modell vertauscht (quasi um 90° verdreht) !
Vorteil: die Kabel-Litzen können in derselben Reihenfolge angeklemmt werden, wie sie herausgeführt werden )

Code: Alles auswählen

#include <Keypad.h>

const byte ROWS = 4; //four rows
const byte COLS = 5; //five columns
char keys[ROWS][COLS] = {
  {'L','7','4','1','F' },  // L=Left, F=F1
  {'0','8','5','2','G' },  // G=F2
  {'R','9','6','3','#'},   // R=Right
  {'E','X','D','U','*'}    // E=Enter, X=ESC, D=Down, U=Up,

};
byte rowPins[ROWS] = {22, 24, 26, 28}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {30, 32, 34, 36, 38}; //connect to the column pinouts of the keypad

Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

void setup(){
  Serial.begin(115200);
}

void loop(){
  char key = keypad.getKey();

  if (key != NO_KEY){
    Serial.println(key);
  }
}

Benutzeravatar
HaWe
Administrator
Administrator
Beiträge: 5404
Registriert: 11. Jan 2006 21:01
Wohnort: ein kleiner Planet in der Nähe von Beteigeuze

Re: Arduino Driver libraries (Baustelle): Displays, SD, I2C, UART,...

Beitragvon HaWe » 24. Feb 2016 15:28

Platzhalter

Benutzeravatar
HaWe
Administrator
Administrator
Beiträge: 5404
Registriert: 11. Jan 2006 21:01
Wohnort: ein kleiner Planet in der Nähe von Beteigeuze

Re: Arduino Driver libraries (Baustelle): Displays, SD, I2C, UART,...

Beitragvon HaWe » 24. Feb 2016 15:52

( I2C ) RGB-Farbsensor
TCS230 / TCS3200


Bild

Arbeits-/Signalspannung: 3-5 V DC

Preis: ca. 7-10 EUR

Bezugsquellen z.B.:
https://www.google.de/search?q=RGB-Sensor+%22TCS3200%22+&ie=utf-8&oe=utf-8&gfe_rd=cr&ei=vDRgWJfZE-Sv8wfOwIPIAg#q=RGB-Sensor+%22TCS3200%22&tbm=shop
http://www.ebay.de/sch/i.html?_odkw=TCS3200+(Farb%2C+Color%2C+Sensor)&_osacat=0&_nkw=TCS3200+(Farb%2C+Color%2C+Sensor)


Infos + Tutorials:
https://www.sunfounder.com/wiki/index.php?title=Color_Sensor_Module
http://howtomechatronics.com/tutorials/arduino/arduino-color-sensing-tutorial-tcs230-tcs3200-color-sensor/
https://www.dfrobot.com/wiki/index.php/TCS3200_Color_Sensor_(SKU:SEN0101)
https://arduinoplusplus.wordpress.com/2015/07/15/tcs230tcs3200-sensor-calibration/



Bild

Code: Alles auswählen

    /*     Arduino Color Sensing Tutorial
     *     
     *  by Dejan Nedelkovski, www.HowToMechatronics.com
     * 
     */
     
    #define S0 4
    #define S1 5
    #define S2 6
    #define S3 7
    #define sensorOut 8
    int frequency = 0;
    void setup() {
      pinMode(S0, OUTPUT);
      pinMode(S1, OUTPUT);
      pinMode(S2, OUTPUT);
      pinMode(S3, OUTPUT);
      pinMode(sensorOut, INPUT);
     
      // Setting frequency-scaling to 20%
      digitalWrite(S0,HIGH);
      digitalWrite(S1,LOW);
     
      Serial.begin(9600);
    }
    void loop() {
      // Setting red filtered photodiodes to be read
      digitalWrite(S2,LOW);
      digitalWrite(S3,LOW);
      // Reading the output frequency
      frequency = pulseIn(sensorOut, LOW);
      // Printing the value on the serial monitor
      Serial.print("R= ");//printing name
      Serial.print(frequency);//printing RED color frequency
      Serial.print("  ");
      delay(100);
      // Setting Green filtered photodiodes to be read
      digitalWrite(S2,HIGH);
      digitalWrite(S3,HIGH);
      // Reading the output frequency
      frequency = pulseIn(sensorOut, LOW);
      // Printing the value on the serial monitor
      Serial.print("G= ");//printing name
      Serial.print(frequency);//printing RED color frequency
      Serial.print("  ");
      delay(100);
      // Setting Blue filtered photodiodes to be read
      digitalWrite(S2,LOW);
      digitalWrite(S3,HIGH);
      // Reading the output frequency
      frequency = pulseIn(sensorOut, LOW);
      // Printing the value on the serial monitor
      Serial.print("B= ");//printing name
      Serial.print(frequency);//printing RED color frequency
      Serial.println("  ");
      delay(100);
    }

Benutzeravatar
HaWe
Administrator
Administrator
Beiträge: 5404
Registriert: 11. Jan 2006 21:01
Wohnort: ein kleiner Planet in der Nähe von Beteigeuze

Re: Arduino Driver libraries (Baustelle): Displays, SD, I2C, UART,...

Beitragvon HaWe » 24. Feb 2016 15:52

( I2C ) RGB-Farbsensor
Adafruit TCS34725


Bild

Hersteller: Adafruit
https://www.adafruit.com/product/1334

Interface: i2c

Arbeits-/Signalspannung: 3-5 V DC

Preis:: Original Adafruit ca. 10 EUR, China-Klone ab ca. 4 EUR

Tutorial: https://learn.adafruit.com/adafruit-col ... s/overview

Arduino Library: https://github.com/adafruit/Adafruit_TCS34725

Benutzeravatar
HaWe
Administrator
Administrator
Beiträge: 5404
Registriert: 11. Jan 2006 21:01
Wohnort: ein kleiner Planet in der Nähe von Beteigeuze

Re: Arduino Driver libraries (Baustelle): Displays, SD, I2C, UART,...

Beitragvon HaWe » 24. Feb 2016 15:52

Platzhalter

Benutzeravatar
HaWe
Administrator
Administrator
Beiträge: 5404
Registriert: 11. Jan 2006 21:01
Wohnort: ein kleiner Planet in der Nähe von Beteigeuze

Re: Arduino Driver libraries (Baustelle): Displays, SD, I2C, UART,...

Beitragvon HaWe » 3. Mai 2016 20:41


DONATE / SPENDE:
Gefällt dir dieses Kompendium und möchtest du dafür einen kleinen Betrag über PAYPAL spenden ?
Dann klicke einfach auf diesen Link -
Ab einer Spende ab EUR 5,- kannst du auf Wunsch dieses Kompendium auch als kostenloses WORD.doc erhalten (per Email oder Download als .zip):

-> Ja, ich möchte etwas als Anerkennung spenden <-


Ein ganz herzliches Dankeschön! :prima:

Benutzeravatar
HaWe
Administrator
Administrator
Beiträge: 5404
Registriert: 11. Jan 2006 21:01
Wohnort: ein kleiner Planet in der Nähe von Beteigeuze

Re: Arduino Driver libraries (Baustelle): Displays, SD, I2C, UART,...

Beitragvon HaWe » 3. Mai 2016 20:41

Ultraschall Sensoren
HC-SR04


Achtung:
VCC: +5V DC
!


Bild

Lit.:
http://www.mikrocontroller-elektronik.d ... r-hc-sr04/
http://randomnerdtutorials.com/complete ... r-hc-sr04/
http://arduinobasics.blogspot.de/2012/1 ... ensor.html
http://playground.arduino.cc/Code/NewPing
http://www.robodino.de/2011/12/ultrasch ... -sr04.html

Bild

http://randomnerdtutorials.com/complete ... r-hc-sr04/

Code: Alles auswählen



/*
 * created by Rui Santos, http://randomnerdtutorials.com
 *
 * Complete Guide for Ultrasonic Sensor HC-SR04
 *
    Ultrasonic sensor Pins:
        VCC: +5VDC
        Trig : Trigger (INPUT) - Pin11
        Echo: Echo (OUTPUT) - Pin 12
        GND: GND
 */
 
int trigPin = 11;    //Trig - green Jumper
int echoPin = 12;    //Echo - yellow Jumper
long duration, cm, inches;
 
void setup() {
  //Serial Port begin
  Serial.begin (9600);
  //Define inputs and outputs
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
}
 
void loop()
{
 
 
  // The sensor is triggered by a HIGH pulse of 10 or more microseconds.
  // Give a short LOW pulse beforehand to ensure a clean HIGH pulse:
  digitalWrite(trigPin, LOW);
  delayMicroseconds(5);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
 
  // Read the signal from the sensor: a HIGH pulse whose
  // duration is the time (in microseconds) from the sending
  // of the ping to the reception of its echo off of an object.
  pinMode(echoPin, INPUT);
  duration = pulseIn(echoPin, HIGH);
 
  // convert the time into a distance
  cm = (duration/2) / 29.1;
  inches = (duration/2) / 74;
 
  Serial.print(inches);
  Serial.print("in, ");
  Serial.print(cm);
  Serial.print("cm");
  Serial.println();
 
  delay(250);
}



Benutzeravatar
HaWe
Administrator
Administrator
Beiträge: 5404
Registriert: 11. Jan 2006 21:01
Wohnort: ein kleiner Planet in der Nähe von Beteigeuze

Re: Arduino Driver libraries (Baustelle): Displays, SD, I2C, UART,...

Beitragvon HaWe » 3. Mai 2016 20:41

Ultraschall Sensoren
Devantech SRF-02 und SRF-08 ( i2c )


Bild
Bild

Interface: I2C

Bezugsquellen:

z.B.:
http://www.exp-tech.de/srf02-ultrasonic-ranger
http://www.exp-tech.de/srf08-high-perfo ... ger-finder

Source Codes und Treiber :

http://playground.arduino.cc/Main/SonarSrf08
https://github.com/LeoColomb/Arduino-SRF

SRF02 : http://www.robot-electronics.co.uk/htm/srf02tech.htm
SRF08 : http://www.robot-electronics.co.uk/htm/srf08tech.html

Link zu Arduino sources: http://www.robot-electronics.co.uk/htm/ ... amples.htm
Link zu Raspberry Pi sources: http://www.robot-electronics.co.uk/htm/ ... amples.htm

Beispiel für SRF-08 mit der oben verlinkten github-Lib:

Code: Alles auswählen

//
// SonarSRF08
// Arduino Library for controlling SRF sonar sensors
// http://www.arduino.cc/playground/Main/SonarSrf08
//
// MIT License
// Copyright(c) 2009 Zach Foresta
// Copyright(c) 2012 Philipp A. Mohrenweiser
// Copyright(c) 2012-2016 Leo Colombaro
//

#include <Wire.h>
#include <SonarSRF08.h>

#define MAIN_08_ADDRESS (0xF8 >> 1)

// Setup Analogue Gain
// http://www.robot-electronics.co.uk/htm/srf08tech.html section "Analogue Gain"
#define GAIN_REGISTER 0x09
// Setup Range Location
// http://www.robot-electronics.co.uk/htm/srf08tech.html section "Changing the Range"
#define LOCATION_REGISTER 0x8C

SonarSRF08 MainSonar(MAIN_08_ADDRESS, GAIN_REGISTER, LOCATION_REGISTER);

char unit = 'c'; // 'i' for inches, 'c' for centimeters, 'm' for micro-seconds

void setup()
{
  Serial.begin(9600);

  MainSonar.begin();
  isConnected("SRF08", MainSonar.readVersion());
}

void loop()
{
  distance("SRF08", MainSonar.readRange(unit));
}

// Print out distance
void distance(String reference, int sensorReading)
{
  Serial.print("Distance from " + reference + ": ");
  Serial.print(sensorReading);
  Serial.println(unit);
}

// Print out distance
void isConnected(String reference, int sensorSoft)
{
  if (sensorSoft >= 0)
  {
    Serial.print("Sensor " + reference + " connected (");
    Serial.print(sensorSoft);
    Serial.println(")");
  }
  else
  {
    Serial.println("Sensor " + reference + " not detected...");
  }
}

Benutzeravatar
HaWe
Administrator
Administrator
Beiträge: 5404
Registriert: 11. Jan 2006 21:01
Wohnort: ein kleiner Planet in der Nähe von Beteigeuze

Re: Arduino Driver libraries (Baustelle): Displays, SD, I2C, UART,...

Beitragvon HaWe » 3. Mai 2016 20:42

Platzhalter

Benutzeravatar
HaWe
Administrator
Administrator
Beiträge: 5404
Registriert: 11. Jan 2006 21:01
Wohnort: ein kleiner Planet in der Nähe von Beteigeuze

Re: Arduino Driver libraries (Baustelle): Displays, SD, I2C, UART,...

Beitragvon HaWe » 3. Mai 2016 20:43

(I²C + UART) IMU-Sensor: CMPS11

CMPS11-connections.png


Protokoll: I2C, alternativ auch UART
Spannung/Level: 3-5 V kompatibel
Preis: ca. 25 - 30 EUR

Bezugsquellen z.B.:
Roboter-Teile Jörg Pohl, http://www.roboter-teile.de
http://de.manu-systems.com/CMPS11.shtml
http://www.hobbytronics.co.uk/cmps11-tilt-compass
http://www.roboter-teile.de/Oxid/Navigation/Kompassmodul-CMPS11.html

Treiber-Library:
Arduino-I2C-lib: einbinden per #include <Wire.h>
bzw Serial() für UART (standardmäßig bereits immer eingebunden)
Example: http://www.robot-electronics.co.uk/file ... 11_i2c.ino

Datenblatt:
http://www.robot-electronics.co.uk/htm/cmps11i2c.htm

Besonderheiten:
IMU Sensor mit 3D-Gyro, 3D-Kompass, 3D-Accelerometer, Temperatur-kompensiert
Integrierte Sensor-Fusion per eingebautem Kalman-Filter
Ausgabe des gefilterten Kurses oder auch aller einzelnen Sensor-raw-Daten
einfaches Auslesen von I2C-Registern für Kurs (Kompasskurs, heading), Neigung (pitch) und Schräglage (roll).
Keine komplizierten Umrechnungen mehr nötig!

Beispiel-Sketch für CMPS10 und CMPS11, Ausgabe auf UTFT-Display:

Code: Alles auswählen

/******************************************************************
*                   Arduino CMPS11 example code                   *
*                     CMPS11 running I2C mode                     *
*                     by James Henderson, 2012                    *
*******************************************************************/
// verändert & angepasst für UTFT-Displays von Helmut Wunder, 2015
// (C) CMPS10/CMPS11 code by James Henderson
// (C) UTFT Display Driver Lib by Henning Karlsen
// keine freie Verwendung für kommerzielle Zwecke,
// Code frei zur privaten Nutzung gemäss
// Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License
// http://creativecommons.org/licenses/by-nc-sa/3.0/
// Urheberrechte von  J. Henderson und H. Karlsen bleiben unberührt


#include <UTFT.h>
#include <Wire.h>
#define  ADDR_CMPS11  0x60                                // Defines address of CMPS11




//=====================================================================================
// TFT LCD
//=====================================================================================
#define  UTFT_CSpin    52    // <<<<<<<< adjust!

// set LCD TFT type
int16_t  LCDTYPE   =   -1;
#define  __UTFT__       4  // Henning Karlsen UTFT 2.2-2.4" 220x176 - 320x240 lib
                           // http://henningkarlsen.com/electronics/library.php?id=51

//--------------------------------------------------------------------------------------------------
//UTFT   myGLCD(Model, SDA=MOSI, SCL, CS,         RESET,  RS)    // Due: 3 exposed SS pins: 4,10,52
  UTFT   myGLCD(QD220A,   50,    49,  UTFT_CSpin,  0,     51);   // A0->Vc (LED), A4->BoardReset
extern   uint8_t SmallFont[];
//--------------------------------------------------------------------------------------------------
int16_t  fontwi= 8,  fonthi=10;

int16_t  _curx_, _cury_;                    // last x,y cursor pos on TFT screen

void lcdcls()  {                                                         
   if(LCDTYPE==__UTFT__) { myGLCD.clrScr();  _curx_ =0;  _cury_ =0; }                           
}

void lcdprintxy(int16_t x, int16_t y, char * str) {
   if(LCDTYPE==__UTFT__) { myGLCD.print(str,x,y); _curx_=x+strlen(str)*fontwi; _cury_=y; }
}



//=====================================================================================

void setup() {
   char sbuf[128];
   Serial.begin(115200);
   Wire.begin();                                      // Conects I2C   
   
   // TFT LCD
   Serial.println();
   LCDTYPE = __UTFT__ ;                               // set LCD-Type
   
   Serial.println("init LCD...");   
   myGLCD.InitLCD();   
   myGLCD.setFont(SmallFont);
   lcdcls();
     
   sprintf(sbuf, "CMPS11 Example V: %d", soft_ver()); // Display software version of the CMPS11
   lcdprintxy( 0, 0, sbuf);   

}


//=====================================================================================

int soft_ver(){
   int data;                                      // Software version of  CMPS11 is read into data and then returned
 
   Wire.beginTransmission(ADDR_CMPS11);
   // Values of 0 being sent with write masked as a byte to be not misinterpreted as NULL
   // (bug in arduino 1.0)
   Wire.write((byte)0);                           // Sends the register we wish to start reading from
   Wire.endTransmission();

   Wire.requestFrom(ADDR_CMPS11, 1);              // Request byte from CMPS11
   while(Wire.available() < 1);
   data = Wire.read();         
 
   return(data);
}


//=====================================================================================
void display_data(float b,  int p, int r){    // pitch and roll (p, r) are recieved as ints (signed values)
  char sbuf[128];         
 
  sprintf(sbuf, "heading =  %6.2f", b);
  lcdprintxy( 0,20, sbuf);

  sprintf(sbuf, "Pitch = %6d", p);
  lcdprintxy( 0,30, sbuf);

  sprintf(sbuf, "Roll  = %6d", r);
  lcdprintxy( 0,40, sbuf);
 
}


//=====================================================================================

void loop(){
   uint8_t  HdgHibyte, HdgLobyte;           // HdgHibyte and HdgLobyte store high and low bytes of the heading
   int8_t   pitch, roll;                    // Stores pitch and roll values of CMPS11 (signed char value)
 
   float    fheading;                       // Stores full heading (float)
   char     sbuf[128];
 
   Wire.beginTransmission(ADDR_CMPS11);     //starts communication with CMPS11
   Wire.write(2);                           //Sends the register we wish to start reading from
   Wire.endTransmission();

   Wire.requestFrom(ADDR_CMPS11, 4);        // Request 4 bytes from CMPS11
   while(Wire.available() < 4);             // Wait for bytes to become available
   HdgHibyte = Wire.read();         
   HdgLobyte = Wire.read();           
   pitch = Wire.read();             
   roll = Wire.read();             

   fheading = ( (float)(HdgHibyte<<8) + (float)HdgLobyte )/10.0;  // heading (float)
 
   display_data(fheading, pitch, roll);     // Display data to the LCD
 
   delay(10);   

}
//=====================================================================================
//=====================================================================================


Regster-Belegung:

Code: Alles auswählen

Register     Function
0       Command register (write) / Software version (read)
1       Compass Bearing 8 bit, i.e. 0-255 for a full circle
2,3     Compass Bearing 16 bit, i.e. 0-3599, representing 0-359.9 degrees. register 2 being the high byte
4       Pitch angle - signed byte giving angle in degrees from the horizontal plane, Kalman filtered with Gyro
5       Roll angle - signed byte giving angle in degrees from the horizontal plane, Kalman filtered with Gyro
6,7     Magnetometer X axis raw output, 16 bit signed integer with register 6 being the upper 8 bits
8,9     Magnetometer Y axis raw output, 16 bit signed integer with register 8 being the upper 8 bits
10,11   Magnetometer Z axis raw output, 16 bit signed integer with register 10 being the upper 8 bits
12,13   Accelerometer  X axis raw output, 16 bit signed integer with register 12 being the upper 8 bits
14,15   Accelerometer  Y axis raw output, 16 bit signed integer with register 14 being the upper 8 bits
16,17   Accelerometer  Z axis raw output, 16 bit signed integer with register 16 being the upper 8 bits
18,19   Gyro X axis raw output, 16 bit signed integer with register 18 being the upper 8 bits
20,21   Gyro  Y axis raw output, 16 bit signed integer with register 20 being the upper 8 bits
22,23   Gyro Z axis raw output, 16 bit signed integer with register 22 being the upper 8 bits
24,25   Temperature raw output, 16 bit signed integer with register 24 being the upper 8 bits
26      Pitch angle - signed byte giving angle in degrees from the horizontal plane (no Kalman filter)
27      Roll angle - signed byte giving angle in degrees from the horizontal plane (no Kalman filter)
Gruß,
HaWe
±·≠≈²³αβγδε∂ζλμνπξφωΔΦ≡ΠΣΨΩ∫√∀∃∈∉∧∨¬⊂⊄∩∪∅∞®
NXT NXC SCHACHROBOTER: https://www.youtube.com/watch?v=Cv-yzuebC7E

Benutzeravatar
HaWe
Administrator
Administrator
Beiträge: 5404
Registriert: 11. Jan 2006 21:01
Wohnort: ein kleiner Planet in der Nähe von Beteigeuze

Re: Arduino Driver libraries (Baustelle): Displays, SD, I2C, UART,...

Beitragvon HaWe » 3. Mai 2016 20:50

(I2C) MCP9808 Temperatur-Sensor

Bild

Lit.:
https://learn.adafruit.com/adafruit-mcp ... ide/wiring
https://github.com/adafruit/Adafruit_MCP9808_Library

Test Code von Adafruit:

/**************************************************************************/
/*!
This is a demo for the Adafruit MCP9808 breakout
----> http://www.adafruit.com/products/1782
Adafruit invests time and resources providing this open source code,
please support Adafruit and open-source hardware by purchasing
products from Adafruit!
*/
/**************************************************************************/

#include <Wire.h>
#include "Adafruit_MCP9808.h"

// Create the MCP9808 temperature sensor object
Adafruit_MCP9808 tempsensor = Adafruit_MCP9808();

void setup() {
Serial.begin(9600);
Serial.println("MCP9808 demo");

// Make sure the sensor is found, you can also pass in a different I2C
// address with tempsensor.begin(0x19) for example
if (!tempsensor.begin()) {
Serial.println("Couldn't find MCP9808!");
while (1);
}
}

void loop() {
//Serial.println("wake up MCP9808.... "); // wake up MSP9808 - power consumption ~200 mikro Ampere
//tempsensor.wake(); // wake up, ready to read!

// Read and print out the temperature, then convert to *F
float c = tempsensor.readTempC();
float f = c * 9.0 / 5.0 + 32;
Serial.print("Temp: "); Serial.print(c); Serial.print("*C\t");
Serial.print(f); Serial.println("*F");

//Serial.println("Shutdown MCP9808.... ");
//tempsensor.shutdown(); // shutdown MSP9808 - power consumption ~0.1 mikro Ampere

delay(1000);
}

Benutzeravatar
HaWe
Administrator
Administrator
Beiträge: 5404
Registriert: 11. Jan 2006 21:01
Wohnort: ein kleiner Planet in der Nähe von Beteigeuze

Re: Arduino Driver libraries (Baustelle): Displays, SD, I2C, UART,...

Beitragvon HaWe » 3. Mai 2016 20:50

(I²C) Real Time Clock RTC DS3231

RTC ds3231-real-time-clock.jpg


Quelle: http://tronixstuff.com/2014/12/01/tutorial-using-ds1307-and-ds3231-real-time-clock-modules-with-arduino/

Protokoll: I2C
Spannung/Level: 3-5 V kompatibel
Preis: ca. 1,00 - 4,00 EUR


Treiber-Library:
Arduino-I2C-lib: ausschließlich <Wire.h> (standardmäßig in Arduino-Sketch enthalten)
Beispielsketch s.u.! (aus http://tronixstuff.com/2014/12/01/tutor ... h-arduino/ )

Bezugsquellen z.B.:
div. chinesische Anbieter (Ebay), Eckstein u.a.m.

Besonderheiten:
Beim 1. Aufruf muss die Zeit aktuell gesetzt werden (s. im Code, in Setup():

Code: Alles auswählen

 setDS3231time(0,42,20,2,13,07,15);  // Montag, 20:42:00 Uhr 13.07.15

bei den folgenden Aufrufen bleibt die Startzeit im EEPROM Batterie-gepufert gespeichert und braucht dann natürlich nicht mehr neu gesetzt werden
(Zeile wieder auskommentieren und dann ein 2. Mal hochladen!)

Beispiel-Sketch zum Initialisieren und Auslesen, Ausgabe über USB-Serial():

Code: Alles auswählen

#include "Wire.h"
#define ADDR_RTCDS3231 0x68

//=====================================================================================
// Convert normal decimal numbers to binary coded decimal
//=====================================================================================
byte decToBcd(byte val) {  return( (val/10*16) + (val%10) );  }


//=====================================================================================
// Convert binary coded decimal to normal decimal numbers
//=====================================================================================
byte bcdToDec(byte val)  {  return( (val/16*10) + (val%16) ); }


//=====================================================================================

void displayTime()
{
  byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
  // retrieve data from DS3231
  readDS3231time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month,
  &year);
  // send it to the serial monitor
  Serial.print(hour, DEC);
  // convert the byte variable to a decimal number when displayed
  Serial.print(":");
  if (minute<10)
  {
    Serial.print("0");
  }
  Serial.print(minute, DEC);
  Serial.print(":");
  if (second<10)
  {
    Serial.print("0");
  }
  Serial.print(second, DEC);
  Serial.print(" ");
  Serial.print(dayOfMonth, DEC);
  Serial.print("/");
  Serial.print(month, DEC);
  Serial.print("/");
  Serial.print(year, DEC);
  Serial.print(" Day of week: ");
  switch(dayOfWeek){
  case 1:
    Serial.println("Sunday");
    break;
  case 2:
    Serial.println("Monday");
    break;
  case 3:
    Serial.println("Tuesday");
    break;
  case 4:
    Serial.println("Wednesday");
    break;
  case 5:
    Serial.println("Thursday");
    break;
  case 6:
    Serial.println("Friday");
    break;
  case 7:
    Serial.println("Saturday");
    break;
  }
}



//=====================================================================================
//=====================================================================================
void setup()
{
  Wire.begin();
  Serial.begin(115200);
  // set the initial time here:
  // DS3231 seconds, minutes, hours, day, date, month, year
  // setDS3231time(0,42,20,  2,  13,07,15);  // (2 == )Montag, 20:42:00 Uhr 13.07.15
}

//=====================================================================================

void setDS3231time(byte second, byte minute, byte hour, byte dayOfWeek, byte
dayOfMonth, byte month, byte year)
{
  // sets time and date data to DS3231
  Wire.beginTransmission(ADDR_RTCDS3231);
  Wire.write(0); // set next input to start at the seconds register
  Wire.write(decToBcd(second)); // set seconds
  Wire.write(decToBcd(minute)); // set minutes
  Wire.write(decToBcd(hour)); // set hours
  Wire.write(decToBcd(dayOfWeek)); // set day of week (1=Sunday, 7=Saturday)
  Wire.write(decToBcd(dayOfMonth)); // set date (1 to 31)
  Wire.write(decToBcd(month)); // set month
  Wire.write(decToBcd(year)); // set year (0 to 99)
  Wire.endTransmission();
}

//=====================================================================================

void readDS3231time(byte *second,byte *minute,byte *hour,byte *dayOfWeek,byte *dayOfMonth,byte *month,byte *year)
{
  Wire.beginTransmission(ADDR_RTCDS3231);
  Wire.write(0); // set DS3231 register pointer to 00h
  Wire.endTransmission();
  Wire.requestFrom(ADDR_RTCDS3231, 7);
  // request seven bytes of data from DS3231 starting from register 00h
  *second = bcdToDec(Wire.read() & 0x7f);
  *minute = bcdToDec(Wire.read());
  *hour = bcdToDec(Wire.read() & 0x3f);
  *dayOfWeek = bcdToDec(Wire.read());
  *dayOfMonth = bcdToDec(Wire.read());
  *month = bcdToDec(Wire.read());
  *year = bcdToDec(Wire.read());
}


//=====================================================================================

void loop()
{
  displayTime(); // display the real-time clock data on the Serial Monitor,
  delay(1000); // every second
}

//=====================================================================================
//=====================================================================================
Gruß,
HaWe
±·≠≈²³αβγδε∂ζλμνπξφωΔΦ≡ΠΣΨΩ∫√∀∃∈∉∧∨¬⊂⊄∩∪∅∞®
NXT NXC SCHACHROBOTER: https://www.youtube.com/watch?v=Cv-yzuebC7E

Benutzeravatar
HaWe
Administrator
Administrator
Beiträge: 5404
Registriert: 11. Jan 2006 21:01
Wohnort: ein kleiner Planet in der Nähe von Beteigeuze

Re: Arduino Driver libraries (Baustelle): Displays, SD, I2C, UART,...

Beitragvon HaWe » 3. Mai 2016 20:53

Real Time Clock RTC DS3231 mit Anzeige auf LCD1602 Display

RTC-DS3231_LED1602.jpg


hier ein Codebeispiel für alle, die sich mit der RTC und dem LCD1602 schwer tun (so wie ich bis jetzt)
(s.a. viewtopic.php?f=78&t=8491&p=66090#p69998 ) :

Uhrzeit und Datum per RTC DS3231
Anzeige auf LCD1602

MCU: Arduino Mega,
Hinweis: besonderer LCD Verkabelungsplan (hält Pins 0-13 und SPI pins frei!) !


share and enjoy!


Code: Alles auswählen

/*
Display LiquidCrystal Library
plus
real-time clock RTC-DS3231

Demonstrates the use a 16x2 LCD 1602
to display the values of a real-time clock RTC-DS3231
 
  The circuit:
 
 * LCD pin  1 (VSS) to +5V
 * LCD pin  2 (VDD) to GND
 * LCD pin  3 (V0) to 2.2k to GND
 * LCD pin  4 (RS) to Dpin 22
 * LCD pin  5 (R/W) to GND
 * LCD pin  6 (E)  to Dpin 23
 * LCD pin  7 (D0) to N/A
 * LCD pin  8 (D1) to N/A
 * LCD pin  9 (D2) to N/A
 * LCD pin 10 (D3) to N/A
 * LCD pin 11 (D4) to Dpin 24
 * LCD pin 12 (D5) to Dpin 25
 * LCD pin 13 (D6) to Dpin 26
 * LCD pin 14 (D7) to Dpin 27
 * LCD pin 15 (A) to +5V (or via 2.2...10k)
 * LCD pin 16 (K) to GND
 
 This example code is in the public domain.

//     http://www.arduino.cc/en/Tutorial/LiquidCrystal      //


 */

#include <LiquidCrystal.h>
#include "Wire.h"
#define ADDR_RTCDS3231 0x68

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(22, 23, 24, 25, 26, 27);



//=====================================================================================
// Convert normal decimal numbers to binary coded decimal
//=====================================================================================
byte decToBcd(byte val) {  return( (val/10*16) + (val%10) );  }


//=====================================================================================
// Convert binary coded decimal to normal decimal numbers
//=====================================================================================
byte bcdToDec(byte val)  {  return( (val/16*10) + (val%16) ); }

//=====================================================================================

char sdofweek[8][10] = {"         ","Monday  ","Tuesday  ","Wednesday","Thursday ","Friday  ","Saturday ","Sunday   "};

void displayTime()
{
  byte second, minute, hour, ndofweek, dday, dmonth, dyear;
  char sbuf[50];
 
  // retrieve data from DS3231
  readDS3231time(&second, &minute, &hour, &ndofweek, &dday, &dmonth,
  &dyear);
  // send it to the serial monitor
 
  sprintf(sbuf, "%02d:%02d:%02d   %02d/%02d ",hour, minute, second, dday, dmonth );
  Serial.print(sbuf);
  lcd.setCursor(0, 0);
  lcd.print(sbuf);
 
  sprintf(sbuf, "20%02d, %s", dyear, sdofweek[ndofweek]);
  Serial.print(sbuf);
  Serial.println();
  lcd.setCursor(0, 1);
  lcd.print(sbuf); 
}

//=====================================================================================
//=====================================================================================


void setDS3231time(byte second, byte minute, byte hour, byte ndofweek, byte
dday, byte dmonth, byte dyear)
{
  // sets time and date data to DS3231
  Wire.beginTransmission(ADDR_RTCDS3231);
  Wire.write(0); // set next input to start at the seconds register
  Wire.write(decToBcd(second)); // set seconds
  Wire.write(decToBcd(minute)); // set minutes
  Wire.write(decToBcd(hour)); // set hours
  Wire.write(decToBcd(ndofweek)); // set day of week (1=Sunday, 7=Saturday)
  Wire.write(decToBcd(dday)); // set date (1 to 31)
  Wire.write(decToBcd(dmonth)); // set dmonth
  Wire.write(decToBcd(dyear)); // set dyear (0 to 99)
  Wire.endTransmission();
}

//=====================================================================================

void readDS3231time(byte *second,
     byte *minute,
     byte *hour,
     byte *ndofweek,
     byte *dday,
     byte *dmonth,
     byte *dyear)
{
  Wire.beginTransmission(ADDR_RTCDS3231);
  Wire.write(0); // set DS3231 register pointer to 00h
  Wire.endTransmission();
  Wire.requestFrom(ADDR_RTCDS3231, 7);
  // request seven bytes of data from DS3231 starting from register 00h
  *second = bcdToDec(Wire.read() & 0x7f);
  *minute = bcdToDec(Wire.read());
  *hour = bcdToDec(Wire.read() & 0x3f);
  *ndofweek = bcdToDec(Wire.read());
  *dday = bcdToDec(Wire.read());
  *dmonth = bcdToDec(Wire.read());
  *dyear = bcdToDec(Wire.read());
}


//=====================================================================================
//=====================================================================================


void setup() {
  // start USB serial
  Serial.begin(115200);
   
  // set up the LCD's number of columns and rows:
  lcd.begin(16, 2);  // init LCD 1602
 
  // start I2C
  Wire.begin();
 
  // set the initial time here ONCE: <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< !!!
  // DS3231 seconds, minutes, hours, day, date, dmonth, dyear
  // setDS3231time(00,00,20, 3,  22,07,15);  // (3 == )Mittwoch, 20:00:00 Uhr 22.07.15
}

//=====================================================================================

void loop() {
  displayTime(); // display the real-time clock data on Monitor + LCD,
  delay(1000);   // every second
}

//=====================================================================================
//=====================================================================================




Benutzeravatar
HaWe
Administrator
Administrator
Beiträge: 5404
Registriert: 11. Jan 2006 21:01
Wohnort: ein kleiner Planet in der Nähe von Beteigeuze

Re: Arduino Driver libraries (Baustelle): Displays, SD, I2C, UART,...

Beitragvon HaWe » 3. Mai 2016 20:55


DONATE / SPENDE:
Gefällt dir dieses Kompendium und möchtest du dafür einen kleinen Betrag über PAYPAL spenden ?
Dann klicke einfach auf diesen Link -
Ab einer Spende ab EUR 5,- kannst du auf Wunsch dieses Kompendium auch als kostenloses WORD.doc erhalten (per Email oder Download als .zip):

-> Ja, ich möchte etwas als Anerkennung spenden <-


Ein ganz herzliches Dankeschön! :prima:


Zurück zu „allgemeine / Nicht-Lego-Robotik und Elektronik“

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 7 Gäste

Lego Mindstorms EV3, NXT und RCX Forum : Haftungsauschluss