Scrolling Text sensor node with new V_TEXT
-
found this library for scrolling effect https://code.google.com/p/arudino-maxmatrix-library/.
-
Umm, this is awesome! Looks like I have a tinker project coming up!
-
Looks great. Is it posible (Or do you think it will be) to sen dynamic values to the display from Domoticz? Like the temperature or soil moist procentage.
-
Looks great. Is it posible (Or do you think it will be) to sen dynamic values to the display from Domoticz? Like the temperature or soil moist procentage.
@popunonkok it is very possible. In fact this is what I'm doing. You need to work on the controller side. For domoticz you can use a lua time script which sends new text every x time. For long messages you will need to script a fifo with multiple text messages.
-
Is it possible to send text to the node without a request call from the node itself?
The example is not clear on this point and the json example only sets the text value within Domoticz, right?
-
Is it possible to send text to the node without a request call from the node itself?
The example is not clear on this point and the json example only sets the text value within Domoticz, right?
@GertSanders Domoticz does not "push" the Text value when changed. The published sketch "asks" periodically for the Text value. What I do now is create a Switch (S_BINARY/ light) with function "New text available". This switch triggers the polling sequence.
-
@GizMoCuz : It would be nice to be able to define the text of the S_INFO sensor in de UI of Domoticz, instead of only via json. I'm not capable of programming that myself, but it would make the use of text easier. I already log all incoming SMS messages into my SMS connected sensor in V_TEXT and have it this way a nice view on what nodes are sending to my SMS passthrough node or what SMS messages are received into my MySensors network. I know Domoticz has it's own SMS interface, but my node is capable of switching on stuff based on directly received SMS commands, and with V_TEXT I can now follow what is happening without needing a serial connection to the node. I should be clear that I'm a big fan of Domoticz :-)
-
You can send messages as done here? http://forum.mysensors.org/topic/1957/lcd-clock-and-text-sensor-node-with-new-v_text

-
You can send messages as done here? http://forum.mysensors.org/topic/1957/lcd-clock-and-text-sensor-node-with-new-v_text

