From be7b2568a0c37564359340c212d14c9f3df9f340 Mon Sep 17 00:00:00 2001 From: "Zechert, Frank (EXTERN: Capgemini)" Date: Wed, 9 Dec 2020 04:34:38 +0100 Subject: [PATCH] added hardware specifications --- hardware/meeting-clock.fzz | Bin 0 -> 50552 bytes hardware/tests/BT_Serial/BT_Serial.ino | 91 +++ .../tests/MD_MAX72xx_Test/MD_MAX72xx_Test.ino | 625 ++++++++++++++++++ hardware/tests/dht22/dht22.ino | 40 ++ hardware/tests/rtc_ds3231/rtc_ds3231.ino | 86 +++ 5 files changed, 842 insertions(+) create mode 100644 hardware/meeting-clock.fzz create mode 100644 hardware/tests/BT_Serial/BT_Serial.ino create mode 100644 hardware/tests/MD_MAX72xx_Test/MD_MAX72xx_Test.ino create mode 100644 hardware/tests/dht22/dht22.ino create mode 100644 hardware/tests/rtc_ds3231/rtc_ds3231.ino diff --git a/hardware/meeting-clock.fzz b/hardware/meeting-clock.fzz new file mode 100644 index 0000000000000000000000000000000000000000..4a7b0c06cf43784c6b9d98b952df81390a2e03d8 GIT binary patch literal 50552 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 literal 0 HcmV?d00001 diff --git a/hardware/tests/BT_Serial/BT_Serial.ino b/hardware/tests/BT_Serial/BT_Serial.ino new file mode 100644 index 0000000..4fe5913 --- /dev/null +++ b/hardware/tests/BT_Serial/BT_Serial.ino @@ -0,0 +1,91 @@ +// SerialIn_SerialOut_004 +// +// Uses hardware serial to talk to the host computer and Software +// Serial for communication with the bluetooth module +// +// What ever is entered in the serial monitor is sent to the connected +// device +// Anything received from the connected device is copied to the serial +// monitor +// +// Pins +// BT VCC to Arduino 5V out. +// BT GND to GND +// Arduino D8 (SS RX) - BT TX no need voltage divider +// Arduino D9 (SS TX) - BT RX through a voltage divider (5v to 3.3v) +// +// Setup procedure +/* + * AT + * AT+ORGL + * // restart + * AT + * AT+NAME=Meeting Clock + * AT+NAME? + * AT+PSWD="1812" + * AT+PSWD? + * AT+UART=9600,1,0 + * AT+UART? + */ + +#include +SoftwareSerial BTserial(5, 4); // RX, TX +#define STATE_PIN 3 + +char c = ' '; +boolean NL = true; + +void setup() +{ + Serial.begin(9600); + Serial.print("Sketch: "); Serial.println(__FILE__); + Serial.print("Uploaded: "); Serial.println(__DATE__); + Serial.println(" "); + + BTserial.begin(38400); // for at mode + //BTserial.begin(9600); // for echo mode + Serial.println("BTserial started at 9600"); + Serial.println(" "); + + pinMode(STATE_PIN, INPUT); +} + +bool state = false; +void loop() +{ + if (digitalRead(STATE_PIN) != state) { + state = digitalRead(STATE_PIN); + Serial.print("! new BT state: "); + if (state) { + Serial.println("Connected"); + } else { + Serial.println("Disconnected"); + } + } + + // Read from the Bluetooth module and send to the Arduino Serial + // Monitor + if (BTserial.available()) + { + c = BTserial.read(); Serial.write(c); + } + + + // Read from the Serial Monitor and send to the Bluetooth module + if (Serial.available()) + { + c = Serial.read(); + BTserial.write(c); + + // Echo the user input to the main window. The ">" character + // indicates the user entered text. + if (NL) { + Serial.print(">"); + NL = false; + } + Serial.write(c); + if (c == 10) { + NL = true; + } + } +} diff --git a/hardware/tests/MD_MAX72xx_Test/MD_MAX72xx_Test.ino b/hardware/tests/MD_MAX72xx_Test/MD_MAX72xx_Test.ino new file mode 100644 index 0000000..ed8db75 --- /dev/null +++ b/hardware/tests/MD_MAX72xx_Test/MD_MAX72xx_Test.ino @@ -0,0 +1,625 @@ +// Program to exercise the MD_MAX72XX library +// +// Uses most of the functions in the library +#include +//#include + +// Turn on debug statements to the serial output +#define DEBUG 1 + +#if DEBUG +#define PRINT(s, x) { Serial.print(F(s)); Serial.print(x); } +#define PRINTS(x) Serial.print(F(x)) +#define PRINTD(x) Serial.println(x, DEC) + +#else +#define PRINT(s, x) +#define PRINTS(x) +#define PRINTD(x) + +#endif + +// Define the number of devices we have in the chain and the hardware interface +// NOTE: These pin numbers will probably not work with your hardware and may +// need to be adapted +#define HARDWARE_TYPE MD_MAX72XX::FC16_HW +#define MAX_DEVICES 4 + +#define CS_PIN 6 // or SS + +// SPI hardware interface +MD_MAX72XX mx = MD_MAX72XX(HARDWARE_TYPE, CS_PIN, MAX_DEVICES); +// Arbitrary pins +//MD_MAX72XX mx = MD_MAX72XX(HARDWARE_TYPE, DATA_PIN, CLK_PIN, CS_PIN, MAX_DEVICES); + +// We always wait a bit between updates of the display +#define DELAYTIME 300 // in milliseconds + +void scrollText(const char *p) +{ + uint8_t charWidth; + uint8_t cBuf[8]; // this should be ok for all built-in fonts + + PRINTS("\nScrolling text"); + mx.clear(); + + while (*p != '\0') + { + charWidth = mx.getChar(*p++, sizeof(cBuf) / sizeof(cBuf[0]), cBuf); + + for (uint8_t i=0; i<=charWidth; i++) // allow space between characters + { + mx.transform(MD_MAX72XX::TSL); + if (i < charWidth) + mx.setColumn(0, cBuf[i]); + delay(DELAYTIME); + } + } +} + +void zeroPointSet() +// Demonstrates the use of setPoint and +// show where the zero point is in the display +{ + PRINTS("\nZero point highlight"); + mx.clear(); + + if (MAX_DEVICES > 1) + mx.setChar((2*COL_SIZE)-1, '0'); + + for (uint8_t i=0; i7"); + mx.clear(); + + for (uint8_t row=0; row 1) idx = 0; + } + + delay(10 * DELAYTIME); + } +} + +void columns() +// Demonstrates the use of setColumn() +{ + PRINTS("\nCols 0->max"); + mx.clear(); + + for (uint8_t col=0; col=0; i--) + { + for (uint8_t j=0; j rmin) && (cmax > cmin)) + { + // do row + for (int i=cmin; i<=cmax; i++) + { + mx.setPoint(rmin, i, true); + delay(DELAYTIME/MAX_DEVICES); + } + rmin++; + + // do column + for (uint8_t i=rmin; i<=rmax; i++) + { + mx.setPoint(i, cmax, true); + delay(DELAYTIME/MAX_DEVICES); + } + cmax--; + + // do row + for (int i=cmax; i>=cmin; i--) + { + mx.setPoint(rmax, i, true); + delay(DELAYTIME/MAX_DEVICES); + } + rmax--; + + // do column + for (uint8_t i=rmax; i>=rmin; i--) + { + mx.setPoint(i, cmin, true); + delay(DELAYTIME/MAX_DEVICES); + } + cmin++; + } +} + +void bounce() +// Animation of a bouncing ball +{ + const int minC = 0; + const int maxC = mx.getColumnCount()-1; + const int minR = 0; + const int maxR = ROW_SIZE-1; + + int nCounter = 0; + + int r = 0, c = 2; + int8_t dR = 1, dC = 1; // delta row and column + + PRINTS("\nBouncing ball"); + mx.clear(); + + while (nCounter++ < 200) + { + mx.setPoint(r, c, false); + r += dR; + c += dC; + mx.setPoint(r, c, true); + delay(DELAYTIME/2); + + if ((r == minR) || (r == maxR)) + dR = -dR; + if ((c == minC) || (c == maxC)) + dC = -dC; + } +} + +void intensity() +// Demonstrates the control of display intensity (brightness) across +// the full range. +{ + uint8_t row; + + PRINTS("\nVary intensity "); + + mx.clear(); + + // Grow and get brighter + row = 0; + for (int8_t i=0; i<=MAX_INTENSITY; i++) + { + mx.control(MD_MAX72XX::INTENSITY, i); + if (i%2 == 0) + mx.setRow(row++, 0xff); + delay(DELAYTIME*3); + } + + mx.control(MD_MAX72XX::INTENSITY, 8); +} + +void blinking() +// Uses the test function of the MAX72xx to blink the display on and off. +{ + int nDelay = 1000; + + PRINTS("\nBlinking"); + mx.clear(); + + while (nDelay > 0) + { + mx.control(MD_MAX72XX::TEST, MD_MAX72XX::ON); + delay(nDelay); + mx.control(MD_MAX72XX::TEST, MD_MAX72XX::OFF); + delay(nDelay); + + nDelay -= DELAYTIME; + } +} + +void scanLimit(void) +// Uses scan limit function to restrict the number of rows displayed. +{ + PRINTS("\nScan Limit"); + mx.clear(); + + mx.control(MD_MAX72XX::UPDATE, MD_MAX72XX::OFF); + for (uint8_t row=0; row=0; s--) + { + mx.control(MD_MAX72XX::SCANLIMIT, s); + delay(DELAYTIME*5); + } + mx.control(MD_MAX72XX::SCANLIMIT, MAX_SCANLIMIT); +} + +void transformation1() +// Demonstrates the use of transform() to move bitmaps on the display +// In this case a user defined bitmap is created and animated. +{ + uint8_t arrow[COL_SIZE] = + { + 0b00001000, + 0b00011100, + 0b00111110, + 0b01111111, + 0b00011100, + 0b00011100, + 0b00111110, + 0b00000000 + }; + + MD_MAX72XX::transformType_t t[] = + { + MD_MAX72XX::TSL, MD_MAX72XX::TSL, MD_MAX72XX::TSL, MD_MAX72XX::TSL, + MD_MAX72XX::TSL, MD_MAX72XX::TSL, MD_MAX72XX::TSL, MD_MAX72XX::TSL, + MD_MAX72XX::TSL, MD_MAX72XX::TSL, MD_MAX72XX::TSL, MD_MAX72XX::TSL, + MD_MAX72XX::TSL, MD_MAX72XX::TSL, MD_MAX72XX::TSL, MD_MAX72XX::TSL, + MD_MAX72XX::TFLR, + MD_MAX72XX::TSR, MD_MAX72XX::TSR, MD_MAX72XX::TSR, MD_MAX72XX::TSR, + MD_MAX72XX::TSR, MD_MAX72XX::TSR, MD_MAX72XX::TSR, MD_MAX72XX::TSR, + MD_MAX72XX::TSR, MD_MAX72XX::TSR, MD_MAX72XX::TSR, MD_MAX72XX::TSR, + MD_MAX72XX::TSR, MD_MAX72XX::TSR, MD_MAX72XX::TSR, MD_MAX72XX::TSR, + MD_MAX72XX::TRC, + MD_MAX72XX::TSD, MD_MAX72XX::TSD, MD_MAX72XX::TSD, MD_MAX72XX::TSD, + MD_MAX72XX::TSD, MD_MAX72XX::TSD, MD_MAX72XX::TSD, MD_MAX72XX::TSD, + MD_MAX72XX::TFUD, + MD_MAX72XX::TSU, MD_MAX72XX::TSU, MD_MAX72XX::TSU, MD_MAX72XX::TSU, + MD_MAX72XX::TSU, MD_MAX72XX::TSU, MD_MAX72XX::TSU, MD_MAX72XX::TSU, + MD_MAX72XX::TINV, + MD_MAX72XX::TRC, MD_MAX72XX::TRC, MD_MAX72XX::TRC, MD_MAX72XX::TRC, + MD_MAX72XX::TINV + }; + + PRINTS("\nTransformation1"); + mx.clear(); + + // use the arrow bitmap + mx.control(MD_MAX72XX::UPDATE, MD_MAX72XX::OFF); + for (uint8_t j=0; j= 3) + { + char hex[3]; + + sprintf(hex, "%02X", i); + + mx.clear(1); + mx.setChar((2*COL_SIZE)-1,hex[1]); + mx.clear(2); + mx.setChar((3*COL_SIZE)-1,hex[0]); + } + + mx.update(); + delay(DELAYTIME*2); + } + mx.update(MD_MAX72XX::ON); +} + +void setup() +{ + mx.begin(); + +#if DEBUG + Serial.begin(57600); +#endif + PRINTS("\n[MD_MAX72XX Test & Demo]"); +// scrollText("MD_MAX72xx Test "); +} + +void loop() +{ +#if 1 + scrollText("Graphics"); + zeroPointSet(); + rows(); + columns(); + cross(); + stripe(); + checkboard(); + bullseye(); + bounce(); + spiral(); +#endif + +#if 1 + scrollText("Control"); + intensity(); + scanLimit(); + blinking(); +#endif + +#if 1 + scrollText("Transform"); + transformation1(); + transformation2(); +#endif + +#if 1 + scrollText("Charset"); + wrapText(); + showCharset(); +#endif +} diff --git a/hardware/tests/dht22/dht22.ino b/hardware/tests/dht22/dht22.ino new file mode 100644 index 0000000..1f68262 --- /dev/null +++ b/hardware/tests/dht22/dht22.ino @@ -0,0 +1,40 @@ +/* How to use the DHT-22 sensor with Arduino uno + Temperature and humidity sensor +*/ + +//Libraries +#include + +//Constants +#define DHTPIN 2 // what pin we're connected to +#define DHTTYPE DHT22 // DHT 22 (AM2302) +DHT dht(DHTPIN, DHTTYPE); //// Initialize DHT sensor for normal 16mhz Arduino + + +//Variables +int chk; +float hum; //Stores humidity value +float temp; //Stores temperature value + +void setup() +{ + Serial.begin(9600); + dht.begin(); +} + +void loop() +{ + delay(2000); + //Read data and store it to variables hum and temp + hum = dht.readHumidity(); + temp= dht.readTemperature(); + //Print temp and humidity values to serial monitor + Serial.print("Humidity: "); + Serial.print(hum); + Serial.print(" %, Temp: "); + Serial.print(temp); + Serial.println(" Celsius"); + delay(10000); //Delay 2 sec. +} + + diff --git a/hardware/tests/rtc_ds3231/rtc_ds3231.ino b/hardware/tests/rtc_ds3231/rtc_ds3231.ino new file mode 100644 index 0000000..89e7750 --- /dev/null +++ b/hardware/tests/rtc_ds3231/rtc_ds3231.ino @@ -0,0 +1,86 @@ +// Date and time functions using a DS3231 RTC connected via I2C and Wire lib +#include "RTClib.h" + +RTC_DS3231 rtc; + +char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}; + +void setup () { + Serial.begin(9600); + +#ifndef ESP8266 + while (!Serial); // wait for serial port to connect. Needed for native USB +#endif + + if (! rtc.begin()) { + Serial.println("Couldn't find RTC"); + Serial.flush(); + abort(); + } + + if (rtc.lostPower()) { + Serial.println("RTC lost power, let's set the time!"); + // When time needs to be set on a new device, or after a power loss, the + // following line sets the RTC to the date & time this sketch was compiled + rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); + // This line sets the RTC with an explicit date & time, for example to set + // January 21, 2014 at 3am you would call: + // rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0)); + } + + // When time needs to be re-set on a previously configured device, the + // following line sets the RTC to the date & time this sketch was compiled + // rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); + // This line sets the RTC with an explicit date & time, for example to set + // January 21, 2014 at 3am you would call: + // rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0)); +} + +void loop () { + DateTime now = rtc.now(); + + Serial.print(now.year(), DEC); + Serial.print('/'); + Serial.print(now.month(), DEC); + Serial.print('/'); + Serial.print(now.day(), DEC); + Serial.print(" ("); + Serial.print(daysOfTheWeek[now.dayOfTheWeek()]); + Serial.print(") "); + Serial.print(now.hour(), DEC); + Serial.print(':'); + Serial.print(now.minute(), DEC); + Serial.print(':'); + Serial.print(now.second(), DEC); + Serial.println(); + + Serial.print(" since midnight 1/1/1970 = "); + Serial.print(now.unixtime()); + Serial.print("s = "); + Serial.print(now.unixtime() / 86400L); + Serial.println("d"); + + // calculate a date which is 7 days and 30 seconds into the future + DateTime future (now + TimeSpan(7,12,30,6)); + + Serial.print(" now + 7d + 30s: "); + Serial.print(future.year(), DEC); + Serial.print('/'); + Serial.print(future.month(), DEC); + Serial.print('/'); + Serial.print(future.day(), DEC); + Serial.print(' '); + Serial.print(future.hour(), DEC); + Serial.print(':'); + Serial.print(future.minute(), DEC); + Serial.print(':'); + Serial.print(future.second(), DEC); + Serial.println(); + + Serial.print("Temperature: "); + Serial.print(rtc.getTemperature()); + Serial.println(" C"); + + Serial.println(); + delay(3000); +}