From 5e20a17131f612e3a7f576132dcdb09eab8746b6 Mon Sep 17 00:00:00 2001 From: Harald Pichler Date: Mon, 7 Aug 2017 15:46:53 +0200 Subject: [PATCH] initial upload --- .../osd/week-clock/DigitalTube/README.txt | 16 ++ .../osd/week-clock/DigitalTube/TM1637.cpp | 167 ++++++++++++++++++ examples/osd/week-clock/DigitalTube/TM1637.h | 62 +++++++ .../examples/ClockDisplay/ClockDisplay.ino | 86 +++++++++ .../examples/NumberFlow/NumberFlow.ino | 48 +++++ .../examples/Stopwatch/Stopwatch.ino | 144 +++++++++++++++ examples/osd/week-clock/Makefile | 71 ++++++++ examples/osd/week-clock/README.md | 11 ++ examples/osd/week-clock/TM1637.cpp | 167 ++++++++++++++++++ examples/osd/week-clock/TM1637.h | 62 +++++++ examples/osd/week-clock/arduino-example.c | 2 + .../osd/week-clock/arduino-merkurbaord.geany | 72 ++++++++ examples/osd/week-clock/flash.sh | 2 + examples/osd/week-clock/project-conf.h | 89 ++++++++++ examples/osd/week-clock/resources/res-led.c | 104 +++++++++++ examples/osd/week-clock/run.sh | 5 + examples/osd/week-clock/sketch.pde | 55 ++++++ 17 files changed, 1163 insertions(+) create mode 100644 examples/osd/week-clock/DigitalTube/README.txt create mode 100644 examples/osd/week-clock/DigitalTube/TM1637.cpp create mode 100644 examples/osd/week-clock/DigitalTube/TM1637.h create mode 100644 examples/osd/week-clock/DigitalTube/examples/ClockDisplay/ClockDisplay.ino create mode 100644 examples/osd/week-clock/DigitalTube/examples/NumberFlow/NumberFlow.ino create mode 100644 examples/osd/week-clock/DigitalTube/examples/Stopwatch/Stopwatch.ino create mode 100644 examples/osd/week-clock/Makefile create mode 100644 examples/osd/week-clock/README.md create mode 100644 examples/osd/week-clock/TM1637.cpp create mode 100644 examples/osd/week-clock/TM1637.h create mode 100644 examples/osd/week-clock/arduino-example.c create mode 100644 examples/osd/week-clock/arduino-merkurbaord.geany create mode 100755 examples/osd/week-clock/flash.sh create mode 100644 examples/osd/week-clock/project-conf.h create mode 100644 examples/osd/week-clock/resources/res-led.c create mode 100755 examples/osd/week-clock/run.sh create mode 100644 examples/osd/week-clock/sketch.pde diff --git a/examples/osd/week-clock/DigitalTube/README.txt b/examples/osd/week-clock/DigitalTube/README.txt new file mode 100644 index 000000000..0319dc9c9 --- /dev/null +++ b/examples/osd/week-clock/DigitalTube/README.txt @@ -0,0 +1,16 @@ +//****************************************************************** +// +// Name:DigitalTube liararies v0.9b for Grove - 4-Digit Display v1.0 +// Author:Frankie.Chu at Seeed Studio. +// Date:April 9,2012 +// Version:0.9b +// Software platform:Arduino-1.0 +// Hardware platform:Arduino UNO/Seeeduino/Arduino Mega + +// Grove - 4-Digit Display +// Demo code: +// ClockDisplay: Display a clock like 12:00. +// NumberFlow: Numbers from 0 to 9 flow from right to left. +// Stopwatch: A stopwatch that can be controled by the serial +// monitor. +// +//******************************************************************* \ No newline at end of file diff --git a/examples/osd/week-clock/DigitalTube/TM1637.cpp b/examples/osd/week-clock/DigitalTube/TM1637.cpp new file mode 100644 index 000000000..56b99414c --- /dev/null +++ b/examples/osd/week-clock/DigitalTube/TM1637.cpp @@ -0,0 +1,167 @@ +// Author:Frankie.Chu +// Date:9 April,2012 +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +// +// Modified record: +// +/*******************************************************************************/ +#include "TM1637.h" +#include +static int8_t TubeTab[] = {0x3f,0x06,0x5b,0x4f, + 0x66,0x6d,0x7d,0x07, + 0x7f,0x6f,0x77,0x7c, + 0x39,0x5e,0x79,0x71};//0~9,A,b,C,d,E,F +TM1637::TM1637(uint8_t Clk, uint8_t Data) +{ + Clkpin = Clk; + Datapin = Data; + pinMode(Clkpin,OUTPUT); + pinMode(Datapin,OUTPUT); +} + +void TM1637::init(void) +{ + clearDisplay(); +} + +void TM1637::writeByte(int8_t wr_data) +{ + uint8_t i,count1; + for(i=0;i<8;i++) //sent 8bit data + { + digitalWrite(Clkpin,LOW); + if(wr_data & 0x01)digitalWrite(Datapin,HIGH);//LSB first + else digitalWrite(Datapin,LOW); + wr_data >>= 1; + digitalWrite(Clkpin,HIGH); + + } + digitalWrite(Clkpin,LOW); //wait for the ACK + digitalWrite(Datapin,HIGH); + digitalWrite(Clkpin,HIGH); + pinMode(Datapin,INPUT); + while(digitalRead(Datapin)) + { + count1 +=1; + if(count1 == 200)// + { + pinMode(Datapin,OUTPUT); + digitalWrite(Datapin,LOW); + count1 =0; + } + pinMode(Datapin,INPUT); + } + pinMode(Datapin,OUTPUT); + +} +//send start signal to TM1637 +void TM1637::start(void) +{ + digitalWrite(Clkpin,HIGH);//send start signal to TM1637 + digitalWrite(Datapin,HIGH); + digitalWrite(Datapin,LOW); + digitalWrite(Clkpin,LOW); +} +//End of transmission +void TM1637::stop(void) +{ + digitalWrite(Clkpin,LOW); + digitalWrite(Datapin,LOW); + digitalWrite(Clkpin,HIGH); + digitalWrite(Datapin,HIGH); +} +//display function.Write to full-screen. +void TM1637::display(int8_t DispData[]) +{ + int8_t SegData[4]; + uint8_t i; + for(i = 0;i < 4;i ++) + { + SegData[i] = DispData[i]; + } + coding(SegData); + start(); //start signal sent to TM1637 from MCU + writeByte(ADDR_AUTO);// + stop(); // + start(); // + writeByte(Cmd_SetAddr);// + for(i=0;i < 4;i ++) + { + writeByte(SegData[i]); // + } + stop(); // + start(); // + writeByte(Cmd_DispCtrl);// + stop(); // +} +//****************************************** +void TM1637::display(uint8_t BitAddr,int8_t DispData) +{ + int8_t SegData; + SegData = coding(DispData); + start(); //start signal sent to TM1637 from MCU + writeByte(ADDR_FIXED);// + stop(); // + start(); // + writeByte(BitAddr|0xc0);// + writeByte(SegData);// + stop(); // + start(); // + writeByte(Cmd_DispCtrl);// + stop(); // +} + +void TM1637::clearDisplay(void) +{ + display(0x00,0x7f); + display(0x01,0x7f); + display(0x02,0x7f); + display(0x03,0x7f); +} +//To take effect the next time it displays. +void TM1637::set(uint8_t brightness,uint8_t SetData,uint8_t SetAddr) +{ + Cmd_SetData = SetData; + Cmd_SetAddr = SetAddr; + Cmd_DispCtrl = 0x88 + brightness;//Set the brightness and it takes effect the next time it displays. +} + +//Whether to light the clock point ":". +//To take effect the next time it displays. +void TM1637::point(boolean PointFlag) +{ + _PointFlag = PointFlag; +} +void TM1637::coding(int8_t DispData[]) +{ + uint8_t PointData; + if(_PointFlag == POINT_ON)PointData = 0x80; + else PointData = 0; + for(uint8_t i = 0;i < 4;i ++) + { + if(DispData[i] == 0x7f)DispData[i] = 0x00; + else DispData[i] = TubeTab[DispData[i]] + PointData; + } +} +int8_t TM1637::coding(int8_t DispData) +{ + uint8_t PointData; + if(_PointFlag == POINT_ON)PointData = 0x80; + else PointData = 0; + if(DispData == 0x7f) DispData = 0x00 + PointData;//The bit digital tube off + else DispData = TubeTab[DispData] + PointData; + return DispData; +} diff --git a/examples/osd/week-clock/DigitalTube/TM1637.h b/examples/osd/week-clock/DigitalTube/TM1637.h new file mode 100644 index 000000000..c5a039131 --- /dev/null +++ b/examples/osd/week-clock/DigitalTube/TM1637.h @@ -0,0 +1,62 @@ +// Author:Frankie.Chu +// Date:9 April,2012 +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +// +// Modified record: +// +/*******************************************************************************/ + +#ifndef TM1637_h +#define TM1637_h +#include +#include +//************definitions for TM1637********************* +#define ADDR_AUTO 0x40 +#define ADDR_FIXED 0x44 + +#define STARTADDR 0xc0 +/**** definitions for the clock point of the digit tube *******/ +#define POINT_ON 1 +#define POINT_OFF 0 +/**************definitions for brightness***********************/ +#define BRIGHT_DARKEST 0 +#define BRIGHT_TYPICAL 2 +#define BRIGHTEST 7 + +class TM1637 +{ + public: + uint8_t Cmd_SetData; + uint8_t Cmd_SetAddr; + uint8_t Cmd_DispCtrl; + boolean _PointFlag; //_PointFlag=1:the clock point on + TM1637(uint8_t, uint8_t); + void init(void); //To clear the display + void writeByte(int8_t wr_data);//write 8bit data to tm1637 + void start(void);//send start bits + void stop(void); //send stop bits + void display(int8_t DispData[]); + void display(uint8_t BitAddr,int8_t DispData); + void clearDisplay(void); + void set(uint8_t = BRIGHT_TYPICAL,uint8_t = 0x40,uint8_t = 0xc0);//To take effect the next time it displays. + void point(boolean PointFlag);//whether to light the clock point ":".To take effect the next time it displays. + void coding(int8_t DispData[]); + int8_t coding(int8_t DispData); + private: + uint8_t Clkpin; + uint8_t Datapin; +}; +#endif diff --git a/examples/osd/week-clock/DigitalTube/examples/ClockDisplay/ClockDisplay.ino b/examples/osd/week-clock/DigitalTube/examples/ClockDisplay/ClockDisplay.ino new file mode 100644 index 000000000..5caeac688 --- /dev/null +++ b/examples/osd/week-clock/DigitalTube/examples/ClockDisplay/ClockDisplay.ino @@ -0,0 +1,86 @@ +// Author:Frankie.Chu +// Date:9 April,2012 +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +// +// Modified record: +// +/*******************************************************************************/ +#include +#include "TM1637.h" +#define ON 1 +#define OFF 0 + +int8_t TimeDisp[] = {0x00,0x00,0x00,0x00}; +unsigned char ClockPoint = 1; +unsigned char Update; +unsigned char halfsecond = 0; +unsigned char second; +unsigned char minute = 0; +unsigned char hour = 12; + + +#define CLK 2//pins definitions for TM1637 and can be changed to other ports +#define DIO 3 +TM1637 tm1637(CLK,DIO); + +void setup() +{ + tm1637.set(); + tm1637.init(); + Timer1.initialize(500000);//timing for 500ms + Timer1.attachInterrupt(TimingISR);//declare the interrupt serve routine:TimingISR +} +void loop() +{ + if(Update == ON) + { + TimeUpdate(); + tm1637.display(TimeDisp); + } + +} +void TimingISR() +{ + halfsecond ++; + Update = ON; + if(halfsecond == 2){ + second ++; + if(second == 60) + { + minute ++; + if(minute == 60) + { + hour ++; + if(hour == 24)hour = 0; + minute = 0; + } + second = 0; + } + halfsecond = 0; + } + // Serial.println(second); + ClockPoint = (~ClockPoint) & 0x01; +} +void TimeUpdate(void) +{ + if(ClockPoint)tm1637.point(POINT_ON); + else tm1637.point(POINT_OFF); + TimeDisp[0] = hour / 10; + TimeDisp[1] = hour % 10; + TimeDisp[2] = minute / 10; + TimeDisp[3] = minute % 10; + Update = OFF; +} \ No newline at end of file diff --git a/examples/osd/week-clock/DigitalTube/examples/NumberFlow/NumberFlow.ino b/examples/osd/week-clock/DigitalTube/examples/NumberFlow/NumberFlow.ino new file mode 100644 index 000000000..9ba8de841 --- /dev/null +++ b/examples/osd/week-clock/DigitalTube/examples/NumberFlow/NumberFlow.ino @@ -0,0 +1,48 @@ +// Author:Frankie.Chu +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#include "TM1637.h" +#define CLK 2//pins definitions for TM1637 and can be changed to other ports +#define DIO 3 +TM1637 tm1637(CLK,DIO); +void setup() +{ + tm1637.init(); + tm1637.set(BRIGHT_TYPICAL);//BRIGHT_TYPICAL = 2,BRIGHT_DARKEST = 0,BRIGHTEST = 7; +} +void loop() +{ + int8_t NumTab[] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};//0~9,A,b,C,d,E,F + int8_t ListDisp[4]; + unsigned char i = 0; + unsigned char count = 0; + delay(150); + while(1) + { + i = count; + count ++; + if(count == sizeof(NumTab)) count = 0; + for(unsigned char BitSelect = 0;BitSelect < 4;BitSelect ++) + { + ListDisp[BitSelect] = NumTab[i]; + i ++; + if(i == sizeof(NumTab)) i = 0; + } + tm1637.display(0,ListDisp[0]); + tm1637.display(1,ListDisp[1]); + tm1637.display(2,ListDisp[2]); + tm1637.display(3,ListDisp[3]); + delay(300); + } +} \ No newline at end of file diff --git a/examples/osd/week-clock/DigitalTube/examples/Stopwatch/Stopwatch.ino b/examples/osd/week-clock/DigitalTube/examples/Stopwatch/Stopwatch.ino new file mode 100644 index 000000000..c85a6fd41 --- /dev/null +++ b/examples/osd/week-clock/DigitalTube/examples/Stopwatch/Stopwatch.ino @@ -0,0 +1,144 @@ +// Author:Frankie.Chu +// Date:9 April,2012 +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +// +// Modified record: +// +/*******************************************************************************/ +#include +#include +#include +#include "TM1637.h" +#define ON 1 +#define OFF 0 + +int8_t TimeDisp[] = {0x00,0x00,0x00,0x00}; +unsigned char ClockPoint = 1; +unsigned char Update; +unsigned char microsecond_10 = 0; +unsigned char second; +unsigned char _microsecond_10 = 0; +unsigned char _second; +unsigned int eepromaddr; +boolean Flag_ReadTime; + +#define CLK 2//pins definitions for TM1637 and can be changed to other ports +#define DIO 3 +TM1637 tm1637(CLK,DIO); + +void setup() +{ + Serial.begin(9600); + tm1637.set(BRIGHT_TYPICAL);//BRIGHT_TYPICAL = 2,BRIGHT_DARKEST = 0,BRIGHTEST = 7; + tm1637.init(); + Timer1.initialize(10000);//timing for 10ms + Timer1.attachInterrupt(TimingISR);//declare the interrupt serve routine:TimingISR + Serial.println("Please send command to control the stopwatch:"); + Serial.println("S - start"); + Serial.println("P - pause"); + Serial.println("L - list the time"); + Serial.println("W - write the time to EEPROM "); + Serial.println("R - reset"); +} +void loop() +{ + char command; + command = Serial.read(); + switch(command) + { + case 'S':stopwatchStart();Serial.println("Start timing...");break; + case 'P':stopwatchPause();Serial.println("Stopwatch was paused");break; + case 'L':readTime();break; + case 'W':saveTime();Serial.println("Save the time");break; + case 'R':stopwatchReset();Serial.println("Stopwatch was reset");break; + default:break; + } + if(Update == ON) + { + TimeUpdate(); + tm1637.display(TimeDisp); + } +} +//************************************************ +void TimingISR() +{ + microsecond_10 ++; + Update = ON; + if(microsecond_10 == 100){ + second ++; + if(second == 60) + { + second = 0; + } + microsecond_10 = 0; + } + ClockPoint = (~ClockPoint) & 0x01; + if(Flag_ReadTime == 0) + { + _microsecond_10 = microsecond_10; + _second = second; + } +} +void TimeUpdate(void) +{ + if(ClockPoint)tm1637.point(POINT_ON);//POINT_ON = 1,POINT_OFF = 0; + else tm1637.point(POINT_ON); + TimeDisp[2] = _microsecond_10 / 10; + TimeDisp[3] = _microsecond_10 % 10; + TimeDisp[0] = _second / 10; + TimeDisp[1] = _second % 10; + Update = OFF; +} +void stopwatchStart()//timer1 on +{ + Flag_ReadTime = 0; + TCCR1B |= Timer1.clockSelectBits; +} +void stopwatchPause()//timer1 off if [CS12 CS11 CS10] is [0 0 0]. +{ + TCCR1B &= ~(_BV(CS10) | _BV(CS11) | _BV(CS12)); +} +void stopwatchReset() +{ + stopwatchPause(); + Flag_ReadTime = 0; + _microsecond_10 = 0; + _second = 0; + microsecond_10 = 0; + second = 0; + Update = ON; +} +void saveTime() +{ + EEPROM.write(eepromaddr ++,microsecond_10); + EEPROM.write(eepromaddr ++,second); +} +void readTime() +{ + Flag_ReadTime = 1; + if(eepromaddr == 0) + { + Serial.println("The time had been read"); + _microsecond_10 = 0; + _second = 0; + } + else{ + _second = EEPROM.read(-- eepromaddr); + _microsecond_10 = EEPROM.read(-- eepromaddr); + Serial.println("List the time"); + } + Update = ON; +} \ No newline at end of file diff --git a/examples/osd/week-clock/Makefile b/examples/osd/week-clock/Makefile new file mode 100644 index 000000000..5939a88e8 --- /dev/null +++ b/examples/osd/week-clock/Makefile @@ -0,0 +1,71 @@ +# Set this to the name of your sketch (without extension .pde) +SKETCH=sketch +EXE=arduino-example + +all: $(EXE) + +CONTIKI=../../.. + +# Contiki IPv6 configuration +CONTIKI_WITH_IPV6 = 1 + +CFLAGS += -DPROJECT_CONF_H=\"project-conf.h\" + +PROJECT_SOURCEFILES += ${SKETCH}.cpp TM1637.cpp + +# automatically build RESTful resources +REST_RESOURCES_DIR = ./resources +REST_RESOURCES_DIR_COMMON = ../resources-common +REST_RESOURCES_FILES= $(notdir \ + $(shell find $(REST_RESOURCES_DIR) -name '*.c') \ + $(shell find $(REST_RESOURCES_DIR_COMMON) -name '*.c') \ + ) + +PROJECTDIRS += $(REST_RESOURCES_DIR) $(REST_RESOURCES_DIR_COMMON) +PROJECT_SOURCEFILES += $(REST_RESOURCES_FILES) + +# variable for Makefile.include +ifneq ($(TARGET), minimal-net) +CFLAGS += -DUIP_CONF_IPV6_RPL=1 +else +# minimal-net does not support RPL under Linux and is mostly used to test CoAP only +${info INFO: compiling without RPL} +CFLAGS += -DUIP_CONF_IPV6_RPL=0 +CFLAGS += -DHARD_CODED_ADDRESS=\"fdfd::10\" +${info INFO: compiling with large buffers} +CFLAGS += -DUIP_CONF_BUFFER_SIZE=2048 +CFLAGS += -DREST_MAX_CHUNK_SIZE=1024 +CFLAGS += -DCOAP_MAX_HEADER_SIZE=640 +endif + +# linker optimizations +SMALL=1 + + +# REST Engine shall use Erbium CoAP implementation +APPS += er-coap +APPS += rest-engine +APPS += arduino +APPS += json json-resource time + +include $(CONTIKI)/Makefile.include +include $(CONTIKI)/apps/arduino/Makefile.include + +$(CONTIKI)/tools/tunslip6: $(CONTIKI)/tools/tunslip6.c + (cd $(CONTIKI)/tools && $(MAKE) tunslip6) + +connect-router: $(CONTIKI)/tools/tunslip6 + sudo $(CONTIKI)/tools/tunslip6 aaaa::1/64 + +connect-router-cooja: $(CONTIKI)/tools/tunslip6 + sudo $(CONTIKI)/tools/tunslip6 -a 127.0.0.1 aaaa::1/64 + +connect-minimal: + sudo ip address add fdfd::1/64 dev tap0 + +avr-size: $(EXE).$(TARGET).sz + +flash: $(EXE).$(TARGET).u $(EXE).$(TARGET).eu + +.PHONY: flash avr-size +.PRECIOUS: $(EXE).$(TARGET).hex $(EXE).$(TARGET).eep diff --git a/examples/osd/week-clock/README.md b/examples/osd/week-clock/README.md new file mode 100644 index 000000000..e1490ed05 --- /dev/null +++ b/examples/osd/week-clock/README.md @@ -0,0 +1,11 @@ +Arduino compatibility example +============================= + +This example shows that it is now possible to re-use arduino sketches in +Contiki. This example documents the necessary magic. Arduino specifies +two routines, `setup` and `loop`. Before `setup` is called, the +framework initializes hardware. In original Arduino, all this is done in +a `main` function (in C). For contiki we define a process that does the +same. + +See the documentation file in apps/contiki-compat/README.md diff --git a/examples/osd/week-clock/TM1637.cpp b/examples/osd/week-clock/TM1637.cpp new file mode 100644 index 000000000..e98e56b20 --- /dev/null +++ b/examples/osd/week-clock/TM1637.cpp @@ -0,0 +1,167 @@ +// Author:Frankie.Chu +// Date:9 April,2012 +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +// +// Modified record: +// +/*******************************************************************************/ +#include "TM1637.h" +#include +static int8_t TubeTab[] = {0x3f,0x06,0x5b,0x4f, + 0x66,0x6d,0x7d,0x07, + 0x7f,0x6f,0x77,0x7c, + 0x39,0x5e,0x79,0x71};//0~9,A,b,C,d,E,F +TM1637::TM1637(uint8_t Clk, uint8_t Data) +{ + Clkpin = Clk; + Datapin = Data; + pinMode(Clkpin,OUTPUT); + pinMode(Datapin,OUTPUT); +} + +void TM1637::init(void) +{ + clearDisplay(); +} + +void TM1637::writeByte(int8_t wr_data) +{ + uint8_t i,count1=0; + for(i=0;i<8;i++) //sent 8bit data + { + digitalWrite(Clkpin,LOW); + if(wr_data & 0x01)digitalWrite(Datapin,HIGH);//LSB first + else digitalWrite(Datapin,LOW); + wr_data >>= 1; + digitalWrite(Clkpin,HIGH); + + } + digitalWrite(Clkpin,LOW); //wait for the ACK + digitalWrite(Datapin,HIGH); + digitalWrite(Clkpin,HIGH); + pinMode(Datapin,INPUT); + while(digitalRead(Datapin)) + { + count1 +=1; + if(count1 == 200)// + { + pinMode(Datapin,OUTPUT); + digitalWrite(Datapin,LOW); + count1 =0; + } + pinMode(Datapin,INPUT); + } + pinMode(Datapin,OUTPUT); + +} +//send start signal to TM1637 +void TM1637::start(void) +{ + digitalWrite(Clkpin,HIGH);//send start signal to TM1637 + digitalWrite(Datapin,HIGH); + digitalWrite(Datapin,LOW); + digitalWrite(Clkpin,LOW); +} +//End of transmission +void TM1637::stop(void) +{ + digitalWrite(Clkpin,LOW); + digitalWrite(Datapin,LOW); + digitalWrite(Clkpin,HIGH); + digitalWrite(Datapin,HIGH); +} +//display function.Write to full-screen. +void TM1637::display(int8_t DispData[]) +{ + int8_t SegData[4]; + uint8_t i; + for(i = 0;i < 4;i ++) + { + SegData[i] = DispData[i]; + } + coding(SegData); + start(); //start signal sent to TM1637 from MCU + writeByte(ADDR_AUTO);// + stop(); // + start(); // + writeByte(Cmd_SetAddr);// + for(i=0;i < 4;i ++) + { + writeByte(SegData[i]); // + } + stop(); // + start(); // + writeByte(Cmd_DispCtrl);// + stop(); // +} +//****************************************** +void TM1637::display(uint8_t BitAddr,int8_t DispData) +{ + int8_t SegData; + SegData = coding(DispData); + start(); //start signal sent to TM1637 from MCU + writeByte(ADDR_FIXED);// + stop(); // + start(); // + writeByte(BitAddr|0xc0);// + writeByte(SegData);// + stop(); // + start(); // + writeByte(Cmd_DispCtrl);// + stop(); // +} + +void TM1637::clearDisplay(void) +{ + display(0x00,0x7f); + display(0x01,0x7f); + display(0x02,0x7f); + display(0x03,0x7f); +} +//To take effect the next time it displays. +void TM1637::set(uint8_t brightness,uint8_t SetData,uint8_t SetAddr) +{ + Cmd_SetData = SetData; + Cmd_SetAddr = SetAddr; + Cmd_DispCtrl = 0x88 + brightness;//Set the brightness and it takes effect the next time it displays. +} + +//Whether to light the clock point ":". +//To take effect the next time it displays. +void TM1637::point(boolean PointFlag) +{ + _PointFlag = PointFlag; +} +void TM1637::coding(int8_t DispData[]) +{ + uint8_t PointData; + if(_PointFlag == POINT_ON)PointData = 0x80; + else PointData = 0; + for(uint8_t i = 0;i < 4;i ++) + { + if(DispData[i] == 0x7f)DispData[i] = 0x00; + else DispData[i] = TubeTab[DispData[i]] + PointData; + } +} +int8_t TM1637::coding(int8_t DispData) +{ + uint8_t PointData; + if(_PointFlag == POINT_ON)PointData = 0x80; + else PointData = 0; + if(DispData == 0x7f) DispData = 0x00 + PointData;//The bit digital tube off + else DispData = TubeTab[DispData] + PointData; + return DispData; +} diff --git a/examples/osd/week-clock/TM1637.h b/examples/osd/week-clock/TM1637.h new file mode 100644 index 000000000..c5a039131 --- /dev/null +++ b/examples/osd/week-clock/TM1637.h @@ -0,0 +1,62 @@ +// Author:Frankie.Chu +// Date:9 April,2012 +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +// +// Modified record: +// +/*******************************************************************************/ + +#ifndef TM1637_h +#define TM1637_h +#include +#include +//************definitions for TM1637********************* +#define ADDR_AUTO 0x40 +#define ADDR_FIXED 0x44 + +#define STARTADDR 0xc0 +/**** definitions for the clock point of the digit tube *******/ +#define POINT_ON 1 +#define POINT_OFF 0 +/**************definitions for brightness***********************/ +#define BRIGHT_DARKEST 0 +#define BRIGHT_TYPICAL 2 +#define BRIGHTEST 7 + +class TM1637 +{ + public: + uint8_t Cmd_SetData; + uint8_t Cmd_SetAddr; + uint8_t Cmd_DispCtrl; + boolean _PointFlag; //_PointFlag=1:the clock point on + TM1637(uint8_t, uint8_t); + void init(void); //To clear the display + void writeByte(int8_t wr_data);//write 8bit data to tm1637 + void start(void);//send start bits + void stop(void); //send stop bits + void display(int8_t DispData[]); + void display(uint8_t BitAddr,int8_t DispData); + void clearDisplay(void); + void set(uint8_t = BRIGHT_TYPICAL,uint8_t = 0x40,uint8_t = 0xc0);//To take effect the next time it displays. + void point(boolean PointFlag);//whether to light the clock point ":".To take effect the next time it displays. + void coding(int8_t DispData[]); + int8_t coding(int8_t DispData); + private: + uint8_t Clkpin; + uint8_t Datapin; +}; +#endif diff --git a/examples/osd/week-clock/arduino-example.c b/examples/osd/week-clock/arduino-example.c new file mode 100644 index 000000000..ea74dd8b8 --- /dev/null +++ b/examples/osd/week-clock/arduino-example.c @@ -0,0 +1,2 @@ +#include +AUTOSTART_PROCESSES(&arduino_sketch); diff --git a/examples/osd/week-clock/arduino-merkurbaord.geany b/examples/osd/week-clock/arduino-merkurbaord.geany new file mode 100644 index 000000000..c44047a3c --- /dev/null +++ b/examples/osd/week-clock/arduino-merkurbaord.geany @@ -0,0 +1,72 @@ +[file_prefs] +final_new_line=true +ensure_convert_new_lines=false +strip_trailing_spaces=false +replace_tabs=false + +[indentation] +indent_width=4 +indent_type=1 +indent_hard_tab_width=8 +detect_indent=false +detect_indent_width=false +indent_mode=2 + +[project] +name=week-clock +base_path=/home/harald/install/osd-contiki/examples/osd/week-clock/ +description= +file_patterns= + +[long line marker] +long_line_behaviour=1 +long_line_column=72 + +[files] +current_page=11 +FILE_NAME_0=2281;None;0;EUTF-8;1;1;0;%2Fhome%2Fharald%2Finstall%2Fosd-contiki%2Fexamples%2Fosd%2Farduino-soil-moisture%2Fsketch.pde;0;4 +FILE_NAME_1=2895;C;0;EUTF-8;1;1;0;%2Fhome%2Fharald%2Finstall%2Fosd-contiki%2Fexamples%2Fosd%2Farduino-soil-moisture%2Fresources%2Fres-soillight.c;0;4 +FILE_NAME_2=2893;C;0;EUTF-8;1;1;0;%2Fhome%2Fharald%2Finstall%2Fosd-contiki%2Fexamples%2Fosd%2Farduino-soil-moisture%2Fresources%2Fres-soiltemp.c;0;4 +FILE_NAME_3=2177;C;0;EUTF-8;1;1;0;%2Fhome%2Fharald%2Finstall%2Fosd-contiki%2Fexamples%2Fosd%2Farduino-soil-moisture%2Fproject-conf.h;0;4 +FILE_NAME_4=5823;C++;0;EUTF-8;1;1;0;%2Fhome%2Fharald%2Finstall%2Fosd-contiki%2Fexamples%2Fosd%2Farduino-soil-moisture%2FI2CSoilMoistureSensor.cpp;0;4 +FILE_NAME_5=1931;C;0;EUTF-8;1;1;0;%2Fhome%2Fharald%2Finstall%2Fosd-contiki%2Fexamples%2Fosd%2Farduino-soil-moisture%2FI2CSoilMoistureSensor.h;0;4 +FILE_NAME_6=0;None;0;EUTF-8;1;1;0;%2Fhome%2Fharald%2Finstall%2Fsunrise%2FPCTools%2Fpowerconsumption%2FPICOTEST%2Ftemplate%2Fvob-ok%2Faverage2.awk;0;4 +FILE_NAME_7=0;XML;0;EUTF-8;1;1;0;%2Fhome%2Fharald%2Fprojekte%2Fairkey-ez2092%2FEZ2092.sch;0;4 +FILE_NAME_8=0;HTML;0;EUTF-8;1;1;0;%2Fhome%2Fharald%2FDownloads%2FSemesterplan.html;0;4 +FILE_NAME_9=1273;Sh;0;EUTF-8;1;1;0;%2Fhome%2Fharald%2Finstall%2Fpensi%2Fpensi.sh;0;4 +FILE_NAME_10=600;None;0;EUTF-8;1;1;0;%2Fhome%2Fharald%2Fprojekte%2Fairkey-commissioningtest%2FREADME;0;4 +FILE_NAME_11=275;None;0;EUTF-8;1;1;0;%2Fhome%2Fharald%2Fprojekte%2Fairkey-energieverbrauch%2Fpowerconsumption%2FPICOTEST%2Fez2092b%2Fez2092b-fw4.54%2Fstartup%2Fsperrung-vob-ok.gpl;0;4 + +[VTE] +last_dir=/home/harald + +[build-menu] +NF_00_LB=_Make +NF_00_CM=make TARGET=osd-merkur-256 +NF_00_WD= +NF_01_LB=Make flash +NF_01_CM=make TARGET=osd-merkur-256 flash +NF_01_WD= +NF_03_LB=Make Clean +NF_03_CM=make clean TARGET=osd-merkur-256 +NF_03_WD= +C++FT_00_LB=_Kompilieren +C++FT_00_CM=make TARGET=osd-merkur-256 +C++FT_00_WD= +C++FT_01_LB=_Erstellen +C++FT_01_CM=make TARGET=osd-merkur-256 flash +C++FT_01_WD= +filetypes=C++; + +[editor] +line_wrapping=false +line_break_column=72 +auto_continue_multiline=true + +[prjorg] +source_patterns=*.c;*.C;*.cpp;*.cxx;*.c++;*.cc;*.m; +header_patterns=*.h;*.H;*.hpp;*.hxx;*.h++;*.hh; +ignored_dirs_patterns=.*;CVS; +ignored_file_patterns=*.o;*.obj;*.a;*.lib;*.so;*.dll;*.lo;*.la;*.class;*.jar;*.pyc;*.mo;*.gmo; +generate_tag_prefs=0 +external_dirs= diff --git a/examples/osd/week-clock/flash.sh b/examples/osd/week-clock/flash.sh new file mode 100755 index 000000000..e82962073 --- /dev/null +++ b/examples/osd/week-clock/flash.sh @@ -0,0 +1,2 @@ +#!/bin/bash +make TARGET=osd-merkur-128 flash diff --git a/examples/osd/week-clock/project-conf.h b/examples/osd/week-clock/project-conf.h new file mode 100644 index 000000000..957c568ad --- /dev/null +++ b/examples/osd/week-clock/project-conf.h @@ -0,0 +1,89 @@ +/* + * Copyright (c) 2010, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * + */ + +#ifndef PROJECT_RPL_WEB_CONF_H_ +#define PROJECT_RPL_WEB_CONF_H_ + +#define PLATFORM_HAS_LEDS 1 +//#define PLATFORM_HAS_BUTTON 1 +#define PLATFORM_HAS_BATTERY 1 + + +#define LOOP_INTERVAL (30 * CLOCK_SECOND) + +/* Save energy */ +//#define RDC_CONF_PT_YIELD_OFF + +/* For Debug: Dont allow MCU sleeping between channel checks */ +//#undef RDC_CONF_MCU_SLEEP +//#define RDC_CONF_MCU_SLEEP 0 + +/* Disabling RDC for demo purposes. Core updates often require more memory. */ +/* For projects, optimize memory and enable RDC again. */ +//#undef NETSTACK_CONF_RDC +//#define NETSTACK_CONF_RDC nullrdc_driver +//#undef NETSTACK_CONF_MAC +//#define NETSTACK_CONF_MAC nullmac_driver + +/* Increase rpl-border-router IP-buffer when using more than 64. */ +//#undef REST_MAX_CHUNK_SIZE +//#define REST_MAX_CHUNK_SIZE 64 + +/* Estimate your header size, especially when using Proxy-Uri. */ +/* +#undef COAP_MAX_HEADER_SIZE +#define COAP_MAX_HEADER_SIZE 70 +*/ + +/* The IP buffer size must fit all other hops, in particular the border router. */ + +#undef UIP_CONF_BUFFER_SIZE +#define UIP_CONF_BUFFER_SIZE 256 + + +/* Multiplies with chunk size, be aware of memory constraints. */ +#undef COAP_MAX_OPEN_TRANSACTIONS +#define COAP_MAX_OPEN_TRANSACTIONS 4 + +/* Must be <= open transaction number, default is COAP_MAX_OPEN_TRANSACTIONS-1. */ +/* +#undef COAP_MAX_OBSERVERS +#define COAP_MAX_OBSERVERS 2 +*/ + +/* Filtering .well-known/core per query can be disabled to save space. */ +/* +#undef COAP_LINK_FORMAT_FILTERING +#define COAP_LINK_FORMAT_FILTERING 0 +*/ + + +#endif /* PROJECT_RPL_WEB_CONF_H_ */ diff --git a/examples/osd/week-clock/resources/res-led.c b/examples/osd/week-clock/resources/res-led.c new file mode 100644 index 000000000..fb0fa138f --- /dev/null +++ b/examples/osd/week-clock/resources/res-led.c @@ -0,0 +1,104 @@ +/* + * Copyright (c) 2013, Institute for Pervasive Computing, ETH Zurich + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the Contiki operating system. + */ + +/** + * \file + * Door resource + * \author + * Harald Pichler + */ + +#include "contiki.h" + +#include +#include "rest-engine.h" +#include "Arduino.h" + +static void res_get_handler(void *request, void *response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset); +static void res_post_put_handler(void *request, void *response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset); + +/* A simple getter example. Returns the reading from the sensor with a simple etag */ +RESOURCE(res_led, + "title=\"LED: , POST/PUT mode=on|off\";rt=\"Control\"", + res_get_handler, + res_post_put_handler, + res_post_put_handler, + NULL); + +extern uint8_t led_pin; +extern uint8_t led_status; + +static void +res_get_handler(void *request, void *response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + unsigned int accept = -1; + REST.get_header_accept(request, &accept); + + if(accept == -1 || accept == REST.type.TEXT_PLAIN) { + REST.set_header_content_type(response, REST.type.TEXT_PLAIN); + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "%d", led_status); + + REST.set_response_payload(response, buffer, strlen((char *)buffer)); + } else if(accept == REST.type.APPLICATION_JSON) { + REST.set_header_content_type(response, REST.type.APPLICATION_JSON); + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "{'led':%d}", led_status); + + REST.set_response_payload(response, buffer, strlen((char *)buffer)); + } else { + REST.set_response_status(response, REST.status.NOT_ACCEPTABLE); + const char *msg = "Supporting content-types text/plain and application/json"; + REST.set_response_payload(response, msg, strlen(msg)); + } +} + +static void +res_post_put_handler(void *request, void *response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + size_t len = 0; + const char *mode = NULL; + int success = 1; + + if(success && (len = REST.get_post_variable(request, "mode", &mode))) { + if(strncmp(mode, "on", len) == 0) { + digitalWrite(led_pin, LOW); + led_status=1; + } else if(strncmp(mode, "off", len) == 0) { + digitalWrite(led_pin, HIGH); + led_status=0; + } else { + success = 0; + } + } else { + success = 0; + } if(!success) { + REST.set_response_status(response, REST.status.BAD_REQUEST); + } +} diff --git a/examples/osd/week-clock/run.sh b/examples/osd/week-clock/run.sh new file mode 100755 index 000000000..5d5cbbbb4 --- /dev/null +++ b/examples/osd/week-clock/run.sh @@ -0,0 +1,5 @@ +#!/bin/bash +# For the ages-old bootloader (before 2014) you want to use +# BOOTLOADER_GET_MAC=0x0001f3a0 as parameter to make below. +make clean TARGET=osd-merkur-128 +make TARGET=osd-merkur-128 diff --git a/examples/osd/week-clock/sketch.pde b/examples/osd/week-clock/sketch.pde new file mode 100644 index 000000000..fa39f7201 --- /dev/null +++ b/examples/osd/week-clock/sketch.pde @@ -0,0 +1,55 @@ +/* + * Sample arduino sketch using contiki features. + * We turn the LED off + * We allow read the moisture sensor + * Unfortunately sleeping for long times in loop() isn't currently + * possible, something turns off the CPU (including PWM outputs) if a + * Proto-Thread is taking too long. We need to find out how to sleep in + * a Contiki-compatible way. + * Note that for a normal arduino sketch you won't have to include any + * of the contiki-specific files here, the sketch should just work. + */ + +extern "C" { +#include "arduino-process.h" +#include "rest-engine.h" +#include "net/netstack.h" +#include "xtime.h" +#include "cron.h" +#include "time_resource.h" +#include "jsonparse.h" + +extern resource_t res_led, res_battery, res_cputemp; + +uint8_t led_pin=4; +uint8_t led_status; +} + +void setup (void) +{ + // switch off the led + pinMode(led_pin, OUTPUT); + digitalWrite(led_pin, HIGH); + led_status=0; + // init coap resourcen + rest_init_engine (); + #pragma GCC diagnostic ignored "-Wwrite-strings" + rest_activate_resource (&res_led, "s/led"); + rest_activate_resource (&res_battery, "s/battery"); + rest_activate_resource (&res_cputemp, "s/cputemp"); + rest_activate_resource (&res_timestamp, "clock/timestamp"); + rest_activate_resource (&res_timezone, "clock/timezone"); + rest_activate_resource (&res_localtime, "clock/localtime"); + rest_activate_resource (&res_utc, "clock/utc"); + #pragma GCC diagnostic pop + + + // NETSTACK_MAC.off(1); + mcu_sleep_set(128); +} + +void loop (void) +{ + + +}