-
What am i missing, Because i get this when i try to compile it
Arduino:1.6.5 (Mac OS X), Kort:"Arduino Nano, ATmega328"
ScrollingText:55: error: 'V_TEXT' was not declared in this scope
ScrollingText.ino: In function 'void setup()':
ScrollingText:166: error: 'S_INFO' was not declared in this scope
ScrollingText:170: error: 'V_TEXT' was not declared in this scope
ScrollingText.ino: In function 'void loop()':
ScrollingText:191: error: 'V_TEXT' was not declared in this scope
ScrollingText.ino: In function 'void incomingMessage(const MyMessage&)':
ScrollingText:210: error: 'V_TEXT' was not declared in this scope
'V_TEXT' was not declared in this scope -
What am i missing, Because i get this when i try to compile it
Arduino:1.6.5 (Mac OS X), Kort:"Arduino Nano, ATmega328"
ScrollingText:55: error: 'V_TEXT' was not declared in this scope
ScrollingText.ino: In function 'void setup()':
ScrollingText:166: error: 'S_INFO' was not declared in this scope
ScrollingText:170: error: 'V_TEXT' was not declared in this scope
ScrollingText.ino: In function 'void loop()':
ScrollingText:191: error: 'V_TEXT' was not declared in this scope
ScrollingText.ino: In function 'void incomingMessage(const MyMessage&)':
ScrollingText:210: error: 'V_TEXT' was not declared in this scope
'V_TEXT' was not declared in this scope -
Okey, That can explain, Byt when i use the Dev Branch
I get this ErrorsScrollingText:52: error: 'MyTransportNRF24' does not name a type
ScrollingText:53: error: 'MySensor' does not name a type
ScrollingText.ino: In function 'void setup()':
ScrollingText:163: error: 'gw' was not declared in this scope
ScrollingText.ino: In function 'void loop()':
ScrollingText:177: error: 'gw' was not declared in this scope
'MyTransportNRF24' does not name a type -
Okey, That can explain, Byt when i use the Dev Branch
I get this ErrorsScrollingText:52: error: 'MyTransportNRF24' does not name a type
ScrollingText:53: error: 'MySensor' does not name a type
ScrollingText.ino: In function 'void setup()':
ScrollingText:163: error: 'gw' was not declared in this scope
ScrollingText.ino: In function 'void loop()':
ScrollingText:177: error: 'gw' was not declared in this scope
'MyTransportNRF24' does not name a type -
How to convert a sketch to 1.6 is described here (until it has been posted somewhere more sticky..) :
https://docs.google.com/document/d/1NKq5uuNdnxF5jWnum7VT32mbKLjuvqlx2A5D1qQ-H3Q/edit#heading=h.t5sdmpn6jz2iBasically a few search/replace... The above sketch would look something like this (untested)
/* PROJECT: MySensors / Scrolling Text display PROGRAMMER: AWI DATE: september 12, 2015/ last update: september 12, 2015 FILE: AWI_scroll_MAX.ino LICENSE: Public domain Hardware: tbd ..Ceech - ATmega328p board w/ NRF24l01 and MySensors 1.5 () Special: Need to use MySensors development edition SUMMARY: 3 S_xx devices for scrolling text - Displays a scrolling text from a "V_TEXT" variable - additional dimmer sensor for controlling display brightness - 'Alarm' switch. If "On", overrides the text display to display ALARM message - You can also input messages from the Serial monitor (testing) Uses excellent MD_MAX72XX library Remarks: Fixed node-id */ #define MY_RADIO_NRF24 // Use the MD_MAX72XX library to scroll text on the display with the use of the callback function // to control what is scrolled on the display text. // You need to set the used display in the library MD_MAX72XX.h // User can enter text on the serial monitor and this will display as a // Speed for the display is controlled by a pot on SPEED_IN analog in. #include <MD_MAX72xx.h> // multipurpose library for MAX72xx diaplay driver https://parola.codeplex.com/ #include <MySensor.h> // Mysensor network #include <SPI.h> #include <Time.h> //http://playground.arduino.cc/Code/Time #define USE_POT_CONTROL 0 // enable Scroll speed potentiometer #define PRINT_CALLBACK 0 // Macro to simplify serial print #define PRINT(s, v) { Serial.print(F(s)); Serial.print(v); } // Define the number of devices we have in the chain and the hardware interface // need to be adapted to your setup const int MAX_DEVICES = 8 ; // number of 8x8 displays const int CLK_PIN = 7 ; // SPI like clock const int DATA_PIN = 8 ; // SPI like data const int CS_PIN = 6 ; // SPI like select // Parola is able to use SPI hardware interface, not testted in combination with MySensors // MD_MAX72XX mx = MD_MAX72XX(CS_PIN, MAX_DEVICES); // now use Arbitrary pins MD_MAX72XX mx = MD_MAX72XX(DATA_PIN, CLK_PIN, CS_PIN, MAX_DEVICES); // instantiate one display chain // Scrolling parameters, you can attach normal potentiometer to A5, Vcc, Gnd #if USE_POT_CONTROL const int SPEED_IN = A5 ; #else const int SCROLL_DELAY = 20 ; // in milliseconds #endif // USE_POT_CONTROL const int CHAR_SPACING = 1 ; // pixels between characters // MySensors constants & variables const byte nodeId = 51 ; // MySensors fixed node id const byte messageCHILD = 8 ; // Text from ControllerLCD const byte brightnessChild = 9 ; // Brightness of display const byte alarmChild = 10 ; // Display Alarm text (overrides normal text) boolean timeReceived = false ; // Flag to indicate time received // Display constants & variables byte textBrightness = 1 ; // brightness of display (between 0 - MAX_INTENSITY (0xF) byte textOnOff = true ; // textOnOff = ! shutdown boolean textAlarm = false ; // Alarm (switch S_BINARY) // Global message buffers shared by MySensors and Scrolling functions const int BUF_SIZE = 25 ; // max payload for MySensors(NRF24l01) char curMessage[BUF_SIZE]; // current displayed message char newMessage[BUF_SIZE]; // next message to be displayed if available bool newMessageAvailable = false ; // new message available flag uint16_t scrollDelay; // in milliseconds // *** Definition and initialisation // define the MySensor network (1.5) // Initialize messages for sensor network MyMessage textMsg(messageCHILD, V_TEXT); // message for Sending Text to Controller /* MD_MAX72XX functions: can be found in the documentation for the library, * no need to customtize callback & scroll routines (unless you want to...) */ uint8_t scrollDataSource(uint8_t dev, MD_MAX72XX::transformType_t t) // Callback function for data that is required for scrolling into the display { static char *p = curMessage; static uint8_t state = 0; static uint8_t curLen, showLen; static uint8_t cBuf[8]; uint8_t colData; // finite state machine to control what we do on the callback switch(state) { case 0: // Load the next character from the font table showLen = mx.getChar(*p++, sizeof(cBuf)/sizeof(cBuf[0]), cBuf); curLen = 0; state++; // if we reached end of message, reset the message pointer if (*p == '\0') { p = curMessage; // reset the pointer to start of message if (newMessageAvailable) // there is a new message waiting { strcpy(curMessage, newMessage); // copy it in newMessageAvailable = false; } } // !! deliberately fall through to next state to start displaying case 1: // display the next part of the character colData = cBuf[curLen++]; if (curLen == showLen) // end of character insert interchar space { showLen = CHAR_SPACING; curLen = 0; state = 2; } break; case 2: // display inter-character spacing (blank column) colData = 0; curLen++; if (curLen == showLen) state = 0; break; default: state = 0; } return(colData); } // Callback (not used here) void scrollDataSink(uint8_t dev, MD_MAX72XX::transformType_t t, uint8_t col){ // Callback function for data that is being scrolled off the display #if PRINT_CALLBACK Serial.print("\n cb "); Serial.print(dev); Serial.print(' '); Serial.print(t); Serial.print(' '); Serial.println(col); #endif } // non-blocking text display to be used in loop (call frequently) void scrollText(void){ static uint32_t prevTime = 0; if (millis()-prevTime >= scrollDelay){ // Is it time to scroll the text? mx.transform(MD_MAX72XX::TSL); // scroll along - the callback will load all the data prevTime = millis(); // starting point for next time } } // sets the scroll delay (read from potentiometer if enabled) uint16_t getScrollDelay(void){ #if USE_POT_CONTROL uint16_t t = analogRead(SPEED_IN); t = map(t, 0, 1023, 25, 250); return(t); #else return(SCROLL_DELAY); #endif } void setup(){ // set up the display first mx.begin(); // initialize display chain mx.setShiftDataInCallback(scrollDataSource); // define function to get the scrolldata (returned as int8) //mx.setShiftDataOutCallback(scrollDataSink); // not used mx.control(MD_MAX72XX::INTENSITY, 0x01); #if USE_POT_CONTROL // initialize speed potentiometer if enabled pinMode(SPEED_IN, INPUT); #else scrollDelay = SCROLL_DELAY; #endif strcpy(curMessage, "I \x03 MySensors "); // first message on display newMessage[0] = '\0'; // new message initialized to empty // Setup MySensors //Serial in Sensor network = 115200 //Send the sensor node sketch version information to the gateway } void presentation() { sendSketchInfo("AWI Scroll MAX 51", "1.1"); present(messageCHILD, S_INFO, "Text line Scroll"); // new S_type 20150905 (not know by domoticz) present(alarmChild, S_BINARY, "Alarm display"); // to display alarm text present(brightnessChild, S_DIMMER, "Text brightness"); // new S_type 20150905 (not know by domoticz) //send(textMsg.set("-")); // initialize the V_TEXT at controller for sensor to none (trick for Domoticz) request(messageCHILD, V_TEXT, 0); // request value from controller // Initializations requestTime(); // get the time from controller (handled by receiveTime) } // loop only uses non-blocking functions void loop() { static unsigned long lastUpdate ; // Static hold the last update time unsigned long now = millis(); scrollDelay = getScrollDelay(); // update scroll delay from potentiometer readSerial(); // Check for new conditions & ask for new information from controller every 10 seconds if (now-lastUpdate > 10000){ if (textAlarm){ // if alarmstatus: override all text and set max intensity strcpy(curMessage, " ALARM "); mx.control(MD_MAX72XX::INTENSITY, MAX_INTENSITY); // set current brightness mx.control(MD_MAX72XX::SHUTDOWN, false) ; } else { // standard (non Alarm actions) mx.control(MD_MAX72XX::INTENSITY, textBrightness); // set current brightness mx.control(MD_MAX72XX::SHUTDOWN, textOnOff) ; request(messageCHILD, V_TEXT, 0); // request new value from controller } lastUpdate = now; } scrollText(); } // This is called when a new time value was received void receiveTime(unsigned long controllerTime) { Serial.print("Time value received: "); Serial.println(controllerTime); setTime(controllerTime); // time from controller timeReceived = true; } // This is called when a message is received void receive(const MyMessage &message) { Serial.print("Message: "); Serial.print(message.sensor); Serial.print(", Message: "); Serial.println(message.getString()); if (message.sensor == messageCHILD){ if (message.type==V_TEXT) { // Text content strcpy(newMessage, message.getString()); // copy it in newMessageAvailable = true ; } } else if (message.sensor == alarmChild) { if (message.type==V_STATUS) { // True/ false content textAlarm = message.getBool()?true:false ; // set alarmflag Serial.print("TextAlarm: "); Serial.println(textAlarm); } } else if (message.sensor == brightnessChild){ if (message.type==V_PERCENTAGE) { // Level 0..100 content textBrightness = map(message.getInt(),0, 100, 0, MAX_INTENSITY ) ; // map to brightnesslevel Serial.print("TextBrightness: "); Serial.println(textBrightness); } else if (message.type==V_STATUS) { // Display on/off textOnOff = message.getBool()?false:true ; // set shutdown/ !on/off Serial.print("Text on/off: "); Serial.println(textOnOff); } } } // Testing purposes: input routine character buffer. Reads serial characters in buffer newMessage. // sets flag newMessageAvailable to true if completed void readSerial(void) { static uint8_t putIndex = 0; while (Serial.available()) { newMessage[putIndex] = (char)Serial.read(); if ((newMessage[putIndex] == '\n') || (putIndex >= BUF_SIZE-3)) // end of message character or full buffer { // put in a message separator and end the string newMessage[putIndex++] = ' '; newMessage[putIndex] = '\0'; // restart the index for next filling spree and flag we have a message waiting putIndex = 0; newMessageAvailable = true; } else // Just save the next char in next location newMessage[putIndex++]; } } -
Okey... Strange because i test to compile that i Dev Branch and i get this error
Arduino:1.6.5 (Mac OS X), Kort:"Arduino Nano, ATmega328"Build options changed, rebuilding all
Scrolltext.ino: In function 'void presentation()':
Scrolltext:205: error: too many arguments to function 'void requestTime()'
In file included from /Users/Hoffan/Documents/Arduino-development/libraries/MySensors/MySensor.h:205:0,
from Scrolltext.ino:34:
/Users/Hoffan/Documents/Arduino-development/libraries/MySensors/core/MySensorCore.cpp:234:6: note: declared here
void requestTime() {
^
too many arguments to function 'void requestTime()'