diff --git a/hardware/meeting-clock.fzz b/hardware/meeting-clock.fzz new file mode 100644 index 0000000..4a7b0c0 Binary files /dev/null and b/hardware/meeting-clock.fzz differ 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); +